ó
º™xTc           @   se   d  d l  m Z d  d l Z d  d l Z d  d l Z d  d l Z d d „ Z
 e e d d d „ Z d S(   iÿÿÿÿ(   t   divisionNc         C   s  | d  k r t j } n  | j d |  j ƒ } g  } x® | j ƒ  D]  } g  } x! | j D] } | j | j ƒ qV Wg  } xE t	 |  j
 ƒ  ƒ D]1 \ }	 }
 |
 j j ƒ  | k r‰ | j |	 ƒ q‰ q‰ Wt | ƒ d k r@ | j | ƒ q@ q@ W|  j
 ƒ  } | j ƒ  } t j j j |  j j d | ƒ } | j ƒ  } | j ƒ  } t j j j d | ƒ } g  } i d g d d d d	 g f d
 g d d d d g f g d 6d g d d d d g f d g d d d d g f g d 6} |  j j ƒ  j ƒ  | j ƒ  k rÚg  } | |  j j ƒ  j ƒ  } xÏ | D]Ä } x™ t	 | ƒ D]‹ \ } } | j j ƒ  j ƒ  | d k r"x] t	 | ƒ D]L \ } } | j j ƒ  j ƒ  | d k rZ| | k s—t ‚ | | g } qZqZWq"q"Wt | ƒ d k r| j | ƒ qqWn  t j j j d | d | d | d | j ƒ  d  | d! d  d" | d# | d$ t ƒ 	} d% „  } | d  k r‹d& } t  |  d' ƒ rs| | |  j! d( d ƒ d) IJn | | | |  ƒ IJd  S| j" ƒ  } | d d k s»| d j# d ƒ r	d* } t  |  d' ƒ rñ| | |  j! d( d ƒ d) IJn | | | |  ƒ IJd  S| S(+   Nt   comp_idi    t
   atom_namest   rotamer_infot   OD1t   HD1t   1HDt   DD1t   1DDt   OD2t   HD2t   2HDt   DD2t   2DDt   ASPt   OE1t   HE1t   1HEt   DE1t   1DEt   OE2t   HE2t   2HEt   DE2t   2DEt   GLUi   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_listt   external_clusterst,   return_none_if_unexpected_degrees_of_freedomc         S   sS   t  |  ƒ j d k s t ‚ d |  j |  j ƒ  j ƒ  j |  j ƒ  j |  j ƒ  j f S(   Nt
   atom_groups   "%3s %s%4s%s"(   t   typet   __name__t   AssertionErrort   resnamet   parentt   idt   resseqt   icode(   t   residue(    (    sI   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/utils/rotatable_bonds.pyt   format_atom_group_id_strA   s    sJ   TARDY: cannot create tardy model for: %s (corrupted residue). Skipping it.t   id_strt   suppress_segidiôÿÿÿs?   TARDY error: unexpected degrees of freedom for %s. Skipping it.($   t   Nonet   syst   stdoutt   get_comp_comp_id_directR'   t
   get_planest   plane_atomst   appendt   atom_idt	   enumeratet   atomst   namet   stript   lent   extract_namet   iotbxt   pdbt   atom_name_interpretationt   interpreterst   match_atom_namest   mon_lib_namesR   t   mmtbxt   monomer_libraryt   rotamer_utilst   extract_bonds_to_omitt   uppert   keysR&   t   tardy_modelt   extract_xyzt   Truet   hasattrR.   t   degrees_of_freedom_each_jointt   all_eq(   R,   t   mon_lib_srvt   logR   R!   t   planet   plane_atom_namest
   plane_atomt   plane_atom_i_seqst   i_atomt   atomt   residue_atomsR   t   matched_atom_namesR   R   R   R    t   secial_casest   edget   bonded_atom_namest   bant   ia1t   atom1t   ia2t   atom2RJ   R-   t   mest
   joint_dofs(    (    sI   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/utils/rotatable_bonds.pyt   tardy_model_one_residue   s‚     	"! 		!$!c         C   s’  t  j j } | d  k rO | |  j ƒ d k s1 d  St d |  d | d | ƒ } n  | d  k rl | re d
 Sd  Sn  | j j j d } | j j j	 d } t
 | ƒ t
 | ƒ k s° t ‚ t
 | ƒ d k rÓ | rÌ d Sd  Sn  d }	 g  }
 xò|	 t
 | ƒ k  rÓ| |	 } | |	 } d } xG t | ƒ D]9 \ } } | |	 k r| d | d k r| d 7} qqW| d k r¬g  } x | |	 D] } | j | ƒ quW|
 j | | g ƒ |	 d 7}	 qâ | d k sÄt | ƒ ‚ |	 d } | } xL | t
 | ƒ k  r"| d | | d k r| j | | ƒ n  | d 7} q×W|
 j | | g ƒ |	 d 7}	 | |	 } | |	 } |	 d } | } xL | t
 | ƒ k  r²| d | | d k r¥| j | | ƒ n  | d 7} qgW|
 j | | g ƒ |	 d 7}	 qâ W| rwg  } |  j ƒ  } x |
 D]w \ } } d } x: | D]2 } | | j j ƒ  j ƒ  d k r| d 7} qqW| t
 | ƒ k ró| j | | g ƒ qóqóW| }
 n  | rŠ|
 | j f S|
 Sd  S(   Nt   common_amino_acidR,   RP   RQ   i   i    i   t   Ht   D(   NN(   NN(   Rf   Rg   (   R>   R?   t   common_residue_names_get_classR0   R'   Rd   t
   tardy_treet   cluster_managert   clusterst   hinge_edgesR<   R&   R8   t   extendR6   R9   t   elementR;   RH   t   labels(   R,   RP   t   remove_clusters_with_all_ht   include_labelsRJ   RQ   t	   get_classRk   t   axest   ict   axes_and_atoms_to_rotatet   axist   clustert
   n_branchest   i_axis_t   axis_t   atoms_to_rotatet   cit   icbt   tmpRX   t   count_ht   c_i(    (    sI   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/utils/rotatable_bonds.pyt   axes_and_atoms_aa_specificV   s‚     

  
 



  	(   t
   __future__R    t	   iotbx.pdbR>   R1   t   scitbx.graph.tardy_treet   scitbxt#   mmtbx.monomer_library.rotamer_utilsRD   R0   Rd   t   FalseR�   (    (    (    sI   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/utils/rotatable_bonds.pyt   <module>   s   Q