ó
™™xTc        
   @   s  d  d l  m Z d  d l Z d  d l Z d  d l Z d  d l m Z d  d l m	 Z	 d  d l
 m Z d  d l Z d Z d a d „  Z d „  Z d d e e d	 d
 d d g ƒ e d d d d d g ƒ d „ Z d „  Z d „  Z d „  Z d e f d „  ƒ  YZ d S(   iÿÿÿÿ(   t   divisionN(   t   flex(   t   show_string(   t   sequence_index_dictsÿ  tor_ids = None
  .type = strings
tor_atom_ids = None
  .type = strings
  .multiple = True
atom_ids_not_handled = None
  .type = strings
tree_generation_without_bond = None
  .type = strings
  .multiple = True
constrain_dihedrals_with_sigma_less_than_or_equal_to = 10
  .type=float
fine_sampling = False
  .type=bool
rotamer
  .multiple = True
{
 id = None
   .type = str
 frequency = None
   .type = float
 frequency_annotation = None
   .type = str
 angles = None
   .type = floats(allow_none_elements=True)
}
c          C   s4   t  d  k r0 d d  l }  |  j j d t ƒ a  n  t  S(   Niÿÿÿÿt   input_string(   t   __rotamer_info_master_philt   Nonet   libtbx.philt   philt   parset   rotamer_info_master_phil_str(   t   libtbx(    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/monomer_library/rotamer_utils.pyt   rotamer_info_master_phil(   s
    c         C   s†   t  ƒ  } |  d  k	 r‚ xj |  j D]\ } t | ƒ d k s= t ‚ t | ƒ } | | k rn t d t | ƒ ƒ ‚ n  | j | ƒ q Wn  | S(   Ni   s5   Duplicate tree_generation_without_bond definition: %s(	   t   setR   t   tree_generation_without_bondt   lent   AssertionErrort   tuplet   RuntimeErrort   strt   add(   t   rotamer_infot   resultt   bond(    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/monomer_library/rotamer_utils.pyt   extract_bonds_to_omit0   s    	t   Nt   CAt   Ct   Ot   OXTt   HXTt   H1t   H2t   H3c         C   sQ  t  | ƒ t  | ƒ k s t ‚ t  | ƒ t  | ƒ k s< t ‚ t d | ƒ } g  } x6 t | ƒ D]( \ } } | |	 k r^ | j | ƒ q^ q^ Wt  | ƒ t  |	 ƒ k s¦ d  Sx6 t | ƒ D]( \ } } | |
 k r³ | j | ƒ q³ q³ Wt ƒ  } g  } xŒ |  j D]� } | j ƒ  } | | k r&| j	 | ƒ qø g  | D] } | j
 | ƒ ^ q-} | j d  ƒ d k rø | j t t | ƒ ƒ ƒ qø qø W| d  k	 r¶x* | D] } | j t t | ƒ ƒ ƒ q�Wn  | j | ƒ } t  | ƒ d k rðt d t | ƒ ƒ ‚ n  | d  k	 r™| d  k rg  } n t | ƒ } xy |  j D]k } | j | k r'g  | j ƒ  D] } | j
 | ƒ ^ qI} | j d  ƒ d k r’| j t | ƒ ƒ q’q'q'Wn  xl |  j ƒ  D]^ } g  } x< | j D]1 } | j
 | ƒ } | d  k	 r¼| j | ƒ q¼q¼W| j t | ƒ ƒ q¦Wt j j j d t  | ƒ d | d | d | g ƒ j ƒ  } t  | j j ƒ d k s_t ‚ t j j d | d	 | d
 t j  t  | ƒ d ƒ d | d d  ƒ } | j! ƒ  } | d d k sÎ| d j" d ƒ rM| rØd  Sd g } xQ t# | | j j$ ƒ D]: \ } } | j d | g  | D] } | | ^ qf ƒ q÷Wt d j% | ƒ ƒ ‚ n  | S(   Nt   seqi    s9   tree_generation_without_bond does not match any bonds: %st
   n_verticest	   edge_listt   external_clusterst   fixed_vertex_listst   labelst   sitest   massesi   t
   tardy_treet   potential_objs   Unexpected degrees of freedom:s     %s: %ss   
(&   R   R   R   t	   enumeratet   appendR   R   t	   bond_listt   atom_idsR   t   gett   countR   t   sortedt
   differenceR   R   t   listt   tor_listt   value_angle_esdt
   get_planest   plane_atomst   scitbxt   graphR*   t	   constructt
   build_treet   cluster_managert
   loop_edgest
   rigid_bodyt   tardy_modelR   t   doublet   degrees_of_freedom_each_jointt   all_eqt   zipt   clusterst   join(   t   comp_comp_idt   input_atom_namest   mon_lib_atom_namest
   sites_cartt   bonds_to_omitt4   constrain_dihedrals_with_sigma_less_than_or_equal_tot   external_edge_listR%   t,   return_none_if_unexpected_degrees_of_freedomt   tree_root_atom_namest   terminal_backbone_atom_namest   atom_indicest   fixed_verticest   it	   atom_namet   bonds_omittedR$   R   t   bond_atom_idst   atom_idt   ait   eedt   unusedt   tort   planeR*   R@   t
   joint_dofst   msgt   doft   cluster(    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/monomer_library/rotamer_utils.pyR@   <   s†     	"  		( 	$	"2c         C   sI  i  } x3 |  j  D]( } | j | k s+ t ‚ | | | j <q Wt | j ƒ } i  } xk | j D]` } t | ƒ d k sy t ‚ | d } | | k s• t ‚ | | k s§ t ‚ t | d ƒ | | <q[ Wi  } x} | j D]r } | j | ƒ }	 |	 d  k	 rý |	 | | <qÏ | j | ƒ }
 |
 d  k	 r+|
 j
 ƒ  | | <qÏ t d t | ƒ ƒ ‚ qÏ W| S(   Ni   i    i   s"   rotamer_info.tor_id %s is unknown.(   R5   t   idR   R   t   tor_idst   tor_atom_idsR   R   R0   R   R/   R   R   (   RG   R   t   comp_tor_by_idR[   t   rotmer_info_tor_idst   rotamer_tor_by_idRc   t   tor_idR   R/   t   comp_tor(    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/monomer_library/rotamer_utils.pyt$   build_rotamer_tor_atom_ids_by_tor_id�   s.    
c         C   s:  i  } xO |  j  ƒ  D]A \ } } t t | d d !ƒ ƒ } | | k sJ t ‚ | | | <q Wi  } d } x½ t | j j j ƒ D]¦ \ } }	 |	 d d k r¦ | d 7} qz n  g  |	 D] }
 | j |
 j	 ƒ  ^ q­ } t t | ƒ ƒ } | j
 | ƒ } | d  k rt d t | ƒ ƒ ‚ n  | d | | <qz W| d k s6t ‚ | S(   Ni   i   i    iÿÿÿÿsY   rotatable bond atoms %s - %s (as defined by tardy_tree): no match in rotamer_info.tor_ids(   t   itemsR   R2   R   R,   R*   R=   t   hinge_edgesR'   t   stripR0   R   R   (   t   rotamer_tor_atom_ids_by_tor_idR@   t#   tor_id_by_rotatable_bond_atom_namesRg   R/   t
   atom_namesR   t   number_of_treest   i_bodyt   heRS   t   hinge_atom_names(    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/monomer_library/rotamer_utils.pyt   build_i_q_packed_by_tor_id¨   s,    
&c      	   C   s7  i  } t  d |  ƒ } x| j ƒ  D]} g  } g  } x[ | | D]O }	 | j |	 ƒ }
 |
 d  k rj |	 | f S| j | |
 ƒ | j t |	 ƒ ƒ q? Wt j j d | d t	 ƒ } | d  k rt
 d d d j | ƒ d j g  | D] } t | ƒ ^ qÜ ƒ f ƒ ‚ n  | d  k	 st ‚ | | k s%t ‚ | | | <q" W| S(   NR"   R(   t   degs*   scitbx.math.dihedral_angle returned None!
s   Atom IDs: %s
Sites: %s
s   , (   R   t   keysR0   R   R-   R   R9   t   matht   dihedral_anglet   TrueR   RF   R   (   RI   RJ   Rm   t   i_q_packed_by_tor_idR   RQ   Rg   t   d_sitesR/   RW   RS   t   dihet   xyz(    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/monomer_library/rotamer_utils.pyt   build_angle_start_by_tor_idÀ   s(    
2t   rotamer_iteratorc           B   s/   e  Z e d  „ Z d „  Z d „  Z d „  Z RS(   c         C   sÎ  | j  ƒ  t | ƒ k s t ‚ d  |  _ | j ƒ  |  _ |  j d  k rI d  S| t k rd t |  j _ n  | j j	 } d d  l
 } | j j j | j d | ƒ } | j } t | ƒ d k rÜ d | d j t | ƒ ƒ f |  _ d  S| j d t ƒ } t | ƒ d k r&d | d j t | ƒ ƒ f |  _ d  S| j ƒ  |  _ |  j j d  k	 rÙt |  j j ƒ }	 g  }
 xB t | |  j ƒ D]. \ } } | |	 k rr|
 j | j ƒ  ƒ qrqrWt |
 ƒ d k rÙd | d j |
 ƒ f |  _ d  Sn  t d	 |  j ƒ |  _ t d
 | d | d |  j d | d |  j d |  j j ƒ |  _ t d
 | d	 |  j ƒ |  _ t  d |  j d |  j ƒ |  _! t" d |  j d | d |  j d |  j! ƒ } t# | t$ ƒ r¨| |  _% n d | f | |  _ d  S|  j& ƒ  d  S(   NiÿÿÿÿRo   i    s    resname=%s: unexpected atoms: %st    t   ignore_hydrogens   resname=%s: missing atoms: %ss0   %s: rotamer_info does not handle these atoms: %sR   RG   RH   RI   RJ   RK   RL   Rm   R@   Rz   s-   resname=%s: missing atom "%s" for tor_id "%s"('   t   sizeR   R   R   t   problem_messageR   Ry   t   fine_samplingt	   chem_compRa   t"   iotbx.pdb.atom_name_interpretationt   pdbt   atom_name_interpretationt   interpreterst   match_atom_namest
   unexpectedRF   R2   t   missing_atom_namest   mon_lib_namesRI   t   atom_ids_not_handledR   RD   R-   Rl   R   RK   R@   RL   Ri   Rm   Rt   Rz   R~   t
   isinstancet   dictt   angle_start_by_tor_idt   reset(   R   RG   Ro   RJ   R„   t   resnamet   iotbxt   matched_atom_namest   namesRŽ   t   not_handledRT   t   mon_lib_atom_namet   build_result(    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/monomer_library/rotamer_utils.pyt   __init__Ü   sr    							c         C   s   t  |  j j ƒ |  _ d  S(   N(   t   iterR   t   rotamert   _rotamer_iterator__iterates(   R   (    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/monomer_library/rotamer_utils.pyR’     s    c         C   s   |  S(   N(    (   R   (    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/monomer_library/rotamer_utils.pyt   __iter__  s    c         C   sû   |  j  j ƒ  } |  j j t k rI x% | j d k rE |  j  j ƒ  } q$ Wn  t j |  j j	 d ƒ } xq t
 |  j j | j ƒ D]W \ } } |  j j | ƒ } | d  k	 rz | d  k	 rz t j | |  j | ƒ | | <qz qz W|  j j d | ƒ | |  j j ƒ  f S(   Ns   for more uniform samplingi    t   q_packed(   R�   t   nextR   R„   t   Falset   frequency_annotationR   RA   R@   t   q_packed_sizeRD   Rb   t   anglesRz   R0   R   Rw   t   radiansR‘   t   unpack_qt   sites_moved(   R   Rœ   t   q_packed_workRg   t   anglet
   i_q_packed(    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/monomer_library/rotamer_utils.pyR       s    %(   t   __name__t
   __module__R¡   Rš   R’   Rž   R    (    (    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/monomer_library/rotamer_utils.pyR   Ú   s   >		(   t
   __future__R    t   scitbx.rigid_bodyR9   t   scitbx.graph.tardy_treet   scitbx.matht   scitbx.array_familyR   t   libtbx.str_utilsR   t   libtbx.utilsR   Rw   R
   R   R   R   R   R¡   R   R@   Ri   Rt   R~   t   objectR   (    (    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/monomer_library/rotamer_utils.pyt   <module>   s(   		!F			