ó
­xTc           @   s   d  d l  m Z d  d l Z d  d l m Z d  d l Z e j j d  Z	 d a d   Z d d d  Z d e f d     YZ d S(	   i’’’’(   t   divisionN(   t   SorrysW   
max_rmsd = None
  .type = float
sigma = 5.0
  .type = float
slack = 0
  .type = float
c          C   s2   t  d  k r. d d l m }  |  j t  a  n  d  S(   Ni’’’’(   t   sidechain_angles(   t
   rotamer_dbt   Nonet   mmtbx.rotamerR   t   SidechainAnglest   False(   R   (    (    sO   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/geometry_restraints/rotamer.pyt   load_sidechain_properties   s    c         C   s  | d  k r t j } n  d d l m } d d  l } d d  l } | j j d  } | j |   } | j	   } x| D]}	 |	 j
 }
 |
 d k r d }
 n  d } d g d } d } xk |	 j D]` } | j | d k rŲ Pn  x- t d	  D] } | j | | | d	 | <qå W| d 7} | j } q» W| j d
 |
 d | d | d d	 !d | d	 d !d | d d !d | d d ! } | j |  qt W| d IJ| d | j   IJ| S(   Ni’’’’(   R   t   mmtbx_rotamer_restraints_extt   MSEt   METi    i   i   i   t   residue_namet   n_anglest   chi1t   chi2i   t   chi3i   t   chi4t    s"     %d rotamer restraints generated.(   R   t   syst   stdoutR   R   t   boost.pythont   pythont
   import_extt   collect_sidechain_chi_anglest   shared_rotamer_proxyR   t   chist   chi_idt   ranget   i_seqst   rotamer_proxyt   appendt   size(   t   pdb_hierarchyt   atom_selectiont   logR   t   mmtbxt   boostt   extt   residuest   proxiest   residue_infoR   R   R   t   last_chit   chit   kt   proxy(    (    sO   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/geometry_restraints/rotamer.pyt   extract_proxies   sB     		
	
t   managerc           B   s2   e  Z d d d   Z d d  Z e d d  Z RS(   c         C   s   | d  k r! t j   j   } n  | j d  k s? | j d  k rN t d   n  | |  _ | |  _ t	 | d | |  _
 d  |  _ d  S(   Ns:   Rotamer restraint sigma and slack must be decimal numbers.R#   (   R   t   master_philt   fetcht   extractt   sigmat   slackR   t   paramsR!   R.   t   rotamer_proxiest   _proxy_indices(   t   selfR!   R5   R#   (    (    sO   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/geometry_restraints/rotamer.pyt   __init__>   s    		c         C   s·  | d  k r t j } n  g  |  _ g  |  _ t g   } |  j j   } xk|  j D]`} | j	 d k rz |  j j
 d   qO n  d  g d } t g d } x t |  D] \ } }	 | | k ræ q” n  | j |	  }
 |
 d k r” | | t |
  d <| j |  |
 d k  rt | t |
  d <n  d  | k r1Pq1q” q” W| j d   d | j	 } | d k r| j   } | d | | | j   d d !f IJn  |  j j
 |  |  j j
 |  qO Wd  S(   Ni    i   i   s2       warning: can't find %d dihedral proxies for %si	   i’’’’(   R   R   R   R7   t   _invert_signst   setR!   t   atomsR6   R   R   R   t	   enumeratet   find_dihedral_proxyt   abst   addt   Truet   countt   first_i_seqt   id_str(   R8   t   dihedral_proxiesR#   t   have_proxiesR<   R-   t   chi_proxiest   invertt   j_seqt   dihedral_proxyR   t	   n_missingRC   (    (    sO   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/geometry_restraints/rotamer.pyt   cross_reference_proxiesH   s<     		!c         C   sń  d } | d  k r t j } n  |  j } t   |  j j   } |  j d  k r\ |  j |  n  t	 |  j
  t	 |  j  k s t  | d IJd | j d } xAt |  j
  D]0\ }	 }
 |
 j d k s« |  j |	 j d   d k rč q« n  t j |
 j  } | d  k r| d |
 j IJq« n  t j } d  } d  } x | j   D]~ \ } } | } t	 |  d k  r| j d g d t	 |   n  |
 j d | d |  } | | k  r?| } | } | } q?q?W| d  k rŽ| d	 t IJq« | j d  k	 r	| | j k r	| d
 IJq« | } xÉ t |  j |	  D]“ \ } } | d  k rAq#n  | | } | r| j d } | | } | d | j   d d !| | f IJt } n  |  j |	 | r·| | | _ n | | | _ | | _ | d 7} q#Wq« W| d | IJ| S(   Ni    s/    Updating dihedral proxies from rotamer libraryi   i   i   s     skipping residue %st   anglest
   sites_carts"     can't find angles for residue %ss     lowest RMSD exceeds maxs     %s : %s (rmsd=%.3f)i	   i’’’’s    %d proxies modified.(   R   R   R   R5   R   R!   R<   R7   RL   t   lenR6   t   AssertionErrorR3   R=   R   RB   R   t   get_rotamersR   t   maxintt	   iteritemst   extendt   get_rotamer_rmsdt   resnamet   max_rmsdR   RD   R   R:   t   angle_idealt   weight(   R8   RN   RE   t   verboseR#   t	   n_updatesR5   t	   pdb_atomsRY   R,   R-   t   rotamerst	   best_rmsdt   best_anglest   best_rotamert   rotamerRM   t   angles_t   rmsdt   print_rotamerR   RI   RJ   RC   t   atom(    (    sO   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/geometry_restraints/rotamer.pyt   update_dihedral_proxiesg   sl    	$
+	!		 

		N(   t   __name__t
   __module__R   R9   RL   RA   Rf   (    (    (    sO   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/geometry_restraints/rotamer.pyR/   =   s   
"(   t
   __future__R    t   libtbx.philt   libtbxt   libtbx.utilsR   R   t   philt   parseR0   R   R   R   R.   t   objectR/   (    (    (    sO   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/geometry_restraints/rotamer.pyt   <module>   s   			"