ó
 ™xTc        	   @   sÌ   d  d l  m Z d  d l Z d  d l Z d  d l m Z d  d l m Z d „  Z d „  Z	 e
 d d „ Z d d e d d	 „ Z d d d d
 e d e d d „ Z d „  Z e d k rÈ e e j d ƒ n  d S(   iÿÿÿÿ(   t   divisionN(   t   rdl_database(   t   rotalyzec   	      C   sr   |  j  t j ƒ  k r d  S|  j  d	 k r, d  St j d |  d | d | d | d | d | ƒ \ } } } | | | f S(
   Nt   PROt   GLYt
   atom_groupt   sidechain_anglest   rotamer_evaluatort
   rotamer_idt   all_dictt
   sites_cart(   R   R   (   t   resnameR   t   keyst   NoneR   t   evaluate_rotamer(	   R   t   saR   R   R	   R
   t	   model_rott   m_chist   value(    (    s[   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/conformation_dependent_library/rotamers.pyt   get_rotamer_data
   s      	c           C   s   d  S(   N(   R   (    (    (    s[   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/conformation_dependent_library/rotamers.pyt   setup_restraints   s    t   500c         c   sk   t  j  d |  d | ƒ } xL | j D]A } | r= | j r= q" n  | j | j ƒ  | j | j | j f Vq" Wd  S(   Nt   pdb_hierarchyt   data_version(   R   t   resultst   outlierR   t   id_strt   chain_idt   altloct   rotamer_name(   R   t   exclude_outliersR   t   rt   rot(    (    s[   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/conformation_dependent_library/rotamers.pyt   generate_rotamer_data    s    	 	c      
      s·  d s t  ‚ | d  k r$ t j } n  t j ƒ  } | d IJ‡  ‡ f d †  } d  } | d  k rs | |  ƒ \ } } n  d }	 ˆ rŽ |  j ƒ  }
 n  xö | j D]ë } | j | k r˜ ˆ r"d | j | j | j	 |
 | j d j
 ƒ  d d !|
 | j d j
 ƒ  d d !|
 | j d j
 ƒ  d d !f GHn  | | j d | _ d | | j d d | _	 ˆ rvd	 | j | j | j	 f GHn  |	 d 7}	 q˜ q˜ W| d
 |	 IJ| d t j ƒ  | IJ| | f S(   Ni    s     Rotamer Conformation Libraryc      
      sÜ  i  } g  } g  } xÊ t  d |  d ˆ  ƒ D]³ } | \ } } } } }	 | t k rU q( n  |	 t | k rk q( n  ˆ rŒ d | | | | |	 f GHn  t | |	 }
 t | d } | | | |
 | f | | <| j | ƒ | j | ƒ q( Wi  } i  } xä|  j ƒ  D]Ö} xÍ| j ƒ  D]¿} | j j ƒ  | k r,qn  x›| j ƒ  D]�} x„| j ƒ  D]v} | j	 | k rgqLn  xX| j
 ƒ  D]J\ } } | \ } } } }
 } | j ƒ  | j k r°qtn  | j ƒ  | j	 j ƒ  k rÑqtn  | j ƒ  | j j ƒ  k ròqtn  xÉ |
 j
 ƒ  D]» \ } } g  } xT | D]L } xC | j ƒ  D]5 } | j ƒ  | j j ƒ  k r+| j | j ƒ Pq+q+WqW| | t | ƒ <| | | t | ƒ <| j ƒ  | | t | ƒ <| | | t | ƒ <qÿWqtWqLWq9WqWqø W| | f S(   NR   R   s+   resn %s chain %s id %s altloc %s rotamer %st   default(   R!   R   t   appendt   modelst   chainst   idt   stript
   conformerst   residuesR   t   itemsR   t   atomst   namet   i_seqt   tuplet   reverse(   R   t   name_restraintsR%   R)   t   itemR   R   t   chainR   t   rotamert
   restraintst   defaultst   i_seqs_restraintst   i_seqs_restraints_reversalt   modelt	   conformert   residuet   valuesR   t   namest   i_seqsR,   t   atom(   R   t   verbose(    s[   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/conformation_dependent_library/rotamers.pyt   _get_i_seqs_restraints@   sp           
,s-    i_seqs %-15s initial %12.3f %12.3f :%s-%s-%si   iôÿÿÿi   i   s#    i_seqs %-15s final   %12.3f %12.3fs&       Number of angles RDL adjusted : %ds)       Time to adjust                : %0.3f(   t   AssertionErrorR   t   syst   stdoutt   timeR+   t   angle_proxiesR=   t   angle_idealt   weightt   quote(   R   t   geometry_restraints_managerR6   t   logR?   R   t   t0R@   R7   t   countR+   t   angle_proxy(    (   R   R?   s[   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/conformation_dependent_library/rotamers.pyt   adjust_rotamer_restraints5   sD     
A $ g      ð?c
   &         s  d d l  m }
 d d l m } d d l m } t ‡  f d † } t ‡  f d † } t j ƒ  } |
 t ƒ } | j ƒ  } | j	 d |	 ƒ } d  } | r¥ | j ƒ  } n  | d  k rº g  } n  i  } i  } xë|  j ƒ  D]Ý} | rî d | j GHn  x¿| j ƒ  D]±} | rd	 | j GHn  x“| j ƒ  D]…} | j | ƒ } xm| j ƒ  D]_} t | | | | d
 | d | ƒ} | d  k r~qEn  | \ } } } | t | j k r¦qEn  t | j | } t | j d } | j | j ƒ  ƒ xÆ | j ƒ  D]¸ \ }  }! g  }" | r|  d d k rqèn  xT |  D]L }# xC | j ƒ  D]5 }$ |# j ƒ  |$ j j ƒ  k r0|" j |$ j ƒ Pq0q0WqW|! | t |" ƒ <|  | k rè| |  | t |" ƒ <qèqèWqEWq#Wqû WqÓ W| | | ƒ }% | | | ƒ }% | | | ƒ }% | | | ƒ }% | d |% IJ| d t j ƒ  | IJ| S(   Niÿÿÿÿ(   t   SidechainAngles(   t   rotamer_eval(   R   c            s²   d } x¥ |  j  D]š } | j | k r | rI d | j | j | j f GHn  | | j d | _ ˆ  | | j d d | _ | r� d | j | j | j f GHn  | d 7} q q W| S(   Ni    s#    i_seqs %-15s initial %12.3f %12.3fi   i   s#    i_seqs %-15s final   %12.3f %12.3f(   RE   R=   RF   RG   (   t   geometryt   lookupR?   RL   RM   (   t
   esd_factor(    s[   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/conformation_dependent_library/rotamers.pyt   _set_or_reset_angle_restraints®   s"      c            sÒ   d } xÅ |  j  D]º } | j | k r | rO d | j | j | j | j f GHn  | | j d | _ ˆ  | | j d d | _ | | j d | _ | r½ d | j | j | j | j f GHn  | d 7} q q W| S(   Ni    s&    i_seqs %-15s initial %12.3f %12.3f %di   i   s&    i_seqs %-15s final   %12.3f %12.3f %d(   t   dihedral_proxiesR=   RF   RG   t   periodicity(   RQ   RR   R?   RL   RM   (   RS   (    s[   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/conformation_dependent_library/rotamers.pyt!   _set_or_reset_dihedral_restraintsÄ   s(      R   s   model: "%s"s   chain: "%s"R	   R
   R"   i   t   Nt   CAt   Cs&       Number of angles RDL adjusted : %ds)       Time to adjust                : %0.3f(   RX   RY   RZ   (   t   mmtbx.rotamer.sidechain_anglesRO   t   mmtbx.rotamerRP   t   mmtbx.validationR   t   FalseRD   t	   RotamerIDt   RotamerEvalR   R
   R$   R&   R%   t   residue_groupst   construct_complete_sidechaint   atom_groupsR   R   R   R#   R   R*   R+   R'   R,   R-   R.   (&   t	   hierarchyRQ   t   current_geometryR
   t   rdl_proxiesRS   t   exclude_backboneRJ   R?   R   RO   RP   R   RT   RW   RK   R   R   R   R6   t   i_seqs_restraints_reverseR8   R2   t   residue_groupR	   R   t   rcR   t   chisR   R4   R5   R<   R;   R=   R,   R>   RL   (    (   RS   s[   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/conformation_dependent_library/rotamers.pyt   update_restraintsŸ   s|    	  	   +				c         C   sn   d d l  m } |  GH| j |  ƒ } | j ƒ  } x7 | j ƒ  D]) } t | t t t ƒ \ } } } | GHq= Wd  S(   Niÿÿÿÿ(   t   pdb(	   t   iotbxRm   t   inputt   construct_hierarchyRa   R   R   R   R   (   t   pdb_filenameRm   t   pdb_inpt   pdb_hieratchyRi   R   Rk   R   (    (    s[   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/conformation_dependent_library/rotamers.pyt   run  s    t   __main__i   (   t
   __future__R    RB   RD   t1   mmtbx.conformation_dependent_library.rdl_databaseR   R]   R   R   R   t   TrueR!   R   R^   RN   Rl   Rt   t   __name__t   argv(    (    (    s[   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/conformation_dependent_library/rotamers.pyt   <module>   s.   		gs	