ó
¸™xTc           @   sØ   d  d l  m Z d  d l Z d  d l m Z d  d l Z d „  Z d „  Z d „  Z d „  Z	 d „  Z
 d	 „  Z d
 „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d d „ Z d „  Z e d k rÔ e ƒ  d GHn  d S(   iÿÿÿÿ(   t   divisionN(   t
   group_argsc         C   s=   d  |  | | | g k s t ‚ t |  j | j | j | j ƒ S(   N(   t   Nonet   AssertionErrort   phi_from_sitest   xyz(   t   thisNt   thisCt   thisCAt   thisCB(    (    sD   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/rotamer/__init__.pyt   improper_ncab_from_atoms   s    c         C   s=   d  |  | | | g k s t ‚ t |  j | j | j | j ƒ S(   N(   R   R   R   R   (   R   R   R   R	   (    (    sD   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/rotamer/__init__.pyt   improper_cnab_from_atoms   s    c         C   s=   d  |  | | | g k s t ‚ t |  j | j | j | j ƒ S(   N(   R   R   R   R   (   t   prevCAt   prevCR   R   (    (    sD   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/rotamer/__init__.pyt   omega_from_atoms   s    c   	      C   sæ   d \ } } } } } x- |  j ƒ  D] } | j d k r" | } Pq" q" Wx\ | j ƒ  D]N } | j d k rp | } qR | j d k rˆ | } qR | j d k rR | } qR qR Wx, | j ƒ  D] } | j d k r± | } q± q± W| | | | | f S(   Ns    C  s    N  s    CA (   NNNNN(   R   t   atomst   name(	   t   prev_rest   residuet   next_rest   c1t   n2t   ca2t   c2t   n3t   atom(    (    sD   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/rotamer/__init__.pyt   get_phi_psi_atoms   s     		c         C   sÂ   d \ } } } } |  d  k	 rb xA |  D]6 } | j d k rC | } n  | j d k r% | } q% q% Wn  | d  k	 r² xA | D]6 } | j d k r“ | } n  | j d k ru | } qu qu Wn  | | | | f S(   Ns    CA s    C  s    N  (   NNNN(   R   R   (   t
   prev_atomsR   R   R   R   R   R   (    (    sD   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/rotamer/__init__.pyt   get_omega_atoms%   s     	  	 c         C   sk   t  |  | ƒ \ } } } } d  | | | | g k rg t | | | | ƒ } | d k rg | d k  rg t Sn  t S(   Niâÿÿÿi   (   R   R   R   t   Truet   False(   R   R   R   R   R   R   t   omega(    (    sD   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/rotamer/__init__.pyt   is_cis_peptide1   s    c         C   sr   t  d |  d | d | ƒ \ } } } } } d  | | | | | g k rg | j | j | j | j | j g Sd  g d S(   NR   R   R   i   (   R   R   t   i_seq(   R   R   R   R   R   R   R   R   (    (    sD   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/rotamer/__init__.pyt   get_phi_psi_indices9   s    "c         C   s=   d  |  | | | g k s t ‚ t |  j | j | j | j ƒ S(   N(   R   R   R   R   (   R   t   resNt   resCAt   resC(    (    sD   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/rotamer/__init__.pyt   phi_from_atomsB   s    c         C   sx   d d l  m } | j d |  | g d d d d ƒ } | j d k rG d  S| j d |  | | | g d d	 d d ƒ } | j S(
   Niÿÿÿÿ(   t   geometry_restraintst   sitest   distance_ideali   t   weighti   t   angle_idealiØÿÿÿ(   t   cctbxR'   t   bondt   distance_modelR   t   dihedralt   angle_model(   R   R#   R$   R%   R'   t   bt   d(    (    sD   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/rotamer/__init__.pyR   F   s    		 		c         C   s=   d  |  | | | g k s t ‚ t |  j | j | j | j ƒ S(   N(   R   R   t   psi_from_sitesR   (   R#   R$   R%   t   nextN(    (    sD   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/rotamer/__init__.pyt   psi_from_atomsT   s    c         C   sx   d d l  m } | j d | | g d d d d ƒ } | j d k rG d  S| j d |  | | | g d d	 d d ƒ } | j S(
   Niÿÿÿÿ(   R'   R(   R)   i   R*   i   R+   iØÿÿÿ(   R,   R'   R-   R.   R   R/   R0   (   R#   R$   R%   R4   R'   R1   R2   (    (    sD   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/rotamer/__init__.pyR3   X   s    		 		c         C   s°   d  |  k r t |  ƒ d k s$ t ‚ t d | |  d d | |  d d | |  d d | |  d	 ƒ } t d | |  d d | |  d d | |  d	 d
 | |  d ƒ } | | f S(   Ni   R   i    R#   i   R$   i   R%   i   R4   i   (   R   t   lenR   R   R3   (   t   i_seqst
   sites_cartt   phit   psi(    (    sD   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/rotamer/__init__.pyt   phi_psi_from_sitese   s    $c         C   s  d d l  m } d d l m } | d  k r] d d l m } | j |  j ƒ  j	 ƒ  t
 ƒ } n  g  } x|  j ƒ  D]} xþ| j ƒ  D]ð} xç| j ƒ  D]Ù} | j ƒ  }	 xÄt |	 ƒ D]¶\ }
 } d } | j | k rÜ qµ n  d \ } } | j ƒ  } d \ } } |
 d k rG|	 |
 d j ƒ  } | | d k r6qµ n  |	 |
 d } n  |
 t |	 ƒ d k  r˜|	 |
 d j ƒ  } | | d k r‡qµ n  |	 |
 d } n  | d  k	 rµ | d  k	 rµ t | | | ƒ \ } } } } } d  | | | | | g k ròqµ n  | j ƒ  j } | j | j | j | j | j g } g  | D] } | | ^ q,} t | k rTqµ n  | j d | j | j g d	 d d
 d ƒ } | j d | j | j g d	 d d
 d ƒ } | j d k sµ | j d k rÌqµ n  | j } | d k rêd } n; | d k rÿd } n& |	 |
 d j d k rd } n d } t d | d | d | j d | d | j ƒ  d | ƒ } | j | ƒ qµ qµ Wq– Wqƒ Wqp W| S(   Niÿÿÿÿ(   t   one_letter_given_three_letter(   R'   (   t   flext    i    i   R(   R)   R*   i   t   PROt   prot   GLYt   glyt   preprot   alat   residue_namet   residue_typet   chain_idt   altloct   residR7   (   NN(   NN(   t   iotbx.pdb.amino_acid_codesR<   R,   R'   R   t   scitbx.array_familyR=   t   boolR   t   sizeR   t   modelst   chainst
   conformerst   residuest	   enumeratet   resnamet   resseq_as_intR6   R   t   fetch_labelsRH   R!   R   R-   R   R.   R   t   idRI   t   append(   t   pdb_hierarchyt   atom_selectionR<   R'   R=   t   rama_anglest   modelt   chaint	   conformerRQ   t   iR   RH   R   R   t   resseq2t   resseq1t   resseq3R   R   R   R   R   R7   R!   t   is_selectedt   pep1t   pep2RE   RF   t   phi_psi(    (    sD   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/rotamer/__init__.pyt   extract_phi_psis   s€    !$										 c          C   sÖ   t  j j d d d t j j ƒ }  |  d  k r6 d GHd  Sd d l m } | j	 |  d d ƒj
 } | j ƒ  } | j ƒ  } | j ƒ  t | ƒ } t | ƒ d	 k s¤ t ‚ | d
 j } | d d d d d g k sÒ t ‚ d  S(   Nt   relative_paths   phenix_regression/pdb/1ywf.pdbt   tests"   PDB file not found, skipping test.iÿÿÿÿ(   t   file_readert
   force_typet   pdbií   i;   iÉ  iÒ  iÓ  iÔ  iÝ  (   t   libtbxt   envt   find_in_repositoriest   ost   patht   isfileR   t   iotbxRi   t   any_filet   file_objectt   construct_hierarchyR   t   reset_i_seqRf   R6   R   R7   (   t	   file_nameRi   t   pdb_int	   hierarchyR   t   anglesR7   (    (    sD   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/rotamer/__init__.pyt   exerciseº   s    
t   __main__t   OK(   t
   __future__R    t   libtbx.load_envRl   R   Ro   R
   R   R   R   R   R    R"   R&   R   R5   R3   R;   R   Rf   R{   t   __name__(    (    (    sD   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/rotamer/__init__.pyt   <module>   s(   													G	