ó
­™xTc           @   s”   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 e f d „  ƒ  YZ	 d d	 d
 „ Z
 d „  Z e d k r� e ƒ  n  d S(   iÿÿÿÿ(   t   division(   t   flex(   t   euler_angles_as_matrix(   t	   superposeNt   find_domainc           B   se   e  Z d  Z d d d d d „ Z d d „ Z d d d „ Z d	 „  Z d
 „  Z d „  Z	 d d „ Z
 RS(   sE  This class tries to find pseudo invariant domain given a set of sites.
It requires an empirical parameter named match_radius to be set to a sensible
value. For large movements, having this value set to 2.5 is probably okai.
If the movements are more subtle, more problem dedicated software might be
the best course of action.g      à?g       @g      è?i   c         C   sß   | j  ƒ  | j  ƒ  k s t ‚ | j  ƒ  d k s6 t ‚ | | j  ƒ  k sN t ‚ | | j  ƒ  k sf t ‚ | | k  sx t ‚ g  |  _ | |  _ | |  _ | j  ƒ  |  _ d |  _ |  j | | ƒ } |  j | d | d | ƒ|  _ d  S(   Ni   i
   t   overlap_threst   minimum_size(	   t   sizet   AssertionErrort   matchest   set_at   set_bt   nt   max_itert   zippert   process(   t   selfR
   R   t   initial_rmst   match_radiusR   R   t	   tmp_match(    (    sD   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/invariant_domain.pyt   __init__   s    				c      
   C   s  | d  k r t j } n  d } | d t |  j ƒ IJt |  j ƒ d k rW | d IJn d GHx³ |  j D]¨ } | d } | d } | d } | d } | J| d	 | IJ| | j d
 d d t d d ƒ IJ| J| | j d
 d d d ƒ IJ| J| d | | f IJ| J| d 7} qf Wd  S(   Ni   s+   %i invariant-like domains have been found. i    s   Listing transformations below.s#   Change settings in improve results.i   i   i   s   Operator set %i: t   labelt   rt   one_row_per_linet   formats   %8.5ft   ts    rmsd: %5.3f; number of sites: %i(   t   Nonet   syst   stdoutt   lenR	   t   mathematica_formt   True(   R   t   outt   countt   itemR   R   t   rmsdR   (    (    sD   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/invariant_domain.pyt   show%   s*    



"i
   c         C   sÌ   t  j t | ƒ t ƒ } g  } g  } t | ƒ } x” | sÇ |  j | | ƒ \ } }	 | | k rr | j | |	 ƒ n  |  j | |	 | | | ƒ }
 | j |
 t ƒ } | j	 t ƒ | j
 ƒ  k r4 t } q4 q4 W| S(   N(   R   t   boolR   t   Falset   find_largestt   appendt   find_similar_matchest   set_selectedR   R!   R   (   R   R	   R   R   t   usedt   tmp_matchest   final_matchest   doneR   t   indext   sims(    (    sD   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/invariant_domain.pyR   >   s    	c         C   sÖ   t  j |  j j ƒ  d ƒ j | d d ƒ } t  j ƒ  } x˜ t t | ƒ ƒ D]„ } | | sJ | | d } t  j |  j j ƒ  d ƒ j | d ƒ }	 t  j | |	 ƒ t  j | ƒ }
 |
 | k rÎ | j	 | ƒ qÎ qJ qJ W| S(   Ng        i    g      ð?(
   R   t   doubleR
   R   R*   t   size_tt   xrangeR   t   sumR(   (   R   t   targetR	   R+   R   t   tmp_at   resultt   iit   matcht   tmp_bt   similar(    (    sD   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/invariant_domain.pyR)   P   s    +
' c   	      C   sŽ   | j  |  j | j  } |  j | } t j | j | ƒ ƒ } t j | | k  ƒ } |  j j | j ƒ  ƒ } |  j j | j ƒ  ƒ } | | | f S(   N(	   t   elemsR   R
   R   t   sqrtt   dotR%   t   selectt
   iselection(	   R   R   R   t   cut_offt	   new_sitest   deltasR?   R6   R:   (    (    sD   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/invariant_domain.pyt
   pair_sites\   s    c         C   sU  g  } xHt  d |  j d ƒ D]0} | d } | d } |  j | } |  j | } |  j | }	 |  j | }
 |  j | } |  j | } t j | |	 | g ƒ } t j | |
 | g ƒ } t j | | ƒ } | j } | j	 } d } | j
 ƒ  } | | } | j ƒ  } | | k  r t } d } d } d } d  } d  } t j ƒ  } xÇ | s| } |  j | | | ƒ \ } } } | j ƒ  } | | k rŒt } Pn  | |  j k r¥t } Pn  | j ƒ  d k r@t j | | ƒ } | j
 ƒ  } | j | ƒ } | j } | j	 } | d 7} q@q@W| rM| j | j ƒ  j ƒ  | | | | j ƒ  j ƒ  j ƒ  g ƒ qMq q W| S(   Ni   g      $@i    (   R3   R   R
   R   R   t   vec3_doubleR   t   least_squares_fitR   R   t   other_sites_best_fitt
   rms_lengthR&   R   R%   RD   R   R   R   t   rms_differenceR(   t	   deep_copyR@   (   R   R   t   levelR	   t   jjR8   t   kkt   xit   xpit   xjt   xpjt   xkt   xpkt   reft   movt   lsqR   R   R#   RB   RC   t	   convergedR!   t
   match_sizet   previous_match_sizeR6   R:   R?   t	   tmp_sites(    (    sD   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/invariant_domain.pyR   e   sf    

   		
			&c         C   s½   t  j ƒ  } | d  k r3 t  j t | ƒ t ƒ } n  x% | D] } | j | d j ƒ  ƒ q: Wt  j t | ƒ d ƒ } | j | j	 ƒ  d ƒ } | | } t  j
 | ƒ } t  j | ƒ } | | f S(   Ni    i   (   R   R1   R   R%   R   R&   R(   R   R*   R@   t   maxt	   max_index(   R   R	   t
   used_flagst   sizesR9   t   multit   max_sizet   max_loc(    (    sD   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/invariant_domain.pyR'   Ÿ   s    
N(   t   __name__t
   __module__t   __doc__R   R   R$   R   R)   RD   R   R'   (    (    (    sD   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/invariant_domain.pyR      s   				:i
   i    c      	   C   sb  d d l  m } d d  l } t g  t d ƒ D] } | j d d ƒ ^ q, ƒ } t j t j |  d ƒ d d ƒ } t j t j |  d ƒ d d ƒ } t	 | ƒ | } | j
 | ƒ }	 | j
 | ƒ }
 t |	 |
 d d	 d
 d d d ƒ} | r÷ | j ƒ  n  t | j ƒ d k st ‚ | | j d d d d d ƒs8t ‚ | | j d d |  d d ƒs^t ‚ d  S(   Niÿÿÿÿ(   t   approx_equali   i    ih  i
   i   R   g{®Gáz”?R   g¸…ëQ¸ž?R   i   t   epsgñhãˆµøä>i   (   t   libtbx.test_utilsRe   t   randomR   R3   t   uniformR   RE   t   random_doublet   tuplet   concatenateR   R$   R   R	   R   (   R   t   verboseRe   Rh   t   it   ct   set_1t   set_2t   set_3R
   R   t   tmp(    (    sD   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/invariant_domain.pyt   exercise_core¬   s$    1$$	&c          C   su   d d  l  }  |  j d ƒ t j d ƒ d t j d k } x0 d d d d d	 g D] } t d
 | d | ƒ qO Wd GHd  S(   Niÿÿÿÿi    s	   --verbosei   i   i
   i   id   iÈ   R   Rm   t   OK(   Rh   t   seedR   t   set_random_seedR   t   argvRt   (   Rh   Rm   R   (    (    sD   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/invariant_domain.pyt   exerciseÃ   s    t   __main__(   t
   __future__R    t   cctbx.array_familyR   t   scitbx.mathR   R   R   t   objectR   Rt   Ry   Rb   (    (    (    sD   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/invariant_domain.pyt   <module>   s   ¥	
