ó
šxTc           @   s„  d  d l  Z d  d l m Z d  d l m Z d  d l 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 „  Z d „  Z e Z e 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 „  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% „  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# d0 e f d1 „  ƒ  YZ$ d2 „  Z% e% d3 „ Z& d4 „  Z' d5 „  Z( d6 „  Z) d7 „  Z* d8 „  Z+ d S(9   iÿÿÿÿN(   t*   r3_rotation_cos_rotation_angle_from_matrix(   t   sgtbxt   SymOpc           B   s   e  Z d  Z d „  Z RS(   s'   
    Data from a symmetry operator
    c         C   sH   | |  _  t j j | j ƒ  j ƒ  ƒ |  _ | j |  j | j |  _	 d  S(   N(
   t   sgopt   scitbxt   matrixt   sqrt   rt	   as_doublet   frac_rotationt   to_ortht   to_fract   orth_rotation(   t   selfR   t   crystal(    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/matching.pyt   __init__   s    	!(   t   __name__t
   __module__t   __doc__R   (    (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/matching.pyR   	   s   t   ChangeOfBasisOperatorc           B   sz   e  Z d  Z d „  Z e d „  ƒ Z e d „  ƒ Z d „  Z d „  Z d „  Z	 d „  Z
 d „  Z d	 „  Z e d
 „  ƒ Z RS(   sB   
    Object to store all data for a coordinate transformation
    c         C   s(   | |  _  | |  _ | |  _ | |  _ d  S(   N(   t   operatort   invertedt   originalt   transformed(   R   R   R   R   R   (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/matching.pyR      s    			c         C   s%   t  j j |  j j ƒ  j ƒ  j ƒ  ƒ S(   N(   R   R   R   R   t   cR   R   (   R   (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/matching.pyt
   operator_r"   s    c         C   s%   t  j j |  j j ƒ  j ƒ  j ƒ  ƒ S(   N(   R   R   R   R   t   c_invR   R   (   R   (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/matching.pyt
   inverted_r(   s    c         C   s   |  j  | ƒ S(   N(   R   (   R   t   vector(    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/matching.pyt   transform_position.   s    c         C   s   |  j  j |  j |  j j | S(   N(   R   R
   R   R   R   (   R   R   (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/matching.pyt   transform_orientation3   s    c         C   s   |  j  | |  j S(   N(   R   R   (   R   R   (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/matching.pyt   transform_r_frac8   s    c         C   s8   |  j  j |  j d |  j j | |  j j ƒ |  j  j S(   NR   (   R   R
   R   R   R   (   R   R   (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/matching.pyt   transform_r_orth=   s    c         C   s   |  j  j | ƒ S(   N(   R   t   apply(   R   t   rt_mx(    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/matching.pyt   transform_rt_mxG   s    c      	   C   s.   |  j  d |  j d |  j d |  j d |  j ƒ S(   NR   R   R   R   (   t	   __class__R   R   R   R   (   R   (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/matching.pyt   inverseL   s
    				c         C   s1   |  d | d | j  ƒ  d | d | j d | ƒ ƒ S(   NR   R   R   R   t   cbop(   R%   t   with_changed_basis(   t   clsR&   R   (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/matching.pyt   newV   s
    (   R   R   R   R   t   propertyR   R   R   R   R   R    R#   R%   t   classmethodR)   (    (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/matching.pyR      s   					
		
t   IdentityChangeOfBasisOperatorc           B   s¶   e  Z d  Z e j j d ƒ Z e j ƒ  Z	 d „  Z
 e d „  ƒ Z e d „  ƒ Z e d „  ƒ Z e d „  ƒ Z e d „  ƒ Z d „  Z d	 „  Z d
 „  Z d „  Z d „  Z d „  Z RS(   sI   
    An optimization to not do any transformation when not necessary
    i   c         C   s   | |  _  d  S(   N(   R   (   R   R   (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/matching.pyR   i   s    c         C   s   |  j  S(   N(   R   (   R   (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/matching.pyR   n   s    c         C   s   |  j  S(   N(   t	   UNIT_CBOP(   R   (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/matching.pyR   t   s    c         C   s   |  j  S(   N(   R-   (   R   (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/matching.pyR   z   s    c         C   s   |  j  S(   N(   t   UNIT_R(   R   (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/matching.pyR   €   s    c         C   s   |  j  S(   N(   R.   (   R   (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/matching.pyR   †   s    c         C   s   | S(   N(    (   R   R   (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/matching.pyR   Œ   s    c         C   s   | S(   N(    (   R   R   (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/matching.pyR   ‘   s    c         C   s   | S(   N(    (   R   R   (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/matching.pyR   –   s    c         C   s   | S(   N(    (   R   R   (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/matching.pyR    ›   s    c         C   s   | S(   N(    (   R   R"   (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/matching.pyR#       s    c         C   s   |  S(   N(    (   R   (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/matching.pyR%   ¥   s    (   R   R   R   R   R   t   identityR.   R   t   change_of_basis_opR-   R   R*   R   R   R   R   R   R   R   R   R    R#   R%   (    (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/matching.pyR,   a   s   						t   CrystalInfoc           B   sV   e  Z d  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z	 d „  Z
 RS(	   s   
    Symmetry information
    c         C   s›   | |  _  | |  _ t j j | j ƒ  ƒ |  _ t j j | j ƒ  ƒ |  _ g  | D] } t	 d | d |  ƒ ^ qO |  _
 d  |  _ d  |  _ d  |  _ d  |  _ d  S(   NR   R   (   t   cellt   space_groupR   R   R   t   fractionalization_matrixR   t   orthogonalization_matrixR
   R   t   symopst   Nonet   origin_searcht   reference_setting_infot   cbop_reft   is_ref_setting(   R   R3   R2   t   op(    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/matching.pyR   ¯   s    		+			c         C   s   |  j  j ƒ  S(   N(   R3   t   info(   R   (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/matching.pyt   space_group_info¾   s    c         C   s   |  j  j ƒ  S(   N(   R3   t   type(   R   (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/matching.pyt   space_group_typeÃ   s    c         C   sa   |  j  d  k rZ |  j ƒ  r0 t d |  ƒ |  _  qZ t j d |  j ƒ  j ƒ  d |  ƒ |  _  n  |  j  S(   NR   R&   (   R:   R7   t   is_reference_settingR,   R   R)   R@   t   cb_op(   R   (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/matching.pyt   change_of_basis_to_referenceÈ   s    	c         C   s.   |  j  d |  j j | ƒ d |  j j | ƒ ƒ S(   NR3   R2   (   R$   R3   t   change_basisR2   (   R   R&   (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/matching.pyR'   ×   s    	c         C   s+   |  j  d  k r$ t d |  ƒ |  _  n  |  j  S(   NR   (   R8   R7   t   OriginSearchInfo(   R   (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/matching.pyt   origin_search_infoÞ   s    c         C   s+   |  j  d  k r$ |  j ƒ  j |  _  n  |  j  S(   N(   R9   R7   RC   R   (   R   (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/matching.pyt   reference_settingæ   s    c         C   s.   |  j  d  k r' |  j ƒ  j ƒ  |  _  n  |  j  S(   N(   R;   R7   R>   RA   (   R   (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/matching.pyRA   î   s    (   R   R   R   R   R>   R@   RC   R'   RF   RG   RA   (    (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/matching.pyR1   ª   s   							RE   c           B   s    e  Z d  Z d „  Z d „  Z RS(   s    
    Data for origin search
    c         C   sé   | j  ƒ  } | j ƒ  |  _ t j d t j d t d d d t d t d t ƒ d |  j j ƒ  d	 |  j j	 ƒ  ƒ } g  | j
 ƒ  D] } t d
 | d | ƒ ^ q| |  _ | j ƒ  s² t ‚ | j ƒ  |  _ t |  j ƒ rÜ t |  _ n	 t |  _ d  S(   Nt   flagst   use_space_group_symmetryt   use_space_group_ltriÿÿÿÿt   use_seminvariantst   use_normalizer_k2lt   use_normalizer_l2nR@   t   seminvariantR   R   (   RG   R>   t   sgiR   t   search_symmetryt   search_symmetry_flagst   Falset   TrueR?   t   structure_seminvariantst   subgroupR   t   opst   continuous_shifts_are_principalt   AssertionErrort   continuous_shift_flagst   anyt)   subtract_continuous_allowed_origin_shiftst	   projectort	   unchanged(   R   R   t   refsetRP   R<   (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/matching.pyR   û   s"    			1c         C   s   |  j  d |  j d | ƒ S(   NRO   t   delta(   R\   RO   (   R   R_   (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/matching.pyt   project  s    (   R   R   R   R   R`   (    (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/matching.pyRE   ö   s   	c         C   s   |  j  | ƒ S(   N(   R[   (   RO   R_   (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/matching.pyR[     s    c         C   s   | S(   N(    (   RO   R_   (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/matching.pyR]   "  s    t   EnsembleInfoc           B   s5   e  Z d  Z d „  Z e d „  ƒ Z e d „  ƒ Z RS(   s=   
    Information about ensemble extent, centre, symmetry
    c         C   s   | |  _  | |  _ | |  _ d  S(   N(   t   centret   extentt   pgops(   R   Rb   Rc   Rd   (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/matching.pyR   2  s    		c   	      C   sÀ   d d l  m } t j d | ƒ } t | j ƒ d } d d l m } | j ƒ  } | j	 d | ƒ g  | j
 ƒ  j ƒ  D]* } t j j | j ƒ  | j ƒ  f ƒ ^ qt } |  d | j d | d | ƒ S(	   Niÿÿÿÿ(   t   flext   rootg      @(   t   ncsRb   Rc   Rd   (   t   scitbx.array_familyRe   t   PrincipalComponentst   from_hierarchyt   sumRc   t   phaserRg   t   EnsembleSymmetryt   set_roott   get_point_groupt   get_operatorsR   R   t   rtt   get_rotationt   get_translationRb   (	   R(   Rf   Re   t	   principalRc   Rg   t   ensymR<   Rd   (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/matching.pyRj   9  s    @	c         C   s8   |  d | d t  | ƒ d d t j j d d f ƒ g ƒ S(	   NRb   Rc   g      @Rd   i   i    (	   i   i    i    i    i   i    i    i    i   (   i    i    i    (   Rk   R   R   Rq   (   R(   Rb   Rc   (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/matching.pyt   from_mapM  s
    	(   R   R   R   R   R+   Rj   Rv   (    (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/matching.pyRa   -  s   	Ri   c           B   s&   e  Z d  Z d „  Z e d „  ƒ Z RS(   s)   
    Principal components of inertia
    c         C   s'  d d l  m } | j | ƒ } d | t j j | | j ƒ  ƒ |  _ | |  j j ƒ  \ } } } | j | | | ƒ } | j | | | ƒ }	 | j | | | ƒ }
 | j | | | ƒ } | j | | | ƒ } | j | | | ƒ } d d l m	 } | j
 | | | | | | |	 |
 | f ƒ } | j ƒ  } t j j t | d d !ƒ t | d d !ƒ t | d d !ƒ ƒ } | j ƒ  d k  r•| } n  | j |  _ | |  j |  _ |  j | |  j j ƒ  \ } } } t | ƒ t | ƒ d	 t | ƒ t | ƒ d	 t | ƒ t | ƒ d	 f |  _ d  S(
   Niÿÿÿÿ(   Re   g      ð?(   t   eigensystemi   i	   i   i    g       @(   Rh   Re   Rk   R   R   t   colRb   t   partst   scitbx.linalgRw   t   real_symmetrict   vectorsR   t   tuplet   determinantt   elemsR   t   tt   maxt   minRc   (   R   t   coordst   weightsRe   t   totalt   xst   yst   zst   xxt   xyt   xzt   yyt   yzt   zzRw   t   eigt   eivt   inertiat   txst   tyst   tzs(    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/matching.pyR   `  s0    '*	8
#c   
      C   sÀ   d d  l  } d d l m } | j ƒ  d j ƒ  } | j ƒ  } g  | D] } | j ƒ  ^ qE } | j ƒ  | j g  | D]0 } | j	 j
 j | r‘ | n d t ƒ j ƒ  ^ qs ƒ }	 |  d | d |	 ƒ S(   Niÿÿÿÿ(   Re   i    s    CRƒ   R„   (   t   cctbx.eltbx.tiny_pseRh   Re   t   modelst   atomst   extract_xyzt!   determine_chemical_element_simplet   extract_occt   doublet   eltbxt   tiny_pset   tableRS   t   weight(
   R(   Rf   t   cctbxRe   R—   Rƒ   t   aR   t   eR„   (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/matching.pyRj   …  s    >(   R   R   R   R   R+   Rj   (    (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/matching.pyRi   [  s   	%t   simple_position_differencesc           B   s    e  Z d  Z d „  Z d „  Z RS(   sH   
    Simple (i.e. not cached) calculation of positional differences
    c         C   s   | |  _  | j |  _ d  S(   N(   Rb   R6   (   R   Rb   R   (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/matching.pyR   œ  s    	c         c   sO   xH |  j  D]= } t j j | j | j ƒ } | t d |  j | ƒ f Vq
 Wd  S(   NRƒ   (   R6   R   R   Rx   R   Rb   t   mod_short_coords(   R   t   othert   symopR   (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/matching.pyt   __call__¢  s    (   R   R   R   R   R§   (    (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/matching.pyR£   —  s   	t   cached_position_differencesc           B   s    e  Z d  Z d „  Z d „  Z RS(   s9   
    Symmetry equivalent positions are precalculated
    c         C   sH   g  | j  D]% } t j j | j j ƒ  | ƒ ^ q
 |  _ | j  |  _  d  S(   N(   R6   R   R   Rx   R   R%   t   symmeqs(   R   Rb   R   R¦   (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/matching.pyR   ®  s    8c         c   sE   x> t  |  j |  j ƒ D]' \ } } | t d | | j ƒ f Vq Wd  S(   NRƒ   (   t   zipR6   R©   R¤   Rb   (   R   R¥   R¦   t   posi(    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/matching.pyR§   ¶  s    "(   R   R   R   R   R§   (    (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/matching.pyR¨   ©  s   	t   Positionc           B   s‰   e  Z d  Z e d „ Z d „  Z d „  Z e d „ Z e d „ Z e d „ Z	 e d „ Z
 d „  Z d	 „  Z d
 „  Z e e d „ ƒ Z RS(   s�   
    Information about the position of an object
    'centre' is stored as fractional, but 'tolerance_sq' is in orthogonal
    coordinates
    c         C   s=   | |  _  | |  _ | d |  j  d |  j ƒ |  _ | |  _ d  S(   NRb   R   (   Rb   R   t   fractional_differences_betweent   tolerance_sq(   R   Rb   R   R®   t   detail(    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/matching.pyR   Ã  s    			c         c   sA   x: |  j  d | ƒ D]& \ } } | |  j j j | ƒ f Vq Wd  S(   NR¥   (   R­   R   R2   t   orthogonalize(   R   R¥   R¦   R_   (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/matching.pyt   orthogonal_differences_betweenÎ  s    c         c   sP   xI |  j  d | ƒ D]5 \ } } t j j | ƒ j ƒ  |  j k r | Vq q Wd  S(   NR¥   (   R±   R   R   Rx   t	   length_sqR®   (   R   R¥   R¦   R_   (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/matching.pyt   operations_betweenÔ  s    !c      	   C   s;   |  j  d t j j | |  j ƒ d |  j d |  j d | ƒ S(   NRb   R   R®   R¯   (   R$   R   R   Rx   Rb   R   R®   (   R   R<   R¯   (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/matching.pyR   Û  s
    			c      	   C   s/   |  j  d |  j | d |  j d |  j d | ƒ S(   NRb   R   R®   R¯   (   R$   Rb   R   R®   (   R   R   R¯   (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/matching.pyt   shiftedå  s
    			c         C   s6   |  j  j ƒ  r |  S|  j d |  j  j ƒ  d | ƒ Sd  S(   NR&   R¯   (   R   RA   R'   RC   (   R   R¯   (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/matching.pyRG   ï  s
    	c      	   C   sC   |  j  d t j j | j d |  j ƒ ƒ d | j d |  j d | ƒ S(   NRb   R   R   R®   R¯   (   R$   R   R   Rx   R   Rb   R   R®   (   R   R&   R¯   (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/matching.pyR'   û  s    				c         C   s   t  S(   N(   RS   (   R   R¥   (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/matching.pyt   non_spatial_equivalence  s    c         C   s   t  S(   N(   RS   (   R   R¥   R¦   t   euclopR&   (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/matching.pyt   non_positional_equivalence  s    c         C   s   |  S(   N(    (   R   (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/matching.pyt
   positional  s    c      	   C   s#   |  d | d | d | d d | ƒ S(   NRb   R   R®   i   R¯   (    (   R(   Rb   R   t	   toleranceR¯   (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/matching.pyR)     s
    
(   R   R   R   R£   R   R±   R³   R   R´   RG   R'   Rµ   R·   R¸   R+   R)   (    (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/matching.pyR¬   ¼  s   		

			c         C   s"   |  d } d | k  r | d S| S(   Ng      ð?g      à?(    (   t   numbert   frac(    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/matching.pyt	   mod_short!  s    
c         C   s    g  |  D] } t  d | ƒ ^ q S(   NRº   (   R¼   (   Rƒ   R   (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/matching.pyR¤   '  s    t   basic_rotation_differencesc           B   s    e  Z d  Z d „  Z d „  Z RS(   s7   
    Basic way of calculating rotation differences
    c         C   s   | |  _  | |  _ d  S(   N(   t   rotationRd   (   R   R¾   Rd   (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/matching.pyR   1  s    	c         c   sF   |  j  j ƒ  } x0 |  j D]% } | j  | j | } | | f Vq Wd  S(   N(   R¾   t	   transposeRd   R   (   R   R¥   t
   transposedt   pgopt   rotmat(    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/matching.pyR§   7  s    (   R   R   R   R   R§   (    (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/matching.pyR½   ,  s   	t   simple_rotation_differencesc           B   s    e  Z d  Z d „  Z d „  Z RS(   sJ   
    Simple (i.e. not cached) way of calculating rotation differences
    c         C   s   | j  ƒ  |  _ | |  _ d  S(   N(   R¿   RÀ   Rd   (   R   R¾   Rd   (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/matching.pyR   E  s    c         c   s:   x3 |  j  D]( } | j | j |  j } | | f Vq
 Wd  S(   N(   Rd   R¾   R   RÀ   (   R   R¥   RÁ   RÂ   (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/matching.pyR§   K  s    (   R   R   R   R   R§   (    (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/matching.pyRÃ   @  s   	t   cached_rotation_differencesc           B   s    e  Z d  Z d „  Z d „  Z RS(   s   
    Precalculate matrices
    c         C   s9   | j  ƒ  } g  | D] } | | j | f ^ q |  _ d  S(   N(   R¿   R   t   data(   R   R¾   Rd   RÀ   RÁ   (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/matching.pyR   W  s    c         c   s0   x) |  j  D] \ } } | | j | f Vq
 Wd  S(   N(   RÅ   R¾   (   R   R¥   RÁ   RÂ   (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/matching.pyR§   ]  s    (   R   R   R   R   R§   (    (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/matching.pyRÄ   R  s   	t   Orientationc           B   s_   e  Z d  Z e d „ Z d „  Z e d „ Z d „  Z d „  Z	 e d „ Z
 e e d „ ƒ Z RS(   sŽ   
    Information about the orientation of an object
    'rotation' and 'pgops' is in orthogonal coordinates
    'tolerance' is in radians
    c         C   s=   | |  _  | |  _ | |  _ | d |  j  d |  j ƒ |  _ d  S(   NR¾   Rd   (   R¾   Rd   t   cos_tolerancet   rotation_differences_between(   R   R¾   Rd   RÇ   R¯   (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/matching.pyR   j  s    			c         c   sD   x= |  j  d | ƒ D]) \ } } |  j t | ƒ k r | Vq q Wd  S(   NR¥   (   RÈ   RÇ   R    (   R   R¥   RÁ   RÂ   (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/matching.pyR³   r  s    c      	   C   s/   |  j  d | |  j d |  j d |  j d | ƒ S(   NR¾   Rd   RÇ   R¯   (   R$   R¾   Rd   RÇ   (   R   R<   R¯   (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/matching.pyt   rotatedy  s
    			c         C   s   t  S(   N(   RS   (   R   R¥   (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/matching.pyRµ   ƒ  s    c         C   sD   | j  ƒ  j d | j | j ƒ } t |  j d | j d | ƒ ƒ ƒ S(   NR   R¥   R<   (   R%   R    R   RZ   R³   RÉ   (   R   R¥   R¦   R¶   R&   t   joint(    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/matching.pyR·   ˆ  s    c      	   C   s7   |  j  d | j d |  j ƒ d |  j d |  j d | ƒ S(   NR¾   R   Rd   RÇ   R¯   (   R$   R   R¾   Rd   RÇ   (   R   R&   R¯   (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/matching.pyR'   ’  s
    			c      	   C   s(   |  d | d | d t  j | ƒ d | ƒ S(   NR¾   Rd   RÇ   R¯   (   t   matht   cos(   R(   R¾   Rd   R¹   R¯   (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/matching.pyR)   œ  s
    (   R   R   R   RÃ   R   R³   R½   RÉ   Rµ   R·   R'   R+   R)   (    (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/matching.pyRÆ   c  s   	
		

c         C   s   d t  j | d |  ƒ S(   Ng       @g      @(   RË   t   atan(   Rc   t   dmin(    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/matching.pyt"   phaser_style_orientation_tolerance¨  s    c         C   s   |  d S(   Ng      @(    (   RÎ   (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/matching.pyt   phaser_style_position_tolerance­  s    t   MRPeakPOc           B   st   e  Z d  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z	 e
 d „  ƒ Z e d	 e e d
 „ ƒ Z RS(   sƒ   
    An object that has a combination of orientation and position
    Matching starts with position, and then with orientation
    c         C   s   | |  _  | |  _ d  S(   N(   t   orientationt   position(   R   RÒ   RÓ   (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/matching.pyR   ¸  s    	c         c   sj   xc |  j  j d | j  ƒ D]I } | j j d | j ƒ } x( |  j j d | ƒ D] } | | f VqM Wq Wd  S(   NR¥   R<   (   RÓ   R³   RÒ   RÉ   R   (   R   R¥   R¦   RÉ   RÁ   (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/matching.pyR³   ¾  s    c         C   s   t  S(   N(   RS   (   R   R¥   (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/matching.pyRµ   Ç  s    c      	   C   s(   |  j  j d | j  d | d | d | ƒ S(   NR¥   R¦   R¶   R&   (   RÒ   R·   (   R   R¥   R¦   R¶   R&   (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/matching.pyR·   Ì  s
    	c         C   s(   |  j  d |  j d |  j j d | ƒ ƒ S(   NRÒ   RÓ   R   (   R$   RÒ   RÓ   R´   (   R   R   (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/matching.pyR´   Ö  s    		c         C   sQ   |  j  j j ƒ  r |  S|  j d |  j j d |  j j ƒ  ƒ d |  j  j ƒ  ƒ Sd  S(   NRÒ   R&   RÓ   (   RÓ   R   RA   R$   RÒ   R'   RC   RG   (   R   (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/matching.pyRG   Þ  s    	c         C   s   |  j  S(   N(   RÓ   (   R   (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/matching.pyR¸   ì  s    c         C   s
   |  j  j S(   N(   RÓ   R   (   R   (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/matching.pyR   ñ  s    g      ð?c	   
      C   s¶   t  j j | ƒ }	 |  d t j d |	 d | j d | t d | j d | ƒ d | ƒ d t j d	 t  j j	 | j
 j |	 | j ƒ ƒ t  j j	 | ƒ d
 | d | t d | ƒ d | ƒ ƒ S(   NRÒ   R¾   Rd   R¹   Rc   RÎ   R¯   RÓ   Rb   R   (   R   R   R   RÆ   R)   Rd   RÏ   Rc   R¬   Rx   R2   t   fractionalizeRb   RÐ   (
   R(   R¾   t   translationR   t   ensembleRÎ   t
   multipliert   detail_positiont   detail_orientationt   orth_rotmat(    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/matching.pyt   phaser_style÷  s     				
			(   R   R   R   R   R³   Rµ   R·   R´   RG   R¸   R*   R   R+   R£   RÃ   RÛ   (    (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/matching.pyRÑ   ²  s   					
			t   Labelc           B   s    e  Z d  Z d „  Z d „  Z RS(   s6   
    Information about some property of an object
    c         C   s   | |  _  | |  _ d  S(   N(   t   valuet   equality(   R   RÝ   RÞ   (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/matching.pyR   #  s    	c         C   s   |  j  |  j | j ƒ S(   N(   RÞ   RÝ   (   R   R¥   (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/matching.pyt   equals)  s    (   R   R   R   R   Rß   (    (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/matching.pyRÜ     s   	t   Labelledc           B   sƒ   e  Z d  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z	 e
 d „  ƒ Z e d	 e e d
 „ ƒ Z e d „  ƒ Z RS(   si   
    An object that has a structural and a label component
    Matching starts with label comparison
    c         C   s   | |  _  | |  _ d  S(   N(   t   labelt   spatial(   R   Rá   Râ   (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/matching.pyR   4  s    	c         c   sA   |  j  d | ƒ r= x( |  j j d | j ƒ D] } | Vq+ Wn  d  S(   NR¥   (   Rµ   Râ   R³   (   R   R¥   R<   (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/matching.pyR³   :  s    c         C   s   |  j  j | j  ƒ S(   N(   Rá   Rß   (   R   R¥   (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/matching.pyRµ   A  s    c      	   C   s(   |  j  j d | j  d | d | d | ƒ S(   NR¥   R¦   R¶   R&   (   Râ   R·   (   R   R¥   R¦   R¶   R&   (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/matching.pyR·   F  s
    	c         C   s(   |  j  d |  j d |  j j d | ƒ ƒ S(   NRá   Râ   R   (   R$   Rá   Râ   R´   (   R   R   (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/matching.pyR´   P  s    		c         C   s"   |  j  d |  j d |  j j ƒ  ƒ S(   NRá   Râ   (   R$   Rá   Râ   RG   (   R   (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/matching.pyRG   X  s    		c         C   s   |  j  j ƒ  S(   N(   Râ   R¸   (   R   (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/matching.pyR¸   `  s    c         C   s
   |  j  j S(   N(   Râ   R   (   R   (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/matching.pyR   e  s    g      ð?c	   	      C   s[   |  d t  d | d t j ƒ d t j d | d | d | d | d	 | d
 | d | d | ƒ ƒ S(   NRá   RÝ   RÞ   Râ   R¾   RÕ   R   RÖ   RÎ   R×   RØ   RÙ   (   RÜ   R   t   eqRÑ   RÛ   (	   R(   R¾   RÕ   R   RÖ   RÎ   R×   RØ   RÙ   (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/matching.pyt   phaser_mr_solutionk  s    	c         C   sI   |  d t  d | d t j ƒ d t j d t j j | ƒ d | d | ƒ ƒ S(   NRá   RÝ   RÞ   Râ   Rb   R   R¹   (   RÜ   R   Rã   R¬   R)   R   R   Rx   (   R(   t   elementRÓ   R   R¹   (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/matching.pyt   simple_heavy_atom‡  s    	(   R   R   R   R   R³   Rµ   R·   R´   RG   R¸   R*   R   R+   R£   RÃ   Rä   Ræ   (    (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/matching.pyRà   .  s   				
			t   simple_origin_shiftsc           B   s    e  Z d  Z d „  Z d „  Z RS(   s;   
    Simple (i.e. non-cached) origin shift calculation
    c         C   s   | |  _  | |  _ d  S(   N(   RÓ   t   search_info(   R   RÓ   Rè   (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/matching.pyR   ™  s    	c         c   s   xx |  j  j D]j } | j j d | j ƒ } xI |  j j d | ƒ D]2 \ } } |  j  j d | ƒ } | | | | f VqA Wq Wd  S(   NR<   R¥   R_   (   Rè   RV   RÓ   R   R   R­   R`   (   R   R¥   R¶   R   R¦   R_   t	   projected(    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/matching.pyR§   Ÿ  s
    "(   R   R   R   R   R§   (    (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/matching.pyRç   ”  s   	t   cached_origin_shiftsc           B   s    e  Z d  Z d „  Z d „  Z RS(   s2   
    Possible origin shifts are precalculated
    c         C   sM   g  | j  D]- } | j d | j j ƒ  d | j j ƒ ^ q
 |  _ | |  _ d  S(   NR<   R¯   (   RV   R   R   R%   R­   R$   t   euclidsRè   (   R   RÓ   Rè   R¶   (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/matching.pyR   ®  s    =c         c   sy   xr t  |  j j |  j ƒ D]X \ } } xI | j d | j ƒ D]2 \ } } |  j j d | ƒ } | | | | f Vq; Wq Wd  S(   NR¥   R_   (   Rª   Rè   RV   Rë   R­   RÓ   R`   (   R   R¥   R¶   R«   R¦   R_   Ré   (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/matching.pyR§   º  s    %"(   R   R   R   R   R§   (    (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/matching.pyRê   ©  s   	t   OriginSearchEntityc           B   s)   e  Z d  Z d e e d „ Z d „  Z RS(   sE   
    Information about an object that allows to do origin search
    g      ð?c         C   sŒ   | |  _  |  j  j j ƒ  |  _ |  j  j ƒ  j d |  j d | ƒ |  _ | |  _ | |  j j |  _ | d |  j d |  j j	 j
 ƒ  ƒ |  _ d  S(   NR&   R¯   RÓ   Rè   (   t   entityR   RC   R&   R¸   R'   RÓ   R×   R®   R   RF   t   projected_differences_between(   R   Rí   R×   t   detail_originRØ   (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/matching.pyR   Ç  s    				c   	   
   c   s  |  j  | j  k s t ‚ |  j j d | j ƒ rxÕ |  j d | ƒ D]¾ \ } } } } t g  |  j j j j | ƒ D] } | d ^ qq ƒ } | |  j	 k rC |  j j
 d | j d | d | d |  j  ƒ r|  j  j ƒ  j d | ƒ } | | t j j | ƒ f VqqC qC Wn  d  S(   NR¥   i   R¦   R¶   R&   R   (   R&   RX   Rí   Rµ   Rî   Rk   R   R2   R°   R®   R·   R%   R   R   R   Rx   (	   R   R¥   R¶   R¦   R_   t   shiftR   t   difft   transf(    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/matching.pyt   potential_origins_betweenÝ  s    %2	(   R   R   R   Rç   R£   R   Ró   (    (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/matching.pyRì   Â  s
   c         C   s   |  | | | | | f S(   N(    (   t   matchedR¶   R¦   Rð   t   leftt   right(    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/matching.pyt   no_origin_refinement÷  s    c   
      c   s¼   xµ |  D]­ } x¤ | D]œ } x“ | j  d | ƒ D] \ } } } | d | | f d | d | d | d g  |  D] } | | k	 rg | ^ qg d g  | D] }	 |	 | k	 rŒ |	 ^ qŒ ƒ Vq- Wq Wq Wd  S(   NR¥   Rô   R¶   R¦   Rð   Rõ   Rö   (   Ró   (
   Rõ   Rö   t
   refinementt   lR   R¶   R¦   Rð   t   let   ri(    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/matching.pyt   origin_shifts_betweenü  s    "%c         c   sþ   |  \ } } } } } } | Vg  | D] } | j  ^ q$ } g  | D] }	 |	 j  j d | ƒ ^ q@ }
 x– t d | d |
 ƒ D] \ } }	 | d  k	 r· | | k s¡ t ‚ | | j | ƒ } n  |	 d  k	 rë |	 |
 k sÕ t ‚ | |
 j |	 ƒ }	 n  | |	 f Vqw Wd  S(   NR   Rõ   Rö   (   Rí   R´   t   overlapR7   RX   t   index(   t   originRô   R¶   R¦   Rð   Rõ   Rö   Rù   t   left_entitiesR   R´   (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/matching.pyt   origin_shifted_overlap  s    ("c         c   s©   t  | ƒ } xz |  D]r } xi | D]V } | j d | ƒ } y | j ƒ  Wn t k
 r\ q  q  X| j | ƒ | | f VPq  W| d  f Vq Wx | D] } d  | f Vq� Wd  S(   NR¥   (   t   setR³   t   nextt   StopIterationt   removeR7   (   Rõ   Rö   t   copyt	   referenceR   RV   (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/matching.pyRý      s    c         C   s   d „  |  Dƒ S(   Nc         s   s9   |  ]/ \ } } | d  k	 r | d  k	 r | | f Vq d  S(   N(   R7   (   t   .0Rù   R   (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/matching.pys	   <genexpr>=  s    (    (   t   overlaps(    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/matching.pyt   pairs:  s    c         C   sC   t  |  ƒ t  | ƒ k r t St d „  t |  | ƒ Dƒ ƒ r? t St S(   Nc         s   s-   |  ]# \ } } | d  k p$ | d  k Vq d  S(   N(   R7   (   R  Rù   R   (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/matching.pys	   <genexpr>F  s    (   t   lenRR   RZ   Rý   RS   (   Rõ   Rö   (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/matching.pyt   is_equivalentA  s
    c   
      C   så   t  |  ƒ t  | ƒ k r t S|  s& t Sx¸ | D]° } x§ |  d j d | ƒ D]� \ } } } t j j | j | ƒ } g  | D]' } | | k ry | j j	 d | ƒ ^ qy } t
 d g  |  d D] }	 |	 j ^ q· d | ƒ rJ t SqJ Wq- Wt S(   Ni    R¥   R   Rõ   i   Rö   (   R  RR   RS   Ró   R   R   Rx   R   Rí   R´   R  (
   Rõ   Rö   R¥   R¶   R¦   Rð   t
   full_shiftR   R´   Rù   (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/matching.pyt   phaser_style_equivalence_matchL  s    &4/(,   t   scitbx.matrixR   t   scitbx.mathR    R    R   RË   R   t   objectR   R   R,   R1   RE   R[   R]   t   project_without_shiftst   project_with_shiftsRa   Ri   R£   R¨   R¬   R¼   R¤   R½   RÃ   RÄ   RÆ   RÏ   RÐ   RÑ   RÜ   Rà   Rç   Rê   Rì   R÷   Rü   R  Rý   R
  R  R  (    (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/matching.pyt   <module>   sN   LIL'		.<e		E		lf5					