ó
±™xTc           @   s´   d  d l  m Z d  d l m Z d  d l Z d e f d „  ƒ  YZ d e f d „  ƒ  YZ d e f d	 „  ƒ  YZ d
 e f d „  ƒ  YZ	 d e f d „  ƒ  YZ
 d e f d „  ƒ  YZ d S(   iÿÿÿÿ(   t   division(   t   graphNt   Atomc           B   s   e  Z d  Z d „  Z RS(   s   
  Match results by identity
  c         K   s1   x* | j  ƒ  D] \ } } t |  | | ƒ q Wd  S(   N(   t   itemst   setattr(   t   selft   kwargst   namet   value(    (    sE   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/geometry/topology.pyt   __init__   s    (   t   __name__t
   __module__t   __doc__R	   (    (    (    sE   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/geometry/topology.pyR      s   t   Moleculec           B   sM   e  Z d  Z d d d „ Z e d „  ƒ Z e d „  ƒ Z d „  Z d „  Z RS(   s0   
  A graph-based 3D-description of a molecule
  t   vectort   setc         C   s7   t  j d d d | d | ƒ |  _  i  |  _ i  |  _ d  S(   Nt
   graph_typet
   undirectedt   vertex_typet	   edge_type(   R   t   adjacency_listt   atom_fort   xyz_for(   R   R   R   (    (    sE   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/geometry/topology.pyR	      s    		c         C   s%   t  t |  j j ƒ  |  j j ƒ  ƒ ƒ S(   N(   t   dictt   zipR   t   valuest   keys(   R   (    (    sE   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/geometry/topology.pyt   descriptor_for"   s    c         C   s   |  j  j ƒ  S(   N(   R   R   (   R   (    (    sE   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/geometry/topology.pyt   atoms(   s    c         C   sÈ   |  j  j d | ƒ } | \ } } } | |  j k s9 t ‚ xn |  j j ƒ  D]] \ } \ } }	 }
 |  j  j d | d | d t j | | d |	 | d |
 | d ƒ ƒ qI W| |  j | <| |  j | <d  S(   Nt   labelt   vertex1t   vertex2t   weighti   (	   R   t
   add_vertexR   t   AssertionErrorR   t   add_edget   matht   sqrtR   (   R   t   atomt   xyzt   d2t   x2t   y2t   z2t   d1t   x1t   y1t   z1(    (    sE   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/geometry/topology.pyt   add.   s    %.c         C   s   t  |  j ƒ S(   N(   t   lenR   (   R   (    (    sE   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/geometry/topology.pyt   sizeA   s    (	   R
   R   R   R	   t   propertyR   R   R0   R2   (    (    (    sE   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/geometry/topology.pyR      s   	t   Compoundc           B   s¹   e  Z d  Z d „  Z e d „  ƒ Z e d „  ƒ Z e d „  ƒ Z e d „  ƒ Z d „  Z	 d d „ Z
 d	 „  Z d
 „  Z d „  Z d „  Z e d d d „ ƒ Z e d d d d „ ƒ Z RS(   s3   
  A graph-based 2D-representation of a compound
  c            s5   | ˆ  _  t ‡  f d †  ˆ  j  j ƒ  Dƒ ƒ ˆ  _ d  S(   Nc         3   s*   |  ]  } ˆ  j  j d  | ƒ | f Vq d S(   t   vertexN(   R   t   vertex_label(   t   .0t   v(   R   (    sE   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/geometry/topology.pys	   <genexpr>O   s    (   R   R   t   verticesR   (   R   R   (    (   R   sE   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/geometry/topology.pyR	   K   s    	c         C   s%   t  t |  j j ƒ  |  j j ƒ  ƒ ƒ S(   N(   R   R   R   R   R   (   R   (    (    sE   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/geometry/topology.pyR   S   s    c         C   s   |  j  j ƒ  S(   N(   R   R   (   R   (    (    sE   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/geometry/topology.pyR   Y   s    c         C   s   |  j  j ƒ  S(   N(   R   R   (   R   (    (    sE   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/geometry/topology.pyt   descriptors_   s    c         c   sX   |  j  } xH |  j j ƒ  D]7 } | |  j j d | ƒ | |  j j d | ƒ f Vq Wd  S(   Nt   edge(   R   R   t   edgest   sourcet   target(   R   R   R;   (    (    sE   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/geometry/topology.pyt   bondse   s    	c         C   s    |  j  j d | ƒ |  j | <d  S(   NR   (   R   R!   R   (   R   R&   (    (    sE   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/geometry/topology.pyt   add_atomq   s    i   c         C   su   | |  j  k r" |  j d | ƒ n  | |  j  k rD |  j d | ƒ n  |  j j d |  j  | d |  j  | d | ƒ d  S(   NR&   R   R   R    (   R   R@   R   R#   (   R   t   leftt   rightt   order(    (    sE   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/geometry/topology.pyt   add_bondv   s    c            s–   | |  j  k r t d | ‚ n  d d l m } |  j  | } | j d | ƒ ‰ | j d |  j d | d ˆ ƒ |  j ‰  t ‡  ‡ f d †  |  j Dƒ ƒ S(	   Ns   Unknown atom: %siÿÿÿÿ(   t   breadth_first_searcht   start_vertexR   R5   t   visitorc         3   s.   |  ]$ } ˆ  | ˆ j  j | d  ƒ f Vq d  S(   N(   t   distance_fort   gett   None(   R7   R8   (   R   RG   (    sE   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/geometry/topology.pys	   <genexpr>–   s   (   R   t
   ValueErrorR   RE   t   distance_recording_visitorR   R   R:   (   R   R&   t   bfsR5   (    (   R   RG   sE   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/geometry/topology.pyt   distances_from…   s    			c            sw   t  ‡  f d †  | Dƒ ƒ s, t d | ‚ n  d d l m } | j d ˆ  j d ‡  f d †  | Dƒ ƒ } ˆ  j d | ƒ S(   Nc         3   s   |  ] } | ˆ  j  k Vq d  S(   N(   R   (   R7   t   a(   R   (    sE   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/geometry/topology.pys	   <genexpr>�   s    s   Unknown atoms: %siÿÿÿÿ(   t   maximum_cliqueR   R9   c         3   s   |  ] } ˆ  j  | Vq d  S(   N(   R   (   R7   RO   (   R   (    sE   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/geometry/topology.pys	   <genexpr>£   s    (   t   allRK   R   RP   t   selected_subgrapht	   __class__(   R   R   RP   t   subgraph(    (   R   sE   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/geometry/topology.pyt   subset›   s    		c         C   s\   d d l  m } | j d |  j  ƒ } |  j } g  | D]# } g  | D] } | | ^ qB ^ q5 S(   Niÿÿÿÿ(   t   connected_component_algorithmR   (   R   RV   t   connected_componentsR   (   R   t   ccat   resR   t   compR8   (    (    sE   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/geometry/topology.pyt   connected_segments©   s    	c         C   s‹   | |  j  k r t d | ‚ n  d d l m } |  j  | } | j d | ƒ } | j d |  j d | d | ƒ g  | j D] } t | ^ qw S(   Ns   Unknown atom: %siÿÿÿÿ(   RE   RF   R   R5   RG   (   R   RK   R   RE   t   vertex_recording_visitort   visited_verticesR   (   R   R&   RM   R5   RG   R8   (    (    sE   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/geometry/topology.pyt   connected_segment_from²   s    		R   R   c      	   C   s%   |  d t  j d d d | d | ƒ ƒ S(   NR   R   R   R   R   (   R   R   (   t   clsR   R   (    (    sE   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/geometry/topology.pyt   createÄ   s
    	gš™™™™™¹?c         C   s  |  j  d | d | ƒ } x | D] } | j d | ƒ q Wd d  l } d d l m } x© | j | d ƒ D]• \ }	 }
 |	 j \ } } } |
 j \ } } } | | d | | d | | d } | j |	 j |
 j ƒ } | | | d k  rh | j	 |	 |
 ƒ qh qh W| S(   NR   R   R&   iÿÿÿÿ(   t   bondlength_defaultsi   (
   R`   R@   t	   itertoolst   mmtbx.monomer_libraryRa   t   combinationsR'   t   get_default_bondlengtht   elementRD   (   R_   R   t	   toleranceR   R   t   compoundRO   Rb   Ra   t   a1t   a2R-   R.   R/   R)   R*   R+   t   dist2t   expected(    (    sE   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/geometry/topology.pyt   from_structureÐ   s    &(   R
   R   R   R	   R3   R   R   R:   R?   R@   RD   RN   RU   R[   R^   t   classmethodR`   Rm   (    (    (    sE   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/geometry/topology.pyR4   F   s    							t   RascalMatchc           B   sD   e  Z d  Z g  d d d „ Z d „  Z d „  Z d „  Z d „  Z RS(   sQ   
  Geometry and label-based correspondence matching using the Rascal algorithm
  c      	   C   sø  | d  k r$ d d  l } | j } n  | d  k rH d d  l } | j } n  | j |  _ | j |  _ g  g |  _ d |  _ d d l m	 } | j
 d | j d | j d | d | ƒ |  _ | |  _ |  j rÛ| j } | j }	 t g  |  j D]  \ }
 } | |
 |	 | f ^ qã ƒ } g  |  j j ƒ  D]' } |  j j d | ƒ | k r| ^ q} t | ƒ t |  j ƒ k sjt ‚ t |  j j d | d ƒ ƒ } x. | d	 D]" } | j |  j j d | ƒ ƒ q”W| j d
 |  j d | ƒ |  _ n  | j d
 |  j d |  ƒ d  S(   Niÿÿÿÿi    (   RP   t   firstt   secondt   vertex_equalityt   edge_equalityR5   i   R   R9   t   callable(   RJ   t   operatort   eqR   t	   molecule1t	   molecule2t   bestt   largestR   RP   t   compatibility_grapht   compat_grapht
   prematchedR   R   R9   R6   R1   R"   t   adjacent_verticest   intersection_updateRR   t   rascal(   R   Rw   Rx   R}   Rr   Rs   Ru   RP   t
   desc_for_1t
   desc_for_2t   lt   rt   pairsR8   R9   t
   neighbours(    (    sE   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/geometry/topology.pyR	   í   s@    									3'! 		c         C   s   t  |  j ƒ S(   N(   R1   Ry   (   R   (    (    sE   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/geometry/topology.pyt   count%  s    c         C   s   t  |  j ƒ |  j S(   N(   R1   R}   Rz   (   R   (    (    sE   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/geometry/topology.pyt   length*  s    c         C   s‰   g  |  j  D]. } g  | D] } |  j j d | ƒ ^ q ^ q
 } g  | D]@ } |  j g  | D]& \ } } |  j | |  j | f ^ qX ^ qE S(   NR5   (   Ry   R|   R6   R}   Rw   Rx   (   R   t   matchR8   t   matchesR…   Rƒ   R„   (    (    sE   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/geometry/topology.pyt   remapped/  s    ;c         C   sY   t  | ƒ } |  j | k  r3 | |  _ | g |  _ n" |  j | k rU |  j j | ƒ n  d  S(   N(   R1   Rz   Ry   t   append(   R   t   resultR2   (    (    sE   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/geometry/topology.pyt   __call__=  s    	N(	   R
   R   R   RJ   R	   R‡   Rˆ   R‹   RŽ   (    (    (    sE   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/geometry/topology.pyRo   è   s   2			t   McGregorMatchc           B   s;   e  Z d  Z d d d d „ Z d „  Z d „  Z d „  Z RS(   sS   
  Geometry and label-based correspondence matching using the McGregor algorithm
  iô  c   	      C   sÆ   | d  k r$ d d  l } | j } n  | d  k rH d d  l } | j } n  | j |  _ | j |  _ | |  _ g  |  _ d |  _ | |  _	 d d l
 m } | j d | j
 d | j
 d | d | d |  ƒ d  S(	   Niÿÿÿÿi    (   t   graph_structure_comparisont   graph1t   graph2Rr   Rs   t   callback(   RJ   Ru   Rv   R   Rw   Rx   t   is_validRy   t   stepst   maxstepsR   R�   t    mcgregor_common_subgraphs_unique(	   R   Rw   Rx   R”   R–   Rr   Rs   Ru   t   gsc(    (    sE   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/geometry/topology.pyR	   N  s&    
							c         C   s   t  |  j ƒ S(   N(   R1   Ry   (   R   (    (    sE   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/geometry/topology.pyRˆ   q  s    c         C   s4   g  |  j  D]& \ } } |  j | |  j | f ^ q
 S(   N(   Ry   Rw   Rx   (   R   Rƒ   R„   (    (    sE   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/geometry/topology.pyR‹   v  s    c            sŸ   t  | ƒ t  ˆ  j ƒ k r- ˆ  j d 7_ nb ˆ  j ‡  f d †  | Dƒ ƒ r€ ˆ  j ‡  f d †  | Dƒ ƒ r€ | ˆ  _ d ˆ  _ n ˆ  j d 7_ ˆ  j ˆ  j k S(   Ni   c         3   s    |  ] } ˆ  j  | d  Vq d S(   i    N(   Rw   (   R7   t   m(   R   (    sE   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/geometry/topology.pys	   <genexpr>‚  s    c         3   s    |  ] } ˆ  j  | d  Vq d S(   i   N(   Rx   (   R7   R™   (   R   (    sE   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/geometry/topology.pys	   <genexpr>ƒ  s    i    (   R1   Ry   R•   R”   R–   (   R   R‰   (    (   R   sE   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/geometry/topology.pyRŽ   }  s    	N(   R
   R   R   RJ   R	   Rˆ   R‹   RŽ   (    (    (    sE   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/geometry/topology.pyR�   I  s   		t   GreedyMatchc           B   s>   e  Z d  Z g  d d d d „ Z d „  Z d „  Z d „  Z RS(   sQ   
  Geometry and label-based correspondence matching using the Greedy algorithm
  i    c      	   C   sý  | d  k r$ d d  l } | j } n  | d  k rH d d  l } | j } n  | j |  _ | j |  _ g  g |  _ d |  _ d d l m	 } | j
 d | j d | j d | d | ƒ |  _ | |  _ |  j rÛ| j }	 | j }
 t g  |  j D]  \ } } |	 | |
 | f ^ qã ƒ } g  |  j j ƒ  D]' } |  j j d | ƒ | k r| ^ q} t | ƒ t |  j ƒ k sjt ‚ t |  j j d | d ƒ ƒ } x. | d	 D]" } | j |  j j d | ƒ ƒ q”W| j d
 |  j d | ƒ |  _ n  | j d
 |  j d | ƒ |  _ d  S(   Niÿÿÿÿi    (   RP   Rp   Rq   Rr   Rs   R5   i   R   R9   t   maxsol(   RJ   Ru   Rv   R   Rw   Rx   Ry   Rz   R   RP   R{   R|   R}   R   R   R9   R6   R1   R"   R~   R   RR   t   greedyR�   (   R   Rw   Rx   R}   Rr   Rs   R›   Ru   RP   R�   R‚   Rƒ   R„   R…   R8   R9   R†   (    (    sE   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/geometry/topology.pyR	   ’  s@    
								3'! 		c         C   s   t  |  j ƒ S(   N(   R1   R�   (   R   (    (    sE   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/geometry/topology.pyR‡   Ë  s    c         C   s-   |  j  s t ‚ t |  j ƒ t |  j  d ƒ S(   Ni    (   R�   R"   R1   R}   (   R   (    (    sE   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/geometry/topology.pyRˆ   Ð  s    c         C   s‰   g  |  j  D]. } g  | D] } |  j j d | ƒ ^ q ^ q
 } g  | D]@ } |  j g  | D]& \ } } |  j | |  j | f ^ qX ^ qE S(   NR5   (   R�   R|   R6   R}   Rw   Rx   (   R   R‰   R8   RŠ   R…   Rƒ   R„   (    (    sE   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/geometry/topology.pyR‹   Ö  s    ;N(   R
   R   R   RJ   R	   R‡   Rˆ   R‹   (    (    (    sE   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/geometry/topology.pyRš   �  s   2		(   t
   __future__R    t   boost_adaptbxR   R$   t   objectR   R   R4   Ro   R�   Rš   (    (    (    sE   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/geometry/topology.pyt   <module>   s   4¢aD