ó
šxTc           @   sš  d  „  Z  d „  Z d e f d „  ƒ  YZ d e f d „  ƒ  YZ d e f d „  ƒ  YZ d e f d	 „  ƒ  YZ d
 „  Z d e f d „  ƒ  YZ d e f d „  ƒ  YZ	 d e f d „  ƒ  YZ
 d „  Z d „  Z d „  Z d e f d „  ƒ  YZ d e f d „  ƒ  YZ d „  Z d „  Z d „  Z d e f d „  ƒ  YZ d „  Z d „  Z d e f d  „  ƒ  YZ d! e f d" „  ƒ  YZ d# e f d$ „  ƒ  YZ d% d& „ Z d' „  Z d( S()   c         C   sH   |  j  \ } } } | j  \ } } } | | d | | d | | d S(   Ni   (   t   xyz(   t   leftt   rightt   x1t   y1t   z1t   x2t   y2t   z2(    (    s:   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/carve.pyt   distance_square   s    c         C   s   t  |  j ƒ  | j ƒ  ƒ S(   s8   
  Calculates the distance in residue sequence number
  (   t   abst   resseq_as_int(   R   R   (    (    s:   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/carve.pyt   resseq_distance
   s    t   DistanceCalculateStrategyc           B   s    e  Z d  Z d „  Z d „  Z RS(   s$   
  Calculates distance every time
  c         C   s   | |  _  d  S(   N(   t   method(   t   selfR   (    (    s:   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/carve.pyt   __init__   s    c         C   s   |  j  d | d | ƒ S(   NR   R   (   R   (   R   R   R   (    (    s:   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/carve.pyt   __call__   s    (   t   __name__t
   __module__t   __doc__R   R   (    (    (    s:   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/carve.pyR      s   	t   DistanceCacheStrategyc           B   s    e  Z d  Z d „  Z d „  Z RS(   s-   
  Caches the distances already calculated
  c         C   s   i  |  _  | |  _ d  S(   N(   t   d_sq_forR   (   R   R   (    (    s:   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/carve.pyR   '   s    	c         C   sN   t  | | f ƒ } | |  j k rC |  j d | d | ƒ |  j | <n  |  j | S(   NR   R   (   t	   frozensetR   R   (   R   R   R   t   key(    (    s:   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/carve.pyR   -   s    "(   R   R   R   R   R   (    (    (    s:   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/carve.pyR   "   s   	t   MinDistanceFromSetc           B   s    e  Z d  Z d „  Z d „  Z RS(   s1   
  Minimum distance square from a set of atoms
  c         C   s   | |  _  | |  _ d  S(   N(   t   otherst
   calculator(   R   R   R   (    (    s:   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/carve.pyR   =   s    	c            s    t  ‡  ‡ f d †  ˆ j Dƒ ƒ S(   Nc         3   s'   |  ] } ˆ j  d  ˆ  d | ƒ Vq d S(   R   R   N(   R   (   t   .0t   o(   t   entityR   (    s:   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/carve.pys	   <genexpr>E   s    (   t   minR   (   R   R   (    (   R   R   s:   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/carve.pyR   C   s    (   R   R   R   R   R   (    (    (    s:   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/carve.pyR   8   s   	t   ClosestToSetc           B   s   e  Z d  Z d „  Z RS(   s9   
  Finds the entity closest to a set of other entities
  c            sJ   t  d | d | ƒ ‰  t ‡  f d †  | Dƒ d d „  ƒ\ |  _ |  _ d  S(   NR   R   c         3   s!   |  ] } | ˆ  | ƒ f Vq d  S(   N(    (   R   t   a(   t   calc(    s:   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/carve.pys	   <genexpr>Q   s    R   c         S   s   |  d S(   Ni   (    (   t   p(    (    s:   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/carve.pyt   <lambda>R   s    (   R   R   R   t   distance(   R   t	   selectionR   R   (    (   R"   s:   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/carve.pyR   M   s    (   R   R   R   R   (    (    (    s:   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/carve.pyR    H   s   c         C   s=   |  j  ƒ  j  ƒ  } | j  ƒ  } | j  ƒ  j  ƒ  } | | | f S(   N(   t   parent(   t   atomt   residue_groupt   chaint   root(    (    s:   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/carve.pyt   parent_infoW   s    t   AtomHierarchyc           B   sw   e  Z d  Z d „  Z e d „  ƒ Z e d „  ƒ Z e d „  ƒ Z e d „  ƒ Z d „  Z	 d „  Z
 d „  Z d	 „  Z RS(
   s2   
  A fast way to find the children of an entity
  c         C   s   i  |  _  i  |  _ i  |  _ d  S(   N(   t   in_residue_groupt   in_chaint   in_root(   R   (    (    s:   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/carve.pyR   e   s    		c         C   s   |  j  S(   N(   R.   (   R   (    (    s:   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/carve.pyt   residue_groupsl   s    c         C   s   |  j  S(   N(   R/   (   R   (    (    s:   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/carve.pyt   chainsr   s    c         C   s   |  j  S(   N(   R0   (   R   (    (    s:   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/carve.pyt   rootsx   s    c         C   s+   d d  l  } t | j |  j j ƒ  t ƒ  ƒ S(   Niÿÿÿÿ(   t   operatort   reducet   or_R0   t   valuest   set(   R   R4   (    (    s:   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/carve.pyt   atoms~   s    c         C   sy   t  d | ƒ \ } } } |  j j | t ƒ  ƒ j | ƒ |  j j | t ƒ  ƒ j | ƒ |  j j | t ƒ  ƒ j | ƒ d  S(   NR(   (   R,   R.   t
   setdefaultR8   t   addR/   R0   (   R   R(   t   rgR*   R+   (    (    s:   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/carve.pyR;   …   s    c         C   sŠ   xƒ | D]{ } t  d | ƒ \ } } } |  j j | t ƒ  ƒ j | ƒ |  j j | t ƒ  ƒ j | ƒ |  j j | t ƒ  ƒ j | ƒ q Wd  S(   NR(   (   R,   R.   R:   R8   R;   R/   R0   (   R   R9   R(   R<   R*   R+   (    (    s:   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/carve.pyt   add_multipleŽ   s
    c         C   s¦   t  d | ƒ \ } } } |  j | j | ƒ |  j | j | ƒ |  j | j | ƒ |  j | sn |  j | =n  |  j | sˆ |  j | =n  |  j | s¢ |  j | =n  d  S(   NR(   (   R,   R.   t   removeR/   R0   (   R   R(   R<   R*   R+   (    (    s:   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/carve.pyR>   ˜   s    c   	      C   s,  t  ƒ  } t  ƒ  } t  ƒ  } x‰ | D]� } t d | ƒ \ } } } |  j | j | ƒ |  j | j | ƒ |  j | j | ƒ | j | ƒ | j | ƒ | j | ƒ q" Wx( | D]  } |  j | s® |  j | =q® q® Wx( | D]  } |  j | sÙ |  j | =qÙ qÙ Wx( | D]  } |  j | s|  j | =qqWd  S(   NR(   (   R8   R,   R.   R>   R/   R0   R;   (	   R   R9   t   rgsR2   R3   R(   R<   R*   R+   (    (    s:   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/carve.pyt   remove_multipleª   s(    			(   R   R   R   R   t   propertyR1   R2   R3   R9   R;   R=   R>   R@   (    (    (    s:   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/carve.pyR-   `   s   				
	t   UnresolvedClashesc           B   sY   e  Z d  Z d „  Z e d „  ƒ Z e d „  ƒ Z d „  Z d „  Z d „  Z	 d „  Z
 RS(   s5   
  Clashes not resolved and atoms still in clashes
  c         C   sh   i  |  _  xX | D]P } |  j  j | j j t ƒ  ƒ j | ƒ |  j  j | j j t ƒ  ƒ j | ƒ q Wd  S(   N(   t   for_atomR:   R   R(   R8   R;   R   (   R   t   clashest   clash(    (    s:   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/carve.pyR   Ì   s    	%c         C   s   |  j  S(   N(   RC   (   R   (    (    s:   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/carve.pyR9   Õ   s    c         C   s#   t  ƒ  } | j |  j j ƒ  Œ  | S(   N(   R8   t   updateRC   R7   (   R   t   result(    (    s:   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/carve.pyRD   Û   s    	c         C   sÆ   t  ƒ  } xu t |  j | ƒ D]` } |  j | j j j | ƒ |  j | j j j | ƒ | j | j j ƒ | j | j j ƒ q Wt  ƒ  } x5 | D]- } |  j | s‘ |  j | =| j | ƒ q‘ q‘ W| S(   N(   R8   t   listRC   R   R(   t   discardR   R;   (   R   R(   t   changedRE   t	   affectedsR!   (    (    s:   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/carve.pyR>   ä   s    		
c         C   s×   t  ƒ  } x† | D]~ } xu t |  j | ƒ D]` } |  j | j j j | ƒ |  j | j j j | ƒ | j | j j ƒ | j | j j ƒ q* Wq Wt  ƒ  } x5 | D]- } |  j | s¢ |  j | =| j | ƒ q¢ q¢ W| S(   N(   R8   RH   RC   R   R(   RI   R   R;   (   R   R9   t   changedsR(   RE   RK   R!   (    (    s:   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/carve.pyR@   ø   s    		
c         C   s   |  j  | S(   N(   RC   (   R   R(   (    (    s:   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/carve.pyt   clashes_for  s    c         C   s]   t  ƒ  } x@ |  j d | ƒ D], } | j | j j ƒ | j | j j ƒ q W| j | ƒ | S(   NR(   (   R8   RM   R;   R   R(   R   R>   (   R   R(   t	   clashingsRE   (    (    s:   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/carve.pyt   atoms_clashing_with  s    	(   R   R   R   R   RA   R9   RD   R>   R@   RM   RO   (    (    (    s:   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/carve.pyRB   Ç   s   						t#   SequenceAndSpatialDistanceSelectionc           B   sP   e  Z d  Z d „  Z e d „  ƒ Z e d „  ƒ Z d „  Z d „  Z d „  Z	 RS(   s'   
  Contains the state of the process
  c         C   sR   | |  _  t ƒ  |  _ x$ |  j  j D] } |  j j | ƒ q" W| |  _ | |  _ d  S(   N(   t
   unresolvedR-   t	   hierarchyR9   R;   t   spatial_distanceR   (   R   RQ   RS   R   R(   (    (    s:   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/carve.pyR   $  s    		c         C   s
   |  j  j S(   N(   RQ   RD   (   R   (    (    s:   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/carve.pyRD   0  s    c         C   s
   |  j  j S(   N(   RQ   R9   (   R   (    (    s:   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/carve.pyR9   6  s    c         C   s=   |  j  j d | ƒ } x! | D] } |  j j d | ƒ q Wd  S(   NR(   (   RQ   R>   RR   (   R   R(   RK   R!   (    (    s:   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/carve.pyR>   <  s    c         C   s,   |  j  j d | ƒ } |  j j d | ƒ d  S(   NR9   (   RQ   R@   RR   (   R   R9   RK   (    (    s:   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/carve.pyR@   D  s    c         C   s   t  |  j j d | ƒ ƒ S(   NR(   (   t   lenRQ   RM   (   R   R(   (    (    s:   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/carve.pyt   clash_count_forJ  s    (
   R   R   R   R   RA   RD   R9   R>   R@   RU   (    (    (    s:   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/carve.pyRP     s   			c         C   s   t  |  j d |  j ƒS(   NR   (   t   maxR9   RU   (   t	   remaining(    (    s:   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/carve.pyt'   select_first_atom_based_on_clash_numberP  s    c            s,   t  ‡  ‡ f d †  |  Dƒ d d „  ƒj g S(   Nc         3   s>   |  ]4 } t  d  ˆ j j | d ˆ  j | d ˆ j ƒ Vq d S(   R&   R   R   N(   R    RR   R.   RS   (   R   R<   (   t   moribundRW   (    s:   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/carve.pys	   <genexpr>Y  s   R   c         S   s   |  j  S(   N(   R%   (   t   s(    (    s:   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/carve.pyR$   `  s    (   R   R   (   R?   RW   RY   (    (   RY   RW   s:   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/carve.pyt5   select_atom_from_same_residue_group_maximal_proximityU  s    
c            s>   t  ‡  ‡ f d †  |  Dƒ d d „  ƒj } t d | d ˆ ƒ S(   Nc         3   s>   |  ]4 } t  d  ˆ j j | d ˆ  j | d ˆ j ƒ Vq d S(   R&   R   R   N(   R    RR   R.   RS   (   R   R<   (   RY   RW   (    s:   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/carve.pys	   <genexpr>h  s   R   c         S   s   |  j  S(   N(   R%   (   RZ   (    (    s:   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/carve.pyR$   o  s    R(   RW   (   R   R   t>   select_passed_or_all_atoms_in_residue_group_if_no_self_clashes(   R?   RW   RY   t   seed(    (   RY   RW   s:   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/carve.pytF   select_all_atoms_from_same_residue_group_or_one_with_maximal_proximityd  s    
t6   select_atom_from_same_residue_group_in_bond_or_closestc           B   s   e  Z d  d „ Z d „  Z RS(   gÍÌÌÌÌÌü?c         C   s   | d |  _  d  S(   Ni   (   t   bond_distance_sq(   R   t   bond_distance(    (    s:   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/carve.pyR   z  s    c   	      C   s¢   d } xŽ | D]† } t d | j | d | j ƒ } x^ | j j | D]L } | d | ƒ } | |  j k  rn | g S| d | k  rC | | f } qC qC Wq W| d g S(   NR   R   R   i   i    (   NN(   t   NoneR   R.   RS   RR   R`   (	   R   R?   RW   RY   t   closestR<   R"   R(   t   min_dist_square(    (    s:   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/carve.pyR     s    (   R   R   R   R   (    (    (    s:   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/carve.pyR_   x  s   t?   select_atom_from_nearby_residue_group_or_closest_within_a_chainc           B   s   e  Z d  „  Z d „  Z RS(   c         C   s   | |  _  d  S(   N(   t   max_sequence_distance(   R   Rf   (    (    s:   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/carve.pyR   —  s    c            s�   t  ‡  ‡ f d †  | Dƒ d d „  ƒ} | j |  j k r] t ˆ j j | j d ˆ j ƒg St  ‡  ‡ f d †  | Dƒ d d „  ƒj g Sd  S(   Nc      	   3   s€   |  ]v } t  d  g  ˆ j j D] } | j ƒ  | k r | ^ q d g  ˆ  j D] } | j ƒ  | k rJ | ^ qJ d ˆ j ƒ Vq d S(   R&   R   R   N(   R    RR   R1   R'   R   (   R   R*   R<   (   RY   RW   (    s:   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/carve.pys	   <genexpr>   s   R   c         S   s   |  j  S(   N(   R%   (   RZ   (    (    s:   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/carve.pyR$   ©  s    c         3   s>   |  ]4 } t  d  ˆ j j | d ˆ  j | d ˆ j ƒ Vq d S(   R&   R   R   N(   R    RR   R/   RS   (   R   R*   (   RY   RW   (    s:   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/carve.pys	   <genexpr>µ  s   c         S   s   |  j  S(   N(   R%   (   RZ   (    (    s:   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/carve.pyR$   ¼  s    (   R   R%   Rf   RV   RR   R.   R   RU   (   R   R2   RW   RY   Rc   (    (   RY   RW   s:   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/carve.pyR   œ  s    

(   R   R   R   R   (    (    (    s:   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/carve.pyRe   •  s   	c         C   s    t  d „  | j d |  ƒ Dƒ ƒ S(   Nc         s   s'   |  ] } | j  j | j j k Vq d  S(   N(   R   R)   R   (   R   t   c(    (    s:   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/carve.pys	   <genexpr>Ã  s   R(   (   t   anyRM   (   R(   RQ   (    (    s:   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/carve.pyt    has_clashes_within_residue_groupÀ  s    c         C   s    t  d „  | j d |  ƒ Dƒ ƒ S(   Nc         s   s'   |  ] } | j  j | j j k Vq d  S(   N(   R   R*   R   (   R   Rg   (    (    s:   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/carve.pys	   <genexpr>Ë  s   R(   (   Rh   RM   (   R(   RQ   (    (    s:   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/carve.pyt   has_clashes_within_chainÈ  s    c            sM   ˆ  j  j |  j ƒ  j ƒ  } t ‡  f d †  | Dƒ ƒ rB | j ƒ  S|  g Sd  S(   Nc         3   s(   |  ] } t  d  | d ˆ  j ƒ Vq d S(   R(   RQ   N(   Ri   RQ   (   R   R!   (   RW   (    s:   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/carve.pys	   <genexpr>Ø  s   (   RR   R.   R'   t   allt   copy(   R(   RW   t
   candidates(    (   RW   s:   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/carve.pyR\   Ð  s    
t>   select_atoms_in_nearby_residue_group_or_closest_within_a_chainc           B   s   e  Z d  „  Z d „  Z RS(   c         C   s   | |  _  d  S(   N(   Rf   (   R   Rf   (    (    s:   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/carve.pyR   æ  s    c            s�   t  ‡  ‡ f d †  | Dƒ d d „  ƒ} | j |  j k r_ t ˆ j j | j d ˆ j ƒ} n+ t  ‡  ‡ f d †  | Dƒ d d „  ƒj } t d | d ˆ ƒ S(   Nc      	   3   s€   |  ]v } t  d  g  ˆ j j D] } | j ƒ  | k r | ^ q d g  ˆ  j D] } | j ƒ  | k rJ | ^ qJ d ˆ j ƒ Vq d S(   R&   R   R   N(   R    RR   R1   R'   R   (   R   R*   R<   (   RY   RW   (    s:   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/carve.pys	   <genexpr>ï  s   R   c         S   s   |  j  S(   N(   R%   (   RZ   (    (    s:   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/carve.pyR$   ø  s    c         3   s>   |  ]4 } t  d  ˆ j j | d ˆ  j | d ˆ j ƒ Vq d S(   R&   R   R   N(   R    RR   R/   RS   (   R   R*   (   RY   RW   (    s:   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/carve.pys	   <genexpr>  s   c         S   s   |  j  S(   N(   R%   (   RZ   (    (    s:   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/carve.pyR$     s    R(   RW   (	   R   R%   Rf   RV   RR   R.   R   RU   R\   (   R   R2   RW   RY   Rc   R]   (    (   RY   RW   s:   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/carve.pyR   ë  s    

(   R   R   R   R   (    (    (    s:   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/carve.pyRn   ä  s   	c      
   C   sk   t  g  |  D]J } t  g  | j j | D] } | | j d | ƒ f ^ q$ d d „  ƒ^ q
 d d „  ƒd g S(   NR(   R   c         S   s   |  d S(   Ni   (    (   R#   (    (    s:   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/carve.pyR$     s    c         S   s   |  d S(   Ni   (    (   R#   (    (    s:   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/carve.pyR$      s    i    (   RV   RR   R0   RU   (   R3   RW   RY   R+   R!   (    (    s:   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/carve.pyt/   select_atom_from_with_highest_number_of_clashes  s
    T	c         C   s   t  | j j |  d | j ƒS(   NR   (   RV   RR   R0   RU   (   R+   RW   RY   (    (    s:   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/carve.pyt4   select_atom_from_root_with_highest_number_of_clashes$  s    t   ClashResolutionc           B   s)   e  Z d  Z g  d „ Z e d „  ƒ Z RS(   su   
  Contains a clash list and a set of atoms that need to be deleted to resolve
  these. Acts mostly as a milestone
  c         C   s+   | |  _  | j d |  j  d | ƒ |  _ d  S(   NRD   t   preassigned(   RD   t   resolveRY   (   R   RD   t	   algorithmRr   (    (    s:   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/carve.pyR   2  s    			c         C   sG   t  ƒ  } x7 |  j D], } | j | j j ƒ | j | j j ƒ q W| S(   N(   R8   RD   R;   R   R(   R   (   R   R9   Rg   (    (    s:   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/carve.pyR9   ;  s
    	(   R   R   R   R   RA   R9   (    (    (    s:   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/carve.pyRq   ,  s   	t#   SequenceAndSpatialDistanceAlgorithmc           B   sG   e  Z d  Z e e e d d ƒ e e e d „ Z d „  Z	 g  d „ Z
 RS(   s‹  
  Selects atoms for removal.
  
  If there are atoms from the same model (i.e. clash must be with symmetry
  equivalent), the following algorithm is used (in order of priority):
   
  1. select an atom from the same residue_group (with maximal spatial proximity)
  2. select a residue_group that is from the same chain and close in sequence
     (up to N residues); select the atom with the largest number of clashes.
     If no such residue_group exists, then based on spatial proximity.
  3. select an atom with the largest number of clashes
  
  If there are no atoms from the same model(s), select an atom with the largest
  number of clashes.
  Rf   i   c         C   s:   | |  _  | |  _ | |  _ | |  _ | |  _ | |  _ d  S(   N(   t   first_atom_selectiont   from_same_residue_groupt   from_same_chaint   from_same_roott   spatial_distance_strategyt   resseq_distance_strategy(   R   Rv   Rw   Rx   Ry   Rz   R{   (    (    s:   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/carve.pyR   X  s    					c         C   sÐ   t  | j ƒ j | j j ƒ } | r@ |  j d | d | d | ƒ St  | j ƒ j | j j ƒ } | r€ |  j d | d | d | ƒ St  | j ƒ j | j j ƒ } | rÀ |  j d | d | d | ƒ S|  j	 d | ƒ S(   NR?   RW   RY   R2   R3   (
   R8   R1   t   intersectionRR   Rw   R2   Rx   R3   Ry   Rv   (   R   RY   RW   t   common(    (    s:   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/carve.pyt   consecutive_atom_selectionm  s,    			c      	   C   sö   | s t  ƒ  St d t d | ƒ d |  j d t ƒ d |  j d t ƒ ƒ } t ƒ  } | r{ | j d | ƒ | j	 d | ƒ n, |  j
 d | ƒ } | j | ƒ | j | ƒ xE | j rî |  j d | d | ƒ } | j	 d | ƒ | j d | ƒ qª W| j S(	   NRQ   RD   RS   R   R   R9   RW   RY   (   R8   RP   RB   Rz   R	   R{   R   R-   R=   R@   Rv   R;   R>   RD   R~   R9   (   R   RD   Rr   RW   RY   t   firstt	   selecteds(    (    s:   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/carve.pyRs   —  s(    			(   R   R   R   RX   R[   Rn   Ro   R   R   R~   Rs   (    (    (    s:   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/carve.pyRu   G  s   	*t   HierarchicalAlgorithmc           B   sP   e  Z d  Z e e e d d ƒ e e e d „ Z g  d „ Z	 d „  Z
 d „  Z RS(   sã  
  Selects atoms for removal.
  
  Processing is done according to PDB hierarchy:
  1. First, a suitable atom is selected as the starting point.
  2. Within the same root:
    a. Within the same chain:
      - Discard all atoms that clash with other chains.
      - Go through the remaining residue groups, and resolve clashes
    b. If there are still atoms from the same root, select it, and repeat a.
  3. If there are still unresolved clashes, select a new atom, and repeat 2.
  Rf   i   c         C   s:   | |  _  | |  _ | |  _ | |  _ | |  _ | |  _ d  S(   N(   Rv   Rw   Rx   Ry   Rz   R{   (   R   Rv   Rw   Rx   Ry   Rz   R{   (    (    s:   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/carve.pyR   Ê  s    					c      	   C   s   | s t  ƒ  St d t d | ƒ d |  j d t ƒ d |  j d t ƒ ƒ } t ƒ  } | r¸ | j d | ƒ | j	 d | ƒ x= t  d „  | Dƒ ƒ D]" } |  j
 d | d	 | d
 | ƒ q� Wn  x^ | j j r|  j d
 | ƒ } | j d | ƒ | j d | ƒ |  j d | d	 | d
 | ƒ q» W| j S(   s\   
    A generic algorithm that takes the PDB hierarchy into account for clash resolution
    RQ   RD   RS   R   R   R9   c         s   s'   |  ] } | j  ƒ  j  ƒ  j  ƒ  Vq d  S(   N(   R'   (   R   R!   (    (    s:   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/carve.pys	   <genexpr>ó  s    R*   RY   RW   R(   (   R8   RP   RB   Rz   R	   R{   R   R-   R=   R@   t   resolve_chainRQ   RD   Rv   R;   R>   t   resolve_root_ofR9   (   R   RD   Rr   RW   RY   R*   t   selected(    (    s:   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/carve.pyRs   ß  s0    			c         C   sí   | j  ƒ  j  ƒ  j  ƒ  } |  j d | d | d | ƒ | j  ƒ  j  ƒ  } x  | | j j k rè |  j d | d | d | ƒ } | j d | ƒ | j d | ƒ | j  ƒ  j  ƒ  j  ƒ  } |  j d | d | d | ƒ | | j j k sI t ‚ qI Wd  S(   NR*   RY   RW   R+   R(   (	   R'   R‚   RR   R3   Ry   R;   R>   R2   t   AssertionError(   R   R(   RY   RW   R*   R+   R„   (    (    s:   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/carve.pyRƒ     s&    				c         C   sP  g  | j  j j | g  ƒ D]$ } t d | d | j ƒ s | ^ q } | j d | ƒ | j d | ƒ xæ | | j  j k rKt | j	 ƒ j
 | j  j	 ƒ } | rà |  j d | d | d | ƒ } | j d | ƒ | j d | ƒ qf n  t | j ƒ j
 | j  j ƒ } | s
t ‚ |  j d | d | d | ƒ } | j d | ƒ | j d | ƒ qf Wd  S(   NR(   RQ   R9   R?   RW   RY   R2   (   RR   R/   t   getRj   RQ   R@   R=   R2   R8   R1   R|   Rw   R…   Rx   (   R   R*   RY   RW   R!   t   clashing_with_aliensR}   R€   (    (    s:   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/carve.pyR‚   "  s0    $				(   R   R   R   RX   R[   Rn   Rp   R   R   Rs   Rƒ   R‚   (    (    (    s:   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/carve.pyR�   ¼  s   (	i   c         c   sX  d d l  m } | j d d d d d d ƒ } i  } xp t |  j ƒ  ƒ D]\ } | j d	 | ƒ } | j | j j t ƒ  ƒ j	 | ƒ | j | j
 j t ƒ  ƒ j	 | ƒ qG WxA | j ƒ  D]3 } | j ƒ  } x | D] }	 | j | |	 ƒ qÍ Wq´ Wd d
 l m }
 xV |
 j d | ƒ D]B } t | ƒ | k  r,qn  g  | D] } | j d | ƒ ^ q3VqWd  S(   Niÿÿÿÿ(   t   grapht
   graph_typet
   undirectedt   vertex_typet   vectort	   edge_typeR8   t   label(   t   connected_component_algorithmRˆ   t   vertex(   t   boost_adaptbxRˆ   t   adjacency_listR8   t   pairst
   add_vertexR:   R   R(   R;   R   R7   t   popt   add_edgeR�   t   connected_componentsRT   t   vertex_label(   t
   collectiont   min_clash_networkRˆ   t   gt   clashes_incident_onRE   t   vidt   networkR   t   desct   ccat	   componentt   v(    (    s:   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/carve.pyt	   calculateI  s&    		"&c         C   s¯  |  j  } t d | ƒ } |  j } | j |  j ƒ } x? |  j  D]4 } | j j | j j k r= | j | j j ƒ q= q= Wg  } x-| | k rªt	 d | d | d | ƒ } xR | D]J }	 | j
 d |	 ƒ }
 | j j |
 ƒ r¬ | j j |	 ƒ | j |	 ƒ q¬ q¬ Wxx t | ƒ D]] \ } } | j j | j ƒ s=| j j |  j ƒ rA| S| j j | j ƒ r| | | <PqqW| j | ƒ | j | j ƒ } | j | ƒ ršPn  | j | ƒ q~ W| S(   NRD   Rt   Rr   R(   (   RD   RB   R9   t
   differenceRY   R   R(   R   R;   Rq   RO   t
   issupersetR>   t	   enumeratet   issubsett   appendRF   (   t
   resolutionRt   RD   RQ   R9   t	   accountedRg   t   resolutionst   resoR(   t   clashing_atomst   indext   prevt	   surviving(    (    s:   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/carve.pyt   alternativesj  s>    			
N(   R	   R   t   objectR   R   R   R    R,   R-   RB   RP   RX   R[   R^   R_   Re   Ri   Rj   R\   Rn   Ro   Rp   Rq   Ru   R�   R£   R±   (    (    (    s:   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/carve.pyt   <module>   s2   					gX1			+			1		u�!