ó
¹™xTc           @   sâ   d  d l  m Z d  d l Z d  d l m Z d  d l Z d  d l m Z d  d l	 Z
 d  d l m Z d  d l Z d  d l Z d  d l Z e d „ Z d d d „  ƒ  YZ d	 d d
 „  ƒ  YZ d „  Z d d „ Z d e d „ Z d S(   iÿÿÿÿ(   t   divisionN(   t   Sorry(   t
   group_args(   t   flexc         C   sG   t  j j t j j d d ƒ ƒ } | d  k rC |  rC t d ƒ ‚ n  | S(   Nt   mmtbxt   rotamers/   Can't seem to find mmtbx/rotamer/ directory.
  (   t   libtbxt   envt   find_in_repositoriest   ost   patht   joint   NoneR   (   t   optionalt   result(    (    sL   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/rotamer/sidechain_angles.pyt   find_source_dir   s
    !t   PropertyFilec           B   s   e  Z d  „  Z d „  Z RS(   c         C   s   i  |  _  d  S(   N(   t
   properties(   t   self(    (    sL   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/rotamer/sidechain_angles.pyt   __init__   s    c         C   s²   y t  | ƒ } Wn& t k
 r8 } | d GHt j ƒ  n Xxh | D]` } | j d ƒ s@ | d k rg q@ q@ | j d ƒ } | d j ƒ  j d ƒ |  j | d j ƒ  <q@ W| j ƒ  d  S(   Ns    file not foundt   #s   
t   =i   s   "i    (	   t   opent   ImportErrort   syst   exitt
   startswitht   splitt   stripR   t   close(   R   t   fileLoct   ft   et   linet   props(    (    sL   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/rotamer/sidechain_angles.pyt   process   s    	 .(   t   __name__t
   __module__R   R#   (    (    (    sL   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/rotamer/sidechain_angles.pyR      s   	t   SidechainAnglesc           B   st   e  Z i  Z i  Z i  Z i  Z i  Z i  Z i  Z d  „  Z	 d „  Z
 d „  Z d d d „ Z d d „ Z d d „ Z RS(   c         C   s”  | |  _  t ƒ  } t ƒ  } | j t j j | d ƒ ƒ xV| j d j d ƒ D]>} i  |  j	 | <| j | d |  j
 | <| j | d j d ƒ } | j | d j d ƒ } | |  j | <d } xq| D]i} | d k r&| d	 | }	 | j |	 j d ƒ |  j |	 <| j |	 }
 | d
 k r>| d k r>|
 j d d ƒ }
 nZ | d k rk| d k rk|
 j d d ƒ }
 n- | d k r˜| d k r˜|
 j d d ƒ }
 n  | |  j	 | |
 <| d k sÙ| d
 k sÙ| d k sÙ| d k r&| t | j | d ƒ k  r#|	 d } | j | j d ƒ |  j |	 <q#q&n  | d 7} qÇ W| |  j | <xH | D]@ } | d k rH| d	 | }	 | j |	 j d ƒ |  j |	 <qHqHWqN Wd  S(   Ns   sidechain_angles.propst
   aminoacidst   ,s   .chiss   .angless	   .rotamersi    t    t   .t   valt   chi1t   CG1t   CG2t   thrt   OG1t   ilet   leut   argt   _atomsi   t    (   t   show_errorsR   R   R#   R	   R
   R   R   R   t   resAtomsToChit	   chisPerAAt   anglesForAAt   atomsForAnglet   replacet   intt   atomsMoveWithAnglet   rotamersForAAt   anglesForRot(   R   t	   show_errst
   source_dirR   t   aat	   anglelistt   rotamerlistt   chi_ctrt   anglet   keyt	   chi_atomst   key2R   (    (    sL   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/rotamer/sidechain_angles.pyR   2   sB    			0
&c         C   s“   i  } | j  ƒ  } | |  j k r% d  S|  j j | ƒ } xU | D]M } | d k r> | d | } g  |  j | D] } t | ƒ ^ ql | | <q> q> W| S(   NR)   R*   (   t   lowerR>   R   t   getR?   t   float(   R   t   residue_namet   rotamersRB   t   rotamer_listR   RG   t   x(    (    sL   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/rotamer/sidechain_angles.pyt   get_rotamers\   s    1c         C   sj   g  } | j  ƒ  } | d | } |  j j | ƒ } | d  k rB d  Sx! | D] } | j t | ƒ ƒ qI W| S(   NR*   (   RJ   R?   RK   R   t   appendRL   (   R   RM   t   rotamer_namet   return_anglesRB   RG   t   anglesRF   (    (    sL   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/rotamer/sidechain_angles.pyt   get_rotamer_anglesh   s    c   	      C   sÜ   | j  j ƒ  j ƒ  } t j j } | | j  ƒ d k rÔ yq t |  j | ƒ } g  } xM t | ƒ D]? } | j	 |  j
 d d t | d ƒ d | d | d | ƒ ƒ q_ W| SWqØ t k
 rÐ |  j rÌ | d GHn  d  SXn d  Sd  S(	   Nt   common_amino_acidt	   angleNamet   chii   t   rest	   atom_dictt
   sites_carts    is an unknown residue type(   t   resnameRJ   R   t   iotbxt   pdbt   common_residue_names_get_classR<   R8   t   rangeRR   t   measureAnglet   strt   KeyErrorR6   R   (	   R   RZ   R[   R\   t   resNamet	   get_classt   numChist   valuest   i(    (    sL   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/rotamer/sidechain_angles.pyt   measureChiAngless   s$    	 c         C   s�   |  j  d | d | d | ƒ } | d  k r. d  S| d  k rY g  | D] } | j ^ qA } n+ g  } x" | D] } | j | | j ƒ qf Wt j j d | d t ƒ S(   NRX   RZ   R[   t   sitest   deg(	   t   extract_chi_atomsR   t   xyzRR   t   i_seqt   scitbxt   matht   dihedral_anglet   True(   R   RX   RZ   R[   R\   t
   angleAtomst   aRk   (    (    sL   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/rotamer/sidechain_angles.pyRb   •   s    		c         C   sï   d  } | d  k r! t | ƒ } n | } |  j | j j ƒ  j ƒ  d | } g  } x— | D]� } | j d ƒ } d  }	 d }
 x? |	 d  k rº |
 t | ƒ k  rº | j | |
 ƒ }	 |
 d 7}
 q| W|	 d  k rã | j	 | j |	 j
 ƒ ƒ qX d  SqX W| S(   NR*   t   ;i    i   (   R   t   makeAtomDictR:   R]   RJ   R   R   t   lenRK   RR   t   name(   R   RX   RZ   R[   t   atomNamesMapt	   atomNamesRt   t   att   namelistt   testAtomt   j(    (    sL   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/rotamer/sidechain_angles.pyRm   ¥   s"    $!N(   R$   R%   R8   R9   R:   R>   R?   R=   R7   R   RQ   RV   R   Rj   Rb   Rm   (    (    (    sL   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/rotamer/sidechain_angles.pyR&   '   s   	*		c         C   s.   i  } x! |  j  ƒ  D] } | | | j <q W| S(   N(   t   atomsRy   (   RZ   Rz   t   atom(    (    sL   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/rotamer/sidechain_angles.pyRw   º   s    c         C   sH  t  t ƒ } g  } | d  k	 rB t | t j ƒ rB | j ƒ  } qB n  | d  k r{ t j t |  j ƒ  j	 ƒ  ƒ t
 ƒ j ƒ  } n  xÆ|  j ƒ  D]¸} x¯| j ƒ  D]¡} x˜| j ƒ  D]Š} x�| j ƒ  D]s} | j j | j j ƒ  d ƒ } y t | ƒ } Wn t k
 rqÁ n Xg  }	 | j ƒ  d j ƒ  j }
 g  } xx t d | d ƒ D]c } | j d | | ƒ } | d  k rpqEg  | D] } | j ^ qw} |	 j t d | d | ƒ ƒ qEWt
 } x$ | D] } | | k r¹t } Pq¹q¹Wt |	 ƒ d k rÁ | rÁ t d | j d | j d |
 d	 | j ƒ  d
 |	 ƒ } | j | ƒ qÁ qÁ Wq® Wq› Wqˆ W| S(   Ni    i   s   chi%dt   chi_idt   i_seqsRM   t   chain_idt   altloct   residt   chis(   R&   t   FalseR   t
   isinstanceR   t   boolt
   iselectionRx   R€   t   extract_xyzRs   t   modelst   chainst
   conformerst   residuesR8   RK   R]   RJ   R<   t
   ValueErrort   fetch_labelsR…   Ra   Rm   Ro   RR   R   t   idR†   (   t   pdb_hierarchyt   atom_selectiont   angle_lookupt   residue_chist   modelt   chaint	   conformert   residuet   n_chiR‡   R…   Rƒ   Ri   R€   R�   t   atoms_in_selectionRo   t   residue_info(    (    sL   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/rotamer/sidechain_angles.pyt   collect_sidechain_chi_anglesÀ   sR     			 c         C   s§  t  j j } g  } t d |  d | ƒ } | } | d  k	 r] t | t j ƒ r] | j ƒ  } q] n  | d  k r– t j t	 |  j
 ƒ  j ƒ  ƒ t ƒ j ƒ  } n  d  } d  } xþ|  j ƒ  D]ð} xç| j ƒ  D]Ù}	 xÐ|	 j ƒ  D]Â}
 x¹t |
 j ƒ  ƒ D]¥\ } } | | j ƒ d k rqî n  | t	 |
 j ƒ  ƒ d k  rH|
 j ƒ  | d } n d  } g  } d  } d  } d  } x\ | j
 ƒ  D]N } | j d k r‘| } qs| j d k r©| } qs| j d k rs| } qsqsW| d  k sî | d  k sî | d  k rïqî n  | s| d  k	 rd  } d  } xD | j
 ƒ  D]6 } | j d k r8| } q| j d k r| } qqW| d  k	 r| d  k	 rt } x2 | | | | g D] } | j | k r…t } q…q…W| rt j j | | | | ƒ } | d  k	 r| j | j | j | j g } | j t d d	 d
 | ƒ ƒ qqqn  | d  k	 rd  } x, | j
 ƒ  D] } | j d k r9| } q9q9W| d  k	 rt } x2 | | | | g D] } | j | k r€t } q€q€W| rt j j | | | | ƒ } | d  k	 r| j | j | j | j g } | j t d d d
 | ƒ ƒ qqqn  | d  k	 rd  } x, | j
 ƒ  D] } | j d k r4| } q4q4W| d  k	 rt } x2 | | | | g D] } | j | k r{t } q{q{W| rt j j | | | | ƒ } | d  k	 r
| j | j | j | j g } | j t d d d
 | ƒ ƒ q
qqqn  | j
 ƒ  d j ƒ  j } t } t	 | ƒ d k r�| r�t d | j d |	 j d | d | j  ƒ  d | ƒ } | j | ƒ n  | } qî WqÕ WqÂ Wq¯ W| S(   NR”   R•   RW   i   s    N  s    CA s    C  R‚   t   omegaRƒ   t   phit   psii    RM   R„   R…   R†   R‡   (!   R^   R_   R`   RŸ   R   R‰   R   RŠ   R‹   Rx   R€   RŒ   Rs   R�   RŽ   R�   t	   enumerateR�   R]   Ry   Ro   Rˆ   R   R   t   omega_from_atomsRR   R   t   phi_from_atomst   psi_from_atomsR’   R…   R“   R†   (   R”   R•   t   chi_angles_onlyRf   t   residue_torsionsR—   t   previous_residuet   next_residueR˜   R™   Rš   t   i_resR›   t   torsionst   curNt   curCAt   curCR�   t   prevCAt   prevCR�   R    Rƒ   R¡   t   nextNR¢   R…   Rž   (    (    sL   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/rotamer/sidechain_angles.pyt   collect_residue_torsion_anglesì   sÖ    			$	((+!			(    (    (   t
   __future__R    t   scitbx.mathRp   t   libtbx.utilsR   t   libtbx.load_envR   R   t	   iotbx.pdbR^   t   cctbx.array_familyR   t   mmtbx.rotamerR   R   R	   Rˆ   R   R   R&   Rw   R   RŸ   R³   (    (    (    sL   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/rotamer/sidechain_angles.pyt   <module>   s   “	-