ó
+™xTc           @   sL  d  d l  m Z d  d l m 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 m Z d  d l m Z d  d	 l m Z d  d
 l m Z d  d l Z d  d l Z d  d l Z d  d l Z e j j d ƒ d  d l m Z d e f d „  ƒ  YZ d d d d d d d „ Z d „  Z d e f d „  ƒ  YZ d S(   iÿÿÿÿ(   t   division(   t   geometry_restraintsN(   t   crystal(   t   flex(   t   store(   t   introspection(   t   adopt_init_args(   t   dict_with_default_0(   t   Sorryt   scitbx_array_family_flex_ext(   t   reindexing_arrayt   managerc           B   sñ  e  Z d$ d$ d$ d$ d$ d$ d$ d$ d$ d$ d$ d$ d$ d  d$ d$ d$ d$ d$ d$ d$ d$ d$ d$ d$ d d$ d „ Z d „  Z d „  Z d d „ Z d „  Z d$ d$ d$ d d d d	 „ Z d e	 d
 „ Z
 d „  Z d$ d$ d$ d$ d$ d$ d$ d „ Z d$ d$ d „ Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d$ d$ d$ d$ d$ d „ Z d$ d „ Z d „  Z d$ d$ e	 d$ e	 e	 d$ g  d$ d „	 Z d „  Z d d d „ Z d d  „ Z d$ d$ d$ d$ d$ d! „ Z d$ d$ d$ d$ d" „ Z  d$ d# „ Z! RS(%   i   i   c         C   sQ  | d  k	 r! | d  k	 s! t ‚ n  | d  k	 r` | d  k	 r` | j ƒ  | j ƒ  j ƒ  k s` t ‚ n  | d  k	 r» | d  k	 r» t | ƒ d k s� t ‚ | d j ƒ  | j ƒ  j ƒ  k s» t ‚ n  |
 d  k	 rú | d  k	 rú |
 j ƒ  | j ƒ  j ƒ  k sú t ‚ n  |
 d  k	 r3| d  k	 r3| j ƒ  |
 j ƒ  k s3t ‚ n  t |  t ƒ  ƒ |  j ƒ  d  S(   Ni    (   t   Nonet   AssertionErrort   sizet   indicest   lenR   t   localst   reset_internals(   t   selft   crystal_symmetryt   model_indicest   conformer_indicest   sym_excl_indicest   site_symmetry_tablet   donor_acceptor_excl_groupst   bond_params_tablet   shell_sym_tablest   nonbonded_paramst   nonbonded_typest   nonbonded_chargest   nonbonded_functiont   nonbonded_distance_cutofft   nonbonded_buffert   angle_proxiest   dihedral_proxiest   reference_dihedral_proxiest   ncs_dihedral_proxiest   chirality_proxiest   planarity_proxiest   parallelity_proxiest   generic_restraints_managert   external_energy_functiont   plain_pairs_radiust   max_reasonable_bond_distancet   min_cubicle_edget   hbonds_in_bond_list(    (    sO   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/geometry_restraints/manager.pyt   __init__   s     '+'!c         C   s[   d  |  _ t |  _ t |  _ d  |  _ d  |  _ t |  _ |  j |  _	 |  j
 |  _ d |  _ d  S(   Ni    (   R   t!   _sites_cart_used_for_pair_proxiest   Falset!   _flags_bond_used_for_pair_proxiest&   _flags_nonbonded_used_for_pair_proxiest   _pair_proxiest   plain_pair_sym_tablet6   nonbonded_distance_cutoff_was_determined_automaticallyR    t"   adjusted_nonbonded_distance_cutoffR!   t   effective_nonbonded_buffert   n_updates_pair_proxies(   R   (    (    sO   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/geometry_restraints/manager.pyR   ?   s    						c         C   s,   |  j  d  k	 s t ‚ | |  _  |  j ƒ  d  S(   N(   R   R   R   R   (   R   t   new_site_symmetry_table(    (    sO   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/geometry_restraints/manager.pyt   replace_site_symmetryJ   s    	i    c         C   s£   |  j  d  k	 s t ‚ |  j d  k	 s* t ‚ g  } |  j  } xc |  j d j ƒ  D]N \ } } | | k  sk t ‚ | | | j | k rˆ qM n  | j | | f ƒ qM W| S(   Ni    (   R   R   R   R   t   simple_edge_listt   slackt   append(   R   t   omit_slack_greater_thant   resultt   bptt   it   j(    (    sO   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/geometry_restraints/manager.pyR<   O   s    	  c         C   s¨   g  } |  j  d  k	 rn | d k s' t ‚ d | d } x6 |  j  D]( } | j | k r? | j | j ƒ q? q? Wn  |  j d  k	 r¤ x$ |  j D] } | j | j ƒ q‡ Wn  | S(   Ni    g      ð?i   (   R#   R   R   t   weightR>   t   i_seqsR'   (   R   t(   constrain_dihedrals_with_sigma_less_thanR@   t   weight_limitt   proxy(    (    sO   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/geometry_restraints/manager.pyt*   rigid_clusters_due_to_dihedrals_and_planesZ   s    i
   c   
      C   s+  | | g j  d  ƒ d k s! t ‚ d d l m } d d l m } | d  k r_ | j | ƒ } n  | d  k	 r¢ t | t	 j
 ƒ s˜ t	 j
 t | ƒ | ƒ } n  | }	 n t	 j
 t | ƒ t ƒ }	 |  j d  k	 rå |	 j |  j j ƒ  t ƒ n  | j d | d |  j d | ƒ d |  j d	 | ƒ d
 |	 j ƒ  d | ƒ S(   Ni   iÿÿÿÿ(   t
   tardy_tree(   t   matrixt   sitest	   edge_listR?   t   external_clustersRF   t   fixed_verticest*   near_singular_hinges_angular_tolerance_deg(   t   countR   R   t   scitbx.graphRJ   t   scitbxRK   t   col_listt
   isinstanceR   t   boolR   R1   R   t   set_selectedt   special_position_indicest   Truet	   constructR<   RI   t
   iselection(
   R   RL   t
   sites_cartt	   selectiont"   omit_bonds_with_slack_greater_thanRF   RP   RJ   RK   t   fixed_vertices_bool(    (    sO   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/geometry_restraints/manager.pyt   construct_tardy_treeh   s*    !
					c   	         s[  d d l  m ‰ d d l m } ˆ j ˆ j j ƒ  k s> t ‚ | d ˆ j d ˆ j j	 d t
 ƒ ‰  ‡  ‡ ‡ ‡ ‡ f d †  } | ƒ  } ‡  ‡ f d †  } | ƒ  } ‡ ‡ f d	 †  } | ƒ  } | st d
 ˆ j d ˆ j d ˆ j d | d | d | d ˆ j d ˆ j ƒ St d
 ˆ j d ˆ j d ˆ j d | d | d | d ˆ j d ˆ j d ˆ j ƒ 	Sd  S(   Niÿÿÿÿ(   t   sgtbx(   t   construct_edge_setst
   n_verticesRM   t   assert_i_lt_jc    	         sø   t  j ˆ j ƒ }  ˆ j } xÓ t ˆ j d ƒ D]¾ \ } } |  | } x¥ | j ƒ  D]— \ } } ˆ j ƒ  } x] | D]U } | j ƒ  r¹ | | | j	 ˆ k r  qq n  | ˆ  | k r¹ qq q¹ n  | j
 | ƒ qq W| j ƒ  d k rR | | | <qR qR Wq/ W|  g S(   Ni    (   R   t   pair_sym_tableRc   R   t	   enumerateR   t   itemst   stl_vector_rt_mxt
   is_unit_mxR=   R>   R   (	   R@   R   RB   t   pair_sym_dictt   reduced_pair_sym_dictRC   t   sym_opst   reduced_sym_opst   sym_op(   t   loop_edge_setsR^   R   Ra   RJ   (    sO   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/geometry_restraints/manager.pyt   get–   s"    	 
		c             s|   t  j ƒ  }  xS ˆ j D]H } | j \ } } } | ˆ  | k sN | ˆ  | k r |  j | ƒ q q W|  j ƒ  d k rx d  S|  S(   Ni    (   R   t   shared_angle_proxyR"   RE   R>   R   R   (   R@   RH   RB   RC   t   k(   Ro   R   (    sO   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/geometry_restraints/manager.pyRp   ª   s    c             sx   t  j ƒ  }  ˆ j j ƒ  } x@ ˆ  j D]5 } | d | j d d !ƒ d k r% |  j | ƒ q% q% W|  j ƒ  d k rt d  S|  S(   Nt   edgei   i   t   hinget   loopi    (   Rt   Ru   (	   R   t   shared_dihedral_proxyt   cluster_managert   edge_classifierR#   RE   R>   R   R   (   R@   t   ecRH   (   R   RJ   (    sO   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/geometry_restraints/manager.pyRp   ¶   s    R   R   R   R   R"   R#   R%   R.   R)   (   t   cctbxRa   t   scitbx.graph.utilsRb   Rc   R   R   R   Rw   t
   loop_edgesR1   R   R   R   R%   R.   R)   (	   R   RJ   R^   t   include_den_restraintsRb   Rp   t   reduced_shell_sym_tablest   reduced_angle_proxiest   reduced_dihedral_proxies(    (   Ro   R^   R   Ra   RJ   sO   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/geometry_restraints/manager.pyt   reduce_for_tardy‰   sB    			
							
					c         C   s   |  j  S(   N(   R0   (   R   (    (    sO   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/geometry_restraints/manager.pyt    sites_cart_used_for_pair_proxies×   s    c	      1   C   sR  | d k s t  ‚ | d  k |  j d  k k s3 t  ‚ | d  k |  j d  k k sT t  ‚ | d  k |  j d  k k su t  ‚ | d  k |  j d  k k s– t  ‚ | d  k |  j d  k k s· t  ‚ | d  k |  j d  k k sØ t  ‚ |  j d  k	 r| j ƒ  | k sÿ t  ‚ |  j j	 | ƒ } n  |  j d  k	 rP| j ƒ  | k s;t  ‚ |  j j	 | ƒ } n  |  j d  k	 rŒ| j ƒ  | k swt  ‚ |  j j	 | ƒ } n  |  j d  k	 rÈ| j ƒ  | k s³t  ‚ |  j j	 | ƒ } n  |  j d  k	 rW| j
 ƒ  j ƒ  | k sõt  ‚ |  j j ƒ  }	 |	 j |	 j
 ƒ  j ƒ  | ƒ x* t | ƒ D] }
 |	 j | j |
 ƒ ƒ q.W|	 } n  d  } |  j d  k	 r”|  j j ƒ  } | j t j | ƒ ƒ n  d  } |  j d  k	 rõg  } xC |  j D]5 } | j ƒ  } | j t j | ƒ ƒ | j | ƒ q¹Wn  |  j d  k	 r1| j ƒ  | k st  ‚ |  j j	 | ƒ } n  |  j d  k	 rŽ| d  k rat j | d ƒ } n  | j ƒ  | k syt  ‚ |  j j	 | ƒ } n  t d |  j d | d | d | d | d | d | d	 | d
 |  j d | d | d |  j d |  j d |  j d |  j  d |  j! d |  j" d |  j# d |  j$ d |  j% d |  j& d |  j' d |  j( d |  j) ƒ S(   Ni    R   R   R   R   R   R   R   R   R   R   R   R   R    R!   R"   R#   R$   R)   R%   R&   R'   R(   R+   R.   (*   R   R   R   R   R   R   R   R   R   t   concatenateR   t	   deep_copyt   reservet   xranget   processRp   R   t   extendR   R   R   Re   R>   R   R   t   intR   R   R   R   R    R!   R"   R#   R$   R)   R%   R&   R'   R(   R+   R.   (   R   t   n_additional_sitesR   R   R   R   R   R   R   R:   t   i_seqR   R   t   shell_sym_table(    (    sO   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/geometry_restraints/manager.pyt   new_including_isolated_sitesÚ   sž    	!!	!!!																					c      1      sa  | | g j  d  ƒ d k s! t ‚ t ƒ  ‰  | d  k r[ | j ƒ  } ˆ  | j ƒ  c d 7<n  d  } |  j d  k	 rž |  j j | ƒ } ˆ  |  j j ƒ  c d 7<n  d  } |  j d  k	 rá |  j j | ƒ } ˆ  |  j j ƒ  c d 7<n  d  } |  j	 d  k	 r$|  j	 j | ƒ } ˆ  |  j	 j ƒ  c d 7<n  d  } |  j
 d  k	 rg|  j
 j | ƒ } ˆ  |  j
 j ƒ  c d 7<n  d  } |  j d  k	 r°|  j j | ƒ } ˆ  |  j j ƒ  j ƒ  c d 7<n  d  } |  j d  k	 ró|  j j | ƒ } ˆ  |  j j ƒ  c d 7<n  d  }	 |  j d  k	 reg  |  j D] }
 |
 j | ƒ ^ q}	 t |  j ƒ d k reˆ  |  j d j ƒ  c d 7<qen  d  } |  j d  k	 r¨|  j j | ƒ } ˆ  |  j j ƒ  c d 7<n  d  } |  j d  k	 rë|  j j | ƒ } ˆ  |  j j ƒ  c d 7<n  d  } ‡  f d †  } d  } |  j d  k	 rE| d  k r-| ƒ  } n  |  j j | | ƒ } n  d  } |  j d  k	 rŠ| d  k rr| ƒ  } n  |  j j | | ƒ } n  d  } |  j d  k	 rÏ| d  k r·| ƒ  } n  |  j j | | ƒ } n  d  } |  j d  k	 r| d  k rü| ƒ  } n  |  j j | | ƒ } n  d  } |  j d  k	 rY| d  k rA| ƒ  } n  |  j j | | ƒ } n  d  } |  j d  k	 rž| d  k r†| ƒ  } n  |  j j | | ƒ } n  d  } |  j d  k	 rã| d  k rË| ƒ  } n  |  j j | | ƒ } n  d  } |  j d  k	 r|  j j | | ƒ } n  g  } |  j d  k	 r¸t | | j ƒ  ƒ } x] |  j D]R } | d | k rD| d | k rD| | d | | d f } | j | ƒ qDqDWt | ƒ d k r¸d  } q¸n  t d |  j  d | d | d | d | d	 | d
 | d |	 d |  j! d | d | d |  j" d |  j# d |  j$ d | d | d | d | d | d | d | d | d |  j% d | ƒ S(   Ni   i    c              sZ   t  ˆ  ƒ d k r! t d ƒ ‚ n  t  ˆ  ƒ d k rL t d t ˆ  ƒ ƒ ‚ n  ˆ  j ƒ  d S(   Ni    s   Cannot determine n_seq.i   s   Selection size mismatches: %s.(   R   t   RuntimeErrort   strt   keys(    (   t   n_seqs(    sO   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/geometry_restraints/manager.pyt	   get_n_seqi  s
    R   R   R   R   R   R   R   R   R   R   R   R   R    R!   R"   R#   R$   R)   R%   R&   R'   R(   R+   R.   (&   RQ   R   R   R   R[   R   R   t   selectR   R   R   R   R   R   t   proxy_selectR   R   R   R   R"   R#   R$   R%   R&   R'   R(   R)   R.   R
   t   as_intR>   R   R   R   R   R    R!   R+   (   R   R]   R[   t   selected_model_indicest   selected_conformer_indicest   selected_sym_excl_indicest#   selected_donor_acceptor_excl_groupst   selected_site_symmetry_tablet   selected_bond_params_tablet   selected_shell_sym_tablesRŒ   t   selected_nonbonded_typest   selected_nonbonded_chargest   n_seqR’   t   selected_angle_proxiest   selected_dihedral_proxiest#   selected_reference_dihedral_proxiest   selected_ncs_dihedral_proxiest   selected_chirality_proxiest   selected_planarity_proxiest   selected_parallelity_proxiesR)   t   selected_hbonds_in_listt   r_at   pairt   reindexed_pair(    (   R‘   sO   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/geometry_restraints/manager.pyR“   4  s   !									"		"#				 	 	 	 	 	 	 		 						c      1   C   s4  |  j  d  k	 s t ‚ |  j d  k	 s* t ‚ t d t j d | d d ƒ d |  j d |  j d d  d |  j	 d	 |  j  j
 ƒ  d
 |  j d g  |  j D] } | j
 ƒ  ^ q‹ d |  j d |  j d |  j d |  j d |  j d |  j d |  j d |  j d |  j d |  j d |  j d |  j d |  j d |  j d |  j d |  j ƒ S(   NR   t	   unit_cellt   space_group_symbolt   P1R   R   R   R   R   R   R   R   R   R   R   R    R!   R"   R#   R$   R)   R%   R&   R'   R(   R+   R.   (   R   R   R   R   R   R   t   symmetryR   R   R   t   discard_symmetryR   R   R   R   R   R    R!   R"   R#   R$   R)   R%   R&   R'   R(   R+   R.   (   R   t   new_unit_cellt   t(    (    sO   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/geometry_restraints/manager.pyR¯   ¹  s:    						"															c         C   s   |  j  j d | ƒ |  _  d  S(   NR]   (   R"   t   proxy_remove(   R   R]   (    (    sO   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/geometry_restraints/manager.pyt   remove_angles_in_placeØ  s    c         C   s   |  j  j d | ƒ |  _  d  S(   NR]   (   R#   R²   (   R   R]   (    (    sO   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/geometry_restraints/manager.pyt   remove_dihedrals_in_placeÜ  s    c         C   s   |  j  j d | ƒ |  _  d  S(   NR]   (   R$   R²   (   R   R]   (    (    sO   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/geometry_restraints/manager.pyt#   remove_reference_dihedrals_in_placeà  s    c         C   s   |  j  j d | ƒ |  _  d  S(   NR]   (   R%   R²   (   R   R]   (    (    sO   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/geometry_restraints/manager.pyt   remove_ncs_dihedrals_in_placeä  s    c         C   s   |  j  j d | ƒ |  _  d  S(   NR]   (   R&   R²   (   R   R]   (    (    sO   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/geometry_restraints/manager.pyt   remove_chiralities_in_placeè  s    c         C   s   |  j  j d | ƒ |  _  d  S(   NR]   (   R'   R²   (   R   R]   (    (    sO   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/geometry_restraints/manager.pyt   remove_planarities_in_placeì  s    c         C   s   |  j  j d | ƒ |  _  d  S(   NR]   (   R(   R²   (   R   R]   (    (    sO   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/geometry_restraints/manager.pyt   remove_parallelities_in_placeð  s    c         C   s   | |  _  d  S(   N(   R)   (   R   R   (    (    sO   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/geometry_restraints/manager.pyt   set_generic_restraintsô  s    c         C   s   | |  _  d  S(   N(   R*   (   R   t   energy_function(    (    sO   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/geometry_restraints/manager.pyt   set_external_energy_function÷  s    c            sP  | d  k r d } n  ˆ j d  k r- d  ‰ n ˆ j j ƒ  j ƒ  ‰ d ‰  d  d  ‡  ‡ ‡ ‡ f d † } ‡ ‡ f d †  } ˆ j d  k rJˆ j d  k rÿˆ j d  k	 rÿˆ j d  k	 rÿˆ j d  k	 rÿˆ j j ƒ  } | j d | ƒ }	 xJ ˆ j D]? }
 t	 ˆ  t
 j d t j d |
 d ˆ d	 |	 ƒ d
 d ƒ ƒ ‰  qî W| d	 |	 ƒ ˆ  d | 9‰  t j j ˆ j d ˆ  d | ƒ} | j d |	 d ˆ j ƒ d  } g  ˆ j D]$ }
 t j d | ƒ j d |
 ƒ ^ q–} ˆ j d 7_ t j d ˆ d ˆ j d ˆ j d | ƒ ˆ _ qIˆ j d  k rIˆ j d 7_ t j d ˆ d ˆ j d ˆ j ƒ ˆ _ qInÿ| d  k	 r+ˆ j d  k s‰| ƒ  s‰ˆ j j | ƒ ˆ j k r+ˆ j d 7_ | j ƒ  ˆ _ ˆ d  k rÈt ˆ _ t ˆ _ n ˆ j ˆ _ ˆ j  ˆ _ d ‰  ˆ j! d  k rwˆ j" j# d ˆ j ƒ } | d k st$ ‚ ˆ j% j& d | d | d' ƒ } | d k rYt' d ƒ ‚ n  t ˆ _( | ˆ _! | ˆ _) n  d  } d  } xÃt r'ˆ j) ˆ j* } ˆ j d  k r>ˆ  d k  r€xD ˆ j D]9 }
 t	 ˆ  t
 j d t j d |
 d | ƒ d
 d ƒ ƒ ‰  qÁW| d | ƒ ˆ  d | 9‰  t j+ j, d | d d | ƒ } q€nBˆ  d k  sYˆ j- d  k	 r}ˆ j j ƒ  } | j d | ƒ }	 n  ˆ j- d  k	 rŸˆ j. d	 |	 ƒ n  ˆ  d k  rxJ ˆ j D]? }
 t	 ˆ  t
 j d t j d |
 d ˆ d	 |	 ƒ d
 d ƒ ƒ ‰  qµW| d	 |	 ƒ ˆ  d | 9‰  n  | d  k s4| j/ ƒ  | k  r€t j j ˆ j d t	 ˆ  | ƒ d | ƒ} | j d |	 d ˆ j ƒ d  } n  | d  k rÃg  ˆ j D]$ }
 t j d | ƒ j d |
 ƒ ^ q–} n  t j d ˆ d ˆ j d | d ˆ j0 d ˆ j1 d ˆ j2 d  ˆ j3 d! ˆ j" d ˆ j d" ˆ j4 d# | d ˆ j ƒ ˆ _ t5 j6 ƒ  j7 ƒ  ˆ j j8 d  k r[Pn  ˆ j j8 j9 } | d k rzPn  ˆ j% j& d | d | d( ƒ } | d k r©Pn  ˆ j! | k  rìˆ j( rÐt$ d$ ƒ ‚ n  t: d% ˆ j! | f ƒ ‚ n  | ˆ _) | ˆ j) ˆ _ ˆ j | k rPn  ˆ j! ˆ _) q†Wn ˆ j d  k rIt$ d& ƒ ‚ n  ˆ j S()   Ng�íµ ÷Æ°>iÿÿÿÿc            sª   ˆ j  d  k	 r¦ ˆ  ˆ j  k r¦ t d ˆ j d d d d ˆ d |  d | d ˆ ƒ } d	 ˆ  ˆ j  f } t | ƒ d k r— | d
 7} | d j | ƒ 7} n  t | ƒ ‚ n  d  S(   NRe   i    t   larger_thani   t   orthogonalization_matrixt
   sites_fracR\   t   site_labelss9   Bond distance > max_reasonable_bond_distance: %.6g > %.6gs   :
  s   
  (   R,   R   t"   format_distances_for_error_messageR   R   t   joinRŽ   (   R¿   R\   t   linest   msg(   t   bonded_distance_cutoffR¾   R   RÀ   (    sO   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/geometry_restraints/manager.pyt   check_bonded_distance_cutoff  s    	
c              sY   ˆ  d  k r) ˆ j s t Sˆ j sU t Sn, ˆ j ˆ  j k r? t Sˆ j ˆ  j k rU t St S(   N(   R   R2   RY   R3   t   bondt	   nonbondedR1   (    (   t   flagsR   (    sO   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/geometry_restraints/manager.pyt   flags_are_different  s    		R\   t   valuesRe   R¾   R¿   t   defaulti    i   t   buffer_thicknesst   asu_is_inside_epsilont   original_sitesR   t   asu_mappingst	   sym_tableRÉ   R   R-   t   shell_asu_tablesR   t   vdw_distancet   deltas}   Cannot automatically determine nonbonded_distance_cutoff: nonbonded_function.residual() not zero beyond maximum VDW distance.t   min_unit_cell_lengthi   R   R   R   R   R   R   t%   nonbonded_distance_cutoff_plus_buffers   Internal error.sB   nonbonded_distance_cutoff=%.6g is too small: max_vdw_distance=%.6gs!   pair_proxies not defined already.gzo ð?gzo ð?(;   R   R   R«   R¾   R   R4   R   R   t   fractionalizet   maxR   t   max_defaultR   t   get_distancesR®   RÐ   t   process_sites_fract   pair_asu_tablet   add_pair_sym_tableR9   R   t   pair_proxiesR   R-   R0   t   max_distanceR8   R„   RY   R2   R3   RÇ   RÈ   R    R   t   find_max_vdw_distanceR   R   t   residualRŽ   R6   R7   R!   t   direct_space_asut!   non_crystallographic_asu_mappingsR+   t   update_plain_pair_sym_tableRÍ   R   R   R   R   R   R   t   virtual_memory_infot
   update_maxt   nonbonded_proxiest   max_vdw_distanceR   (   R   R\   RÉ   RÎ   t   bonded_distance_cutoff_epsilonRÀ   RÆ   RÊ   R«   R¿   RŒ   RÐ   RÒ   t   max_vdw_distt   rt-   current_nonbonded_distance_cutoff_plus_buffer(    (   RÅ   RÉ   R¾   R   RÀ   sO   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/geometry_restraints/manager.pyRÞ   ú  sB   							
1											
											
	4											c         C   s=   |  j  d | ƒ } | d  k r* |  j } n  | j j d | ƒ S(   NR\   (   RÞ   R   R0   Rç   t   deltas(   R   R\   RÞ   (    (    sO   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/geometry_restraints/manager.pyt   nonbonded_model_distancesÍ  s    c         C   s   t  j j |  j d |  j ƒ} | j d | d |  j ƒ t  j d | ƒ } | j d |  j ƒ | j	 ƒ  |  _
 t j ƒ  j ƒ  d  S(   NRÍ   RÏ   R   RÐ   t   distance_cutoff(   R   R®   RÐ   R   R+   RÛ   R   RÜ   t   add_all_pairst   extract_pair_sym_tableR5   R   Rå   Ræ   (   R   R¿   RÐ   RÜ   (    (    sO   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/geometry_restraints/manager.pyRä   Ó  s    	
c      '   C   sH  | d  k	 r$ |  j d  k s- t ‚ n	 |  j } | d  k rQ t j j d t ƒ } n  |  j d | d | d |
 ƒ } d  g d \ } } } } } } } } } } } | j rÇ | j d  k	 s» t ‚ | j } n  | j	 r|  j
 d  k	 r| j d  k	 sô t ‚ | j } | d  k r|  j } q| } n  | j r3|  j } n  | j rH|  j } n  | j r]|  j } n  | j rr|  j } n  | j r‡|  j } n  | j rœ|  j } n  | j r±|  j } n  | j rÆ|  j } n  t j j d | d | d | d | d	 | d
 | d | d | d | d | d | d | d | d | d | d | d | d |	 d |  j ƒ S(   NRÌ   RÉ   R\   RÀ   i   t   bond_proxiesRç   R   R"   R#   R$   R%   R&   R'   R(   R)   R*   t   compute_gradientst	   gradientst   disable_asu_cachet   normalizationt   extension_objectsR.   (   R   R*   R   R   RÉ   RY   RÞ   RÇ   Rò   RÈ   R   Rç   R   t   angleR"   t   dihedralR#   t   reference_dihedralR$   t   ncs_dihedralR%   t	   chiralityR&   t	   planarityR'   t   parallelityR(   t   generic_restraintsR)   t   energiesR.   (   R   R\   RÉ   t   custom_nonbonded_functionRó   Rô   Rõ   Rö   R*   R÷   RÀ   RÞ   Rò   Rç   R   R"   R#   R$   R%   R&   R'   R(   Rÿ   (    (    sO   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/geometry_restraints/manager.pyt   energies_sitesÞ  sj    		.				 	 		 	 	 	 	c         C   s;  |  j  d  k	 s t ‚ t |  j  ƒ d k s0 t ‚ | j ƒ  |  j  d j ƒ  k sU t ‚ d } t j | j ƒ  d ƒ } x² |  j  d j ƒ  D]� } | j ƒ  \ } } | d  k r´ | }	 n | | | | | | d }	 | | | | }
 |	 |
 } | | |
 7} | | c | d 7<| | c | d 8<q‡ Wt	 d | d | ƒ S(   Ni    g      à?i   t   residual_sumRô   (
   R   R   R   R   R   R   t   doublet   iteratorRE   R   (   R   t	   variablest   type_indicest   type_weightsR  Rô   R©   RB   RC   RD   RÔ   t   term(    (    sO   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/geometry_restraints/manager.pyt   harmonic_restraints%  s"    %	
gü©ñÒMbP?g      à?c            sô   ‡  ‡ f d †  } ‡  f d †  } ‡  f d †  } | ˆ  _  ˆ ˆ  _ t j | j ƒ  d
 ƒ } t j | j ƒ  d ƒ }	 x{ | D]s }
 | |
 d | |
 d ƒ \ } } | d | ƒ |	 |
 d <| d | d | d | |
 d d	 |
 d ƒ | |
 d <qy W| S(   Nc            sˆ   t  j |  d | d d |  d | d d |  d | d d ƒ } ˆ d k rx | ˆ  j k ro | ˆ } q~ d } n | } | | f S(   Ni    i   i   g        (   t   matht   sqrtt   ta_slack(   t   site1t   site2RÔ   t   delta_slack(   R   R=   (    sO   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/geometry_restraints/manager.pyRÔ   ;  s    G	c            s   ˆ  j  |  d } | S(   Ni   (   t   ta_harmonic_weight(   t   distanceRá   (   R   (    sO   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/geometry_restraints/manager.pyRá   F  s    c            s¤   |  d | d |  d | d |  d | d f } ˆ  j  d k rX | ˆ  j  k  rX d Sn  ˆ  j d | | d ˆ  j d | | d ˆ  j d | | d f } | S(   Ni    i   i   g        g       @(   g        g        g        (   R  R  (   t   sitet   ref_sitet   distance_slackR  t
   site_deltat   gradient(   R   (    sO   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/geometry_restraints/manager.pyR  J  s    3i    i   R  R  R  R  (   i    i    i    (   R  R  R   t   vec3_doubleR   R  (   R   R\   t   ta_harmonic_restraint_infoRD   R=   RÔ   Rá   R  Rô   t	   residualst   xR  R  (    (   R   R=   sO   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/geometry_restraints/manager.pyt   ta_harmonic_restraints9  s    		!c         C   sB   |  j  d  k	 r | |  j  | <n  |  j d  k	 r> | |  j | <n  d  S(   N(   R   R   R   (   R   R‹   t   nonbonded_typet   charge(    (    sO   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/geometry_restraints/manager.pyt   update_atom_nonbonded_typed  s    c         C   s$  | d  k r t j } n  |  j d | d | ƒ } | d  k rH |  j } n  | j d  k	 rÈxó | j j D]å } | d  k s… | | j k rd | d I| j IJ| d  k	 rÏ x( | j D] } | d I| | IJq® Wn  | d  k	 r| d t j	 d | d | ƒ j
 IJn  | d | j IJ| d | j IJ| j d	 k rI| d
 | j IJqIqd qd W| j j j ƒ  d	 k rÈ| j j ƒ  }	 xN| j j D]=} | d  k s«| | j | j g k r�|	 j d | ƒ }
 | d  k rî| d I| j | j f I|
 IJnP | d I| j | j f IJ| d I| | j IJ| d I| | j I|
 IJ| d  k	 rv| d t j	 d | d |	 d | ƒ j
 IJn  | d | j IJ| d | j IJ| j d	 k r¾| d
 | j IJq¾q�q�WqÈn  |  j d  k	 rªxÐ |  j D]Â } | d  k s| | j k rá| d I| j IJ| d  k	 rLx( | j D] } | d I| | IJq+Wn  | d  k	 r~| d t j d | d | ƒ j IJn  | d | j IJ| d | j IJqáqáWn  |  j d  k	 r�xá |  j D]Ó } | d  k sä| | j k rÃ| d I| j IJ| d  k	 r.x( | j D] } | d I| | IJqWn  | d  k	 r`| d t j d | d | ƒ j IJn  | d | j IJ| d | j IJ| d | j IJqÃqÃWn  |  j d  k	 r�xá |  j D]Ó } | d  k s×| | j k r¶| d I| j IJ| d  k	 r!x( | j D] } | d I| | IJq Wn  | d  k	 rS| d t j d | d | ƒ j IJn  | d | j IJ| d | j IJ| d | j IJq¶q¶Wn  |  j d  k	 rƒxá |  j D]Ó } | d  k sÊ| | j k r©| d I| j IJ| d  k	 rx( | j D] } | d I| | IJqóWn  | d  k	 rF| d t j d | d | ƒ j IJn  | d | j IJ| d | j IJ| d | j IJq©q©Wn  |  j d  k	 rvxá |  j D]Ó } | d  k s½| | j k rœ| d I| j IJ| d  k	 rx( | j D] } | d I| | IJqæWn  | d  k	 r9| d t j d | d | ƒ j  IJn  | d | j! IJ| d | j" IJ| d | j IJqœqœWn  |  j# d  k	 r”x|  j# D]þ } | d  k s°| | j k r�| d It$ | j ƒ IJ| d  k	 röt j% d | d | ƒ j& ƒ  } n d  g | j j ƒ  } x~ t' | j | j( | ƒ D]a \ } } } | d I| d  k	 r[| | | In  | d  k	 rx| d | In  | d | IJq%Wq�q�Wn  |  j) d  k	 r°| d IJn  | j* d  k	 r | j* j } | j* j } | j ƒ  } | j ƒ  d	 k r	| j* j ƒ  }	 n  | d  k	 rC	t j+ d | d | j* ƒ } t, j- d | ƒ } n d  } t. | | j ƒ  ƒ } x¾| D]³} | | k  r
| | } | d  k s�	| | j k r| d  I| j IJ| d  k	 rç	x( | j D] } | d I| | IJqÆ	Wn  | d  k	 r
| d | | IJn  | d! | j/ IJqqf	| | | } | d  k sQ
| | j | j g k rf	|	 j d | ƒ }
 | d  k r”
| d" I| j | j f I|
 IJnP | d" I| j | j f IJ| d I| | j IJ| d I| | j I|
 IJ| d  k	 r| d | | IJn  | d! | j/ IJqf	qf	Wn  d  S(#   NRÉ   R\   s   bond simple:t    s     distance_model: %.6gRH   s     distance_ideal: %.6gs     weight: %.6gi    s     slack: %.6gR©   s	   bond asu:RÐ   s   angle:s     angle_model: %.6gs     angle_ideal: %.6gs	   dihedral:s     periodicity: %.6gs   reference dihedral:s     limit: %.6gs   NCS dihedral:s
   chirality:s     volume_model: %.6gs     volume_ideal: %.6gs     both_signs: %.6gs
   planarity:s   delta: %8.5f,s   weight: %.6gs)   parallelity functional is not implementedt   sorted_asu_proxiest   datas   nonbonded simple:s     vdw_distance: %.6gs   nonbonded asu:(0   R   t   syst   stdoutRÞ   R0   Rò   t   simpleRE   R   RÇ   t   distance_modelt   distance_idealRD   R=   t   asuR   RÐ   R‹   t   j_seqt   get_rt_mx_jiR"   Rø   t   angle_modelt   angle_idealR#   Rù   t   periodicityR$   t   limitR%   R&   Rü   t   volume_modelt   volume_idealt
   both_signsR'   t   tupleRý   Rí   t   zipt   weightsR(   Rç   t   nonbonded_deltasR   t   sort_permutationR†   RÓ   (   R   RÉ   R\   RÀ   R‹   t   fRÞ   RH   RB   RÐ   t   rt_mxRí   RD   RÔ   R%  R(  t   simple_sizet   permutationt   i_proxy(    (    sO   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/geometry_restraints/manager.pyt   show_interactionsm  s4    $%!	(
	
$%c         C   sž  | d  k r t j } n  |  j d | d | ƒ } | d  k rH |  j } n  | j d  k	 rþ | j j d d d | d | d | d |  j ƒ | Jt j ƒ  } |  j d  k	 rþ | j j d d d | d | d | d d	 d |  j d
 t	 ƒ | d I| j
 ƒ  d IJqþ n  |  j d  k	 r9|  j j d d d | d | d | ƒ | Jn  |  j d  k	 rt|  j j d d d | d | d | ƒ | Jn  |  j d  k	 rµ|  j j d d d | d | d | d t	 ƒ | Jn  |  j d  k	 rö|  j j d d d | d | d | d t	 ƒ | Jn  |  j d  k	 r®|  j j d  k	 rL|  j j j d d d | d | d | d t	 ƒ | Jn  |  j j d  k	 r†|  j j d d d | d | d | ƒ n  |  j j d d d | d | d | ƒ n  |  j d  k	 ré|  j j d d d | d | d | ƒ | Jn  |  j d  k	 r$|  j j d d d | d | d | ƒ | Jn  |  j d  k	 r_|  j j d d d | d | d | ƒ | Jn  | j d  k	 rš| j j d d d | d | d | ƒ | Jn  d  S(   NRÉ   R\   t   by_valueRá   RÀ   R7  t   excludet   prefixt    t   exclude_output_onlys	   Bond-likei   t   is_referencet   is_ncst	   is_c_betaRÔ   (   R   R#  R$  RÞ   R0   Rò   t   show_sortedR.   t   StringIORY   t   getvalueR"   R#   R$   R%   R)   t   c_beta_dihedral_proxiest   hydrogen_bond_proxiest   show_sorted_hbondst   show_sorted_ramachandranR&   R'   R(   Rç   (   R   RÉ   R\   RÀ   R7  RÞ   t
   tempbuffer(    (    sO   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/geometry_restraints/manager.pyRE    s¦     
	 

c         C   s¾   |  j  d | d | ƒ } | j j d k r9 t d ƒ ‚ n  | j j d d d | d | ƒ } | d k rs | d } n g  } t d | d | d	 |  j d j ƒ  d
 |  j d j ƒ  d | ƒ } | S(   s*  (multiple arguments) -> nonbonded_clashscore obj

    Construct nonbonded_clash_info, the non-bonded clashss lists and scores

    Arguments:
    sites_cart: sites_cart[i] tuple containing the x,y,z coordinates of atom i
    site_labels: a list of lables such as " HA  LEU A  38 ", for each atom
    hd_sel: hd_sel[i] retruns True of False, indicating whether an atom i is a Hydrogen or not

    NOTE:
    As of Dec. 2013 manipulation of scatterers can produce scatteres which
    have no lables. In that case, water interaction score will not be accurate

    Return:
       self.nonbonded_clash_info

    NOTE:
    Be aware to the parameters:
       assume_hydrogens_all_missing=False,
       hard_minimum_nonbonded_distance=0.0

    The defult values of these are True and 0.001, which will alter
    the size of the vdw bonds and the clashes that being counted

    As of Dec. 2013 manipulation of scatterers can produce scatteres whish
    have no lables. In that case, water interaction score will not be accurate


    Usage example:
    mon_lib_srv = mmtbx.monomer_library.server.server()
    ener_lib = mmtbx.monomer_library.server.ener_lib()

    pdb = monomer_library.pdb_interpretation.process(
      file_name=None,
      raw_records=records,
      substitute_non_crystallographic_unit_cell_if_necessary=True,
      mon_lib_srv=mon_lib_srv,
      ener_lib=ener_lib)

    grm = pdb.geometry_restraints_manager(
      assume_hydrogens_all_missing=False,
      hard_minimum_nonbonded_distance=0.0))

    xrs = pdb.xray_structure()
    sites_cart = xrs.sites_cart()
    site_labels = xrs.scatterers().extract_labels()
    hd_sel = xrs.hd_selection()

    nb_clash_info = grm.get_nonbonded_clashscore(
      sites_cart=sites_cart,
      site_labels=site_labels,
      hd_sel=hd_sel)


    @author: Youval Dar, LBL 12-2013
    R\   RÀ   i    sh   nonbonded clashscore can't be calculated. PDB file contains unknown type pairs. Please provide cif file.R=  RÔ   t   nonbonded_listt   hd_selt   full_connectivty_tablet   connectivty_table_2i   N(	   RÞ   Rç   t   n_unknown_nonbonded_type_pairsR   t
   get_sortedR   t   nonbonded_clashscoreR   t   full_simple_connectivity(   R   R\   RN  RÀ   RÞ   t   proxies_info_nonbondedRM  t   nonbonded_clash_info(    (    sO   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/geometry_restraints/manager.pyt   get_nonbonded_clashscorem  s&    =				N("   t   __name__t
   __module__R   R/   R   R;   R<   RI   R`   R1   R�   R‚   R�   R“   R¯   R³   R´   Rµ   R¶   R·   R¸   R¹   Rº   R¼   RÞ   Rî   Rä   R  R
  R  R  R<  RE  RW  (    (    (    sO   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/geometry_restraints/manager.pyR      s®   			K	R…										Î	=	.¡[id   i2   g333333ó?i   i
   c	         C   s  d d  l  }	 d d l m }
 d d l m } t j d d  ƒ } x’ | | f | | f g D]x \ } } xi | D]a \ } } t | j	 |  | ƒ | j	 |  | ƒ ƒ } | j
 t j d | | f d | d | ƒ ƒ qj WqW Wt j d |  j ƒ  d	 | j ƒ } |
 j d
 |  d | ƒ } | j ƒ  j ƒ  j d | d
 | j ƒ } t j d | ƒ } t j | | j ƒ t j j d | d d ƒ } g  | D] } | j ƒ  ^ qz} t j | j ƒ  d ƒ } t j ƒ  } | | j j d ƒ d <| j t d | j ƒ  d | j  ƒ  d | d | d | d | d t j! ƒ  d | ƒ f S(   Niÿÿÿÿ(   t   uctbx(   RK   RÐ   RE   R'  RD   RŸ   t   bond_simple_proxiesR\   t   buffer_layerRÍ   RÜ   t	   max_shelli   t   DefaultR   R   R   R   R   R   R   R,   ("   t$   cctbx.crystal.coordination_sequencesRz   RZ  RS   RK   R   t   bond_sorted_asu_proxiesR   t   abst   colR‡   t   bond_simple_proxyt   extract_bond_paramsR   R%  t;   non_crystallographic_unit_cell_with_the_sites_in_its_centerR   t   special_position_settingsRÐ   R\   R   RÜ   t	   add_pairst   coordination_sequencesRÒ   Rñ   R   t
   std_stringR   t   distance_tablet
   setdefaultR   R   t   prolsq_repulsion_function(   R\   t   edge_list_bondst   edge_list_anglest   bond_weightt   angle_weightRÓ   t+   non_crystallographic_unit_cell_buffer_layert   asu_mappings_buffer_thicknessR,   Rz   RZ  RK   Rò   RM   RD   RB   RC   R  R   t   boxRÐ   t   bond_asu_tableRÒ   t   shell_asu_tableR   R   R   (    (    sO   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/geometry_restraints/manager.pyt:   construct_non_crystallographic_conserving_bonds_and_anglesÃ  sN    
		*$				c      	   C   s)  | | g j  d  ƒ d k s! t ‚ | d  k	 r{ | d  k	 rZ t | ƒ t | ƒ k sx t ‚ q{ t | ƒ t | ƒ k s{ t ‚ n  g  } d d l m } m } | d  k	 r² | | ƒ } n  xpt |  ƒ D]b\ }	 }
 xS|
 j ƒ  D]E\ } } x6| D].} | d  k	 r0| j	 ƒ  st ‚ | | |	 ƒ | | | ƒ } n, | | |	 ƒ | | | | ƒ } | | } | j
 ƒ  } | | k rë | j	 ƒ  r‰d } n d t | ƒ } | d  k rÁt |	 ƒ t | ƒ } } n | |	 | | } } | d k  rïd | } n
 d | } | j d	 | | | | f ƒ që që WqØ Wq¿ W| S(
   Ni   iÿÿÿÿ(   Rb  t   sqrR@  R   iè  s   %7.3fs   %.6gs   distance: %s - %s: %s%s(   RQ   R   R   R   t   scitbx.matrixRb  Rw  Rf   Rg   Ri   t   lengthR�   R>   (   Re   R½   R¾   R¿   R\   RÀ   R@   Rb  Rw  R‹   Rj   R)  Rl   t   rt_mx_jit   d_cartt   d_fract   distt   sst   sit   sjt   sd(    (    sO   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/geometry_restraints/manager.pyRÁ   ÷  s<    !!!!"
	
,RS  c           B   sV   e  Z d  Z d „  Z e d „  ƒ Z d „  Z e d „  ƒ Z e d „  ƒ Z d „  Z	 RS(   s±   
  Object processing information on non-bonded steric clashes. When the
  distance between atoms is smaller than the Van Der Waals distance.

  @author: Youval Dar (LBL 2013)
  c         C   sæ  | |  _  | |  _ | |  _ | |  _ | |  _ | g  k ršy |  j ƒ  } Wn~ t k
 r� } | d k rv t | ƒ ‚ qÊ g  g  g  g } | GHn= t k
 r« } t | ƒ ‚ n t k
 rÉ } t d ƒ ‚ n X| d |  _	 | d |  _
 | d |  _ | d | d | d |  _ t |  j ƒ } t | d ƒ d | }	 t | d ƒ d | }
 t | d ƒ d | } |	 |
 | } |	 |  _ |
 |  _ | |  _ | |  _ nH d |  _ d |  _ d |  _ d |  _ g  |  _	 g  |  _
 g  |  _ g  |  _ d S(   s¹  
    Arguments:
    nonbonded_list: a list with items in the following format
                    ([pdb labels], i_seq, j_seq, model, vdw_distance, sym_op_j, rt_mx)
                    i_seq,j_seq: position of residues in the pdb file
                    model: The pdb or other model distance
                    vdw_distance: Van Der Waals distance
                    sym_op_j: is this a product of a symmetry opeation
                    rt_mx: Rotation matrix for symmetry operation
    hd_sel: hd_sel[i] retruns True of False, indicating whether an atom i is a Hydrogen or not
    full_connectivty_table: full_connectivty_table[i] is a dictinary constaining a
                            list of all atoms connected to atom i
    connectivty_table_2: connectivty_table[i] is a dictinary constaining a
                         list of all atoms connected to atom i
    sites_cart: sites_cart[i] tuple containing the x,y,z coordinates of atom i
    s#   vec3_double' object is not callablesM   Unexpected error processing proxies_info_nonbonded in clashscore_clash_list()i    i   i   iè  N(   RM  RN  RO  RP  R\   t   clashscore_clash_listt	   TypeErrorR   t	   Exceptiont   nb_clash_proxies_due_to_sym_opt    nb_clash_proxies_solvent_solventt   nb_clash_proxies_simplet   nb_clash_proxies_all_clashesR   t   nb_clashscore_due_to_sym_opt   nb_clashscore_solvent_solventt   nb_clashscore_simplet   nb_clashscore_all_clashes(   R   RM  RN  RO  RP  R\   t	   clashlistt   et   n_atomst   clashscore_due_to_sym_opt   clashscore_solvent_solventt   clashscore_simplet   clashscore_all_clashes(    (    sO   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/geometry_restraints/manager.pyR/   *  sL    															c         C   s  d „  } | | |  | | ƒ rü | |  s: | |  }  } n  t  |  d f g ƒ } |  h } |  h } x~ t d d ƒ D]m } t ƒ  }	 x' | D] }
 |	 j t | |
 ƒ ƒ }	 q‡ W|	 | } | j |	 ƒ } x | D] } | | | <qÊ Wqq W| | k oû | | d k St Sd S(   s  (int,int,bool array,list of lists of int) -> bool
    Check if we have 1-5 interaction between two hydrogen and heavy atom

    arguments:
    i_seq,j_seq:  are the number of the atoms we are checking in the pdb table
    hd_sel: hd_sel[i] retruns True of False, indicating whether an atom i is a Hydrogen or not
    full_connectivty_table: full_connectivty_table[i] is a dictinary constaining a
                            list of all atoms connected to atom

    retruns:
    True if we have 1-5 hydrogen and heavy atom interaction
    c         S   s   |  s | o |  o | S(   N(    (   t   at   b(    (    sO   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/geometry_restraints/manager.pyt   <lambda>~  s    i    i   i   i   N(   t   dictt   ranget   sett   unionR1   (   R‹   R)  RN  RO  t   xort   atoms_numberst   used_connectionst   new_connectionsRB   t   connectionst   keyt   new_atom(    (    sO   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/geometry_restraints/manager.pyt   is_1_5_interactiono  s"    	
			
c   	      C   sÎ   t  | ƒ } d } | j | d d d d !| d | d ƒ } | j | d d d d !| d | d ƒ } |  j | d } |  j | d } | | } d j | Œ  } | | k rÁ | | } } n  | | | f S(   sè  (str) -> str,str,str

    Collect atoms keys and coordinates

    Argumets:
    record : a clash record, for example:
    (['pdb=" HA  LEU A  38 "', 'pdb="HD23 LEU A  38 "'], 523, 532, 1.8108674716831155, 2.44, '', None)

    Returns:
    clash_vec: a unique key for a clash. for example: '0.144,0.323,1.776,0.154,0.327,1.786'
    key1,key2: are the atoms keys. for example ' HA  LEU A  38 ::120::' or ' CB ASN A  55 ::52::sym.op.'
               "atom1 label::atom1 number::sym.op""
    s   {0}::{1}::{2}i    i   iÿÿÿÿi   i   s/   {0:.3f},{1:.3f},{2:.3f},{3:.3f},{4:.3f},{5:.3f}(   t   listt   formatR\   (	   R   t   recordR   t   key1t   key2t	   atomi_xyzt	   atomj_xyzt   vect	   clash_vec(    (    sO   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/geometry_restraints/manager.pyt   get_clash_keys˜  s    ,,
c         C   s„  d „  } d „  } d „  } d „  } | d d !} | d d !} |  d d !} |  d d !}	 | | k r” | |	 | ƒ }
 | | |
 ƒ } | |	 | ƒ } n¥ | |	 k rÐ | | | ƒ }
 | | |
 ƒ } | | | ƒ } ni | | k r| |	 | ƒ }
 | | |
 ƒ } | |	 | ƒ } n- | | | ƒ }
 | | |
 ƒ } | | | ƒ } y- t  | | | ƒ | | ƒ | | ƒ ƒ } Wn t k
 rd } n X| S(	   sI  (tuple,tuple) -> float

    Calculate the cosine used to evaluate wheather the atoms
    coliding are inline or not

    Arguments:
    u,v: lists containing x1,y1,z1,x2,y2,z2 coordinates
    Returns:
    cos_angle: the cosine of the angle between center of the common atom
    and the mid point between the other two atoms.
    c         S   s0   |  d | d |  d | d |  d | d S(   Ni    i   i   (    (   t   ut   v(    (    sO   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/geometry_restraints/manager.pyR–  Å  s    c         S   s.   g  t  |  | ƒ D] \ } } | | d ^ q S(   Ni   (   R3  (   R­  R®  R  t   y(    (    sO   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/geometry_restraints/manager.pyR–  Ç  s    c         S   s-   t  j |  d d |  d d |  d d ƒ S(   Ni    i   i   (   R  R  (   R­  (    (    sO   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/geometry_restraints/manager.pyR–  É  s    c         S   s*   g  t  |  | ƒ D] \ } } | | ^ q S(   N(   R3  (   t   u1t   u2R  R¯  (    (    sO   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/geometry_restraints/manager.pyR–  Ë  s    i    i   i   i   (   Ra  t   ZeroDivisionError(   R­  R®  t   u_dot_vt   u_mid_vt   u_lent   make_vect   v1t   v2R°  R±  t   mid_uvt   vec1t   vec2t	   cos_angle(    (    sO   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/geometry_restraints/manager.pyt   cos_vec·  s8    				-
c         C   se   |  j  d ƒ }  t |  d ƒ } t |  d ƒ } t | | ƒ g  k } t | | ƒ g  k } | od | S(   sÆ  (str,dict) -> bool
    retrun true if the two atoms, which number is specified in "key" are single, double or tripple atom molecule

    Arguments:
    connectivty_table_2: connectivty_table[i] is a dictinary constaining a
                         list of all atoms connected to atom i
    key: a list "atom1 lable::atom1 number::sym.op.::atom2 label::atom2 number::sym.op."

    Return True is both atoms have no connection to atoms two bonds apart
    s   ::i   i   (   t   splitR‰   R£  (   R   RP  RB   RC   t   i_is_solventt   j_is_solvent(    (    sO   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/geometry_restraints/manager.pyt   are_both_solventè  s    c         C   s‚  g  g  g  g } i  } i  } xb|  j  D]W} | d } | d } | d } | d } | d }	 | | }
 |
 d k  r% |  j | | |  j |  j ƒ s||  j | ƒ \ } } } | | k rÍ d j | | g ƒ } n d j | | g ƒ } | | k ry| | | g | | <| | k rg  | | <n  | | k r3g  | | <n  | | j | | | |	 | g ƒ | | j | | | |	 | g ƒ qyq|q% q% Wxk| D]c} t | | ƒ d k r‡g  } t | | ƒ } x!t | d ƒ D]} xt | d | ƒ D]ñ} | | | d } | | | d } t	 t
 | j d ƒ ƒ } t	 t
 | j d ƒ ƒ } d	 } t | | | d	 j d ƒ d ƒ } t | | | d	 j d ƒ d ƒ } | |  j | k rïd
 d
 d
 g | | g k rï| | | d d k rì|  j | | ƒ } qìqïn  | d k r«| | k r«| | | d | | | d k  rk| j | | | ƒ | | | d } | | k r¨| | =q¨qÕ| j | | | ƒ | | | d } | | k rÕ| | =qÕqä| j | | | ƒ | j | | | ƒ qäWqÊW| | | <q‡q‡Wx� | j ƒ  D] \ } } | j d ƒ d d k r8| d	 j | d ƒ qû|  j | |  j ƒ re| d j | d ƒ qû| d j | d ƒ qûW| S(   sm  (self) -> [list,list,list]
    Collect inforamtion of clashing nonbonded proxies (neighboring atoms) for clash
    score calculation.
    - proxies considered to clash when model_distance - van_der_waals_distance < -0.41
    - For every atom consider only worst clash
    - Do not double count in-line clashes.
       for example, C-H1  H2-...
       if both C and H1 are clashing with H2 count only the worst of them
    - Exclude 1-5 interaction of Hydrogen and heavy atom

    Retruns:
    clashing_atoms_list: [[list of clashes due to sym operation],[list of solvent-solvent clashes],[list of all other clashes]]
    i   i   i   i   i   g=
×£p=Ú¿s   ::t   ,i    g        R@  gX9´Èv¾ë?(   RM  R¢  RN  RO  R¬  RÂ   R>   R   R˜  t   mapt   floatR¾  R‰   R½  t	   iteritemsRÁ  RP  (   R   t   clashing_atoms_listt   clashing_atoms_dictt   clashes_dictt   recR‹   R)  t   modelt   vdwt   symopRÔ   R«  R¦  R§  t	   clash_keyR   t   temp_clash_listt	   n_clashesRB   RC   t   vec_it   vec_jR­  R®  R¼  t   clashing_atom_1t   clashing_atom_2t
   remove_keyt   val(    (    sO   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/geometry_restraints/manager.pyR‚  û  sz    





   -%%$  (
   RX  RY  t   __doc__R/   t   staticmethodR¢  R¬  R½  RÁ  R‚  (    (    (    sO   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/geometry_restraints/manager.pyRS  "  s   	E)	1(   t
   __future__R    Rz   R   t   cctbx.geometry_restraints.flagst"   cctbx.geometry_restraints.energiesR   t   cctbx.array_familyR   t   scitbx.python_utils.miscR   t   libtbxR   R   R   t   libtbx.utilsR   R#  R  RF  t   boost.pythont   boostt   pythont
   import_extR	   R
   t   objectR   Rv  RÁ   RS  (    (    (    sO   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/geometry_restraints/manager.pyt   <module>   s6   $ÿ ÿ ÿ ÿ ·+	+