ó
O™xTc           @   s8  d  d l  m Z d  d l Z e j j d ƒ 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 m Z d  d l m Z d  d l Z d e f d „  ƒ  YZ d e f d „  ƒ  YZ d Z d e f d „  ƒ  YZ d e f d „  ƒ  YZ d S(   iÿÿÿÿ(   t   divisionNt   cctbx_symmetry_search_ext(   t   ls_with_scale_and_bias(   t   miller(   t   sgtbx(   t   lattice_symmetry(   t   maptbx(   t   adopt_optional_init_args(   t   matrix(   t
   clustering(   t   flext%   symmetrised_shifted_structure_factorsc           B   s   e  Z e d  „ Z d „  Z RS(   c         C   s‘   | j  ƒ  j | j  ƒ  ƒ s! t ‚ t j | j ƒ  | j ƒ  t j | j ƒ  | j	 ƒ  | j
 ƒ  ƒ | | ƒ } t j | | j ƒ |  _ | j |  _ d  S(   N(   t	   unit_cellt   is_similar_tot   AssertionErrort   extR   t   space_groupt   indicesR   t
   f_calc_mapt   datat   anomalous_flagt   arrayt   f_xt   grad_f_x(   t   selft
   miller_sett	   f_c_in_p1t   xt   compute_gradientt   sssft(    (    sC   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/symmetry_search.pyt   __init__   s    !			c         C   sµ   |  j  j | ƒ s t ‚ |  j  j ƒ  j | j ƒ  ƒ s< t ‚ | j ƒ  sZ | j ƒ  sZ t ‚ | j ƒ  ru | j ƒ  } n | } t |  j  j	 ƒ  |  j
 | j	 ƒ  |  j  j ƒ  j	 ƒ  j ƒ  ƒ S(   N(   R   t   is_similar_symmetryR   R   t   all_eqt   is_xray_amplitude_arrayt   is_xray_intensity_arrayt	   f_as_f_sqR   R   R   t   multiplicitiest	   as_double(   R   t   f_o_or_f_o_sqt   f_o_sq(    (    sC   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/symmetry_search.pyt   misfit    s    $	(   t   __name__t
   __module__t   FalseR   R(   (    (    (    sC   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/symmetry_search.pyR      s   t   shift_refinementc           B   s   e  Z d  „  Z d „  Z RS(   c         C   sz   | |  _  | |  _ | |  _ t j |  j ƒ |  _ d  |  _ t j	 j
 |  t j	 j d d ƒ ƒ t j |  j ƒ |  _ |  ` d  S(   Nt    traditional_convergence_test_epsg{®Gáz„?(   t   f_obst   fc_in_p1t   initial_shiftR
   t   doubleR   t   Nonet   initial_goost   scitbxt   lbfgst   runt   termination_parameterst   matt   colt   shift(   R   R.   R/   R0   (    (    sC   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/symmetry_search.pyR   1   s    				
c         C   s   t  |  j |  j t |  j ƒ d t ƒ} | |  _ | j |  j ƒ } |  j d  k r] | |  _ n  | |  _
 | j t j | j ƒ f S(   NR   (   R   R.   R/   t   tupleR   t   Truet   symmetrised_shifted_sfR(   R3   R2   t   goost   valueR
   R1   t   gradient(   R   t   sssfR>   (    (    sC   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/symmetry_search.pyt    compute_functional_and_gradients=   s    				(   R)   R*   R   RB   (    (    (    sC   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/symmetry_search.pyR,   /   s   	i   t   structure_factor_symmetryc           B   st   e  Z d  Z 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 „ Z RS(   s©    Crystallographic symmetry of complex structure factors.

  All attributes featuring crystallographic elements (origin, spacegroup,
  etc) are in a primitive unit cell. gš™™™™™Ù?g      è?g      Ð?g      à?c         K   s”  t  | t j ƒ | j ƒ  j ƒ  j ƒ  d k s4 t ‚ | |  _ t |  | ƒ t	 j
 d d d t d d ƒ |  _ t j d d t ƒ|  _ d  |  _ g  |  _ |  j ƒ  |  j j ƒ  d	 k r#|  j j d
 t j d |  j ƒ ƒ j ƒ  j ƒ  j ƒ  } | j ƒ  |  _ | j |  j ƒ |  _ |  j j ƒ  |  _ n t j ƒ  |  _ |  j j ƒ  |  _ |  j ƒ  t j |  j j ƒ  j ƒ  d t j ƒ|  _ t j d |  j ƒ |  _ d  S(   Ns    P 1t   peak_search_leveli   t   interpolatet   min_distance_sym_equivg      Ð?s   P 1t   t_deni   t   space_group_infot   group(   t
   isinstanceR   R   R   t   typet   hall_symbolR   t   f_in_p1R   R   t   peak_search_parametersR<   t   search_parametersR   t   sg_t_denR2   t   origint   symmetry_poolt   find_centring_translationst   order_zt   customized_copyRH   t   eliminate_sys_absentt   merge_equivalentst'   change_of_basis_op_to_primitive_settingt   cb_op_to_primitivet   change_basist   change_of_basis_opt   generate_bijvoet_matest   find_space_group(   R   RM   t   kwdst   f_in_centered(    (    sC   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/symmetry_search.pyR   X   s0    $				
*
c   
      C   s  |  j  } | | j ƒ  j ƒ  | j ƒ  } | j d t j d |  j ƒ } t j	 ƒ  } g  } | j
 |  j ƒ } t j d ƒ } xb t j | d ƒ D]N } t t j | j ƒ | ƒ d k  r» q� n  | j | j ƒ | j | j ƒ q� W| sé d St j | ƒ }	 |	 j |  j k  rd S| |	 j  S(   Nt   symmetry_flagst   resolution_factori   i   g{®Gáz„?(    (    (   RM   t	   conjugateR   t   sum_sqt   fft_mapR   t   use_space_group_symmetryt   grid_resolution_factorR
   R1   t   peak_searchRO   R8   t   zerost	   itertoolst   islicet   absR9   t   sitet   appendt   heightR	   t	   two_meanst   highest_statt%   cross_correlation_cutoff_for_centringt   cut(
   R   t   ft   cc_sft   cc_mapt   heightst   sitest   cc_map_peakst   zerot   cc_peak_infot   clusters(    (    sC   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/symmetry_search.pyt   centring_translation_peak_sites{   s(    	 		"  c   
      C   s‚  x{|  j  ƒ  D]m} g  | D]$ } t j j j | d ƒ j ƒ  ^ q } | j d ƒ d k r_ q n  t g  | D]* } | j ƒ  d k ri | j	 ƒ  d f ^ qi ƒ j
 ƒ  } t | ƒ d k sº t ‚ t | ƒ d k r | d } g  | D] } | j ƒ  ^ qÝ } t j | | ƒ } y | j t ƒ } WnJ t k
 rf}	 t |	 ƒ j d ƒ sG‚  n  t d t t | ƒ ƒ ƒ ‚ n X|  j j | ƒ q q Wd  S(   Ng{®Gáz„?i    i   s1   Unsuitable value for rational translation vector.s8   Sorry not implemented: handling of translation vector %s(   i    i   (   R|   R4   t   matht   continued_fractiont	   from_realt   as_rationalt   countt   dictt	   numeratort   denominatort   keyst   lenR   R   t   tr_vect   new_denominatorRP   t   RuntimeErrort   strt   endswithR;   R   t
   expand_ltr(
   R   t   dR   t   tt   rt   unique_denominatorst   dent   numR‡   t   e(    (    sC   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/symmetry_search.pyRS   ‘   s,    . @
	c         c   s?  t  j |  j j ƒ  d d ƒ} | j t j d ƒ ƒ t ƒ  } g  } xÇ | D]¿ } | j ƒ  } | j	 ƒ  rn qJ n  | j
 ƒ  | k r† qJ n  t j | ƒ } | j ƒ  d k  r­ qJ n  | j | ƒ | j | j ƒ  d k t | j ƒ  ƒ j d ƒ | j ƒ  d k | j ƒ  | f ƒ qJ W| j ƒ  | j ƒ  x | D] } | d Vq(Wd  S(   Nt	   max_deltai   i    iþÿÿÿiÿÿÿÿ(   i    i    i    (   R   RI   RM   R   t
   expand_invR   R‡   t   setR�   t
   is_unit_mxt   inverset   rot_mx_infoRK   t   addRm   t   listt   evR�   t   ordert   sortt   reverse(   R   t   lattice_groupt	   rot_partst   decorated_rot_partst   opR�   t   r_infot   item(    (    sC   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/symmetry_search.pyt   possible_point_group_generators¨   s2    		   	

 c   	      c   sÊ   |  j  } xº |  j ƒ  D]¬ } | j | j t j | ƒ ƒ d t ƒ\ } } | | j ƒ  j ƒ  | j	 ƒ  } | j
 d t j d |  j ƒ } | j |  j ƒ } | j ƒ  } | j ƒ  t j | j ƒ f Vq Wd  S(   Nt   assert_is_similar_symmetryR`   Ra   (   RM   R¦   t   common_setsRZ   R   R[   R+   Rb   R   Rc   Rd   R   Re   Rf   Rg   RO   t   nextR�   R8   R9   Rl   (	   R   t   f0R£   Rs   t
   op_times_fRt   Ru   Rx   t   peak(    (    sC   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/symmetry_search.pyt   cross_correlation_peaksÀ   s    	 		c      	   C   sÖ  g  } d } xÝ t  |  j ƒ  ƒ D]É \ } \ } } t j | | j ƒ  d | ƒ} t j t j | | ƒ ƒ } |  j j | d t	 ƒ} | |  j
 k  rž t j }	 n$ | |  j k  r¹ t j }	 n	 t j }	 | j |	 | t | | | |	 ƒ f ƒ q W| j ƒ  g  | D] }
 |
 d ^ qý |  _ t j d ƒ |  _ xX |  j D]M } | j | j k rPq2n  | j |  j ƒ |  j j j d ƒ d k r2Pq2q2WxL |  j D]A } | j | j k r«q�n  | j |  j ƒ |  j j | j ƒ q�Wd  S(   Ni   i   t   tr_denR§   iÿÿÿÿi    iÀ  (   t	   enumerateR­   R   R‡   t   as_intR[   t   rt_mxRM   t   symmetry_agreement_factorR+   t   phi_sym_acceptance_cutofft   possible_symmetryt   acceptedt   phi_sym_rejection_cutofft   unsuret   rejectedRm   Rž   RR   R8   t   mutable_zerosRQ   t   statust   set_components_of_global_origint   elemsR�   t   change_originR   t
   expand_smxt   rt(   R   t   decorated_symmetry_poolR„   t   iR�   R�   RŽ   t   cb_opt   phi_symRº   R¥   t   symm(    (    sC   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/symmetry_search.pyR]   Ø   s8    %		$
    c         C   s)   d j  g  |  j D] } t | ƒ ^ q ƒ S(   Ns   
(   t   joinRR   RŠ   (   R   R“   (    (    sC   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/symmetry_search.pyt   __str__õ   s    c         C   s¯   | d  k s | d  k s t ‚ | d  k	 r; |  j | } n | d  k rT |  j } n  |  j j ƒ  j d |  j ƒ j ƒ  j ƒ  } t	 | |  j | ƒ } | j
 | ƒ } | | j f S(   NRH   (   R2   R   RQ   RM   t   as_amplitude_arrayRU   RH   RW   R   R   R(   R   (   R   R   t   deltat   f_ot   ssft   gos(    (    sC   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/symmetry_search.pyt   symmetrised_structure_factorsø   s      N(   R)   R*   t   __doc__Rf   Rq   R³   R¶   R   R|   RS   R¦   R­   R]   RÆ   R2   RÌ   (    (    (    sC   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/symmetry_search.pyRC   M   s   	#						R´   c           B   sW   e  Z e d  ƒ \ Z Z Z d „  Z d „  Z d „  Z d j	 d g d  ƒ Z
 d „  Z RS(   i   c         C   s‘  | j  ƒ  d k s t ‚ | |  _ | j ƒ  } t j | ƒ |  _ |  j j ƒ  } |  j j ƒ  } | |  _	 | |  _
 t j | j ƒ  j ƒ  ƒ } | | j ƒ  }	 | |	 | }
 t j t | |	 d t ƒ} t j |  j j ƒ  j ƒ  ƒ } | j ƒ  } t j d ƒ j ƒ  } t j j | | ƒ } t j t j | ƒ |
 ƒ |  } t j d ƒ } t j j | | | ƒ | t j | ƒ |  _ |  _ d  |  _  | |  _! d  S(   Ni   R®   i   i    (   i    i    i    ("   R‘   R   R�   R�   R   R™   R¤   RK   Rœ   t   symmetry_agreementRº   R8   t   sqrt
   accumulateR%   R°   R‡   RP   t   minus_unit_mxR’   t   as_flex_int_matrixt   identityR4   R}   t   row_echelon_form_tR
   R1   t#   row_echelon_back_substitution_floatR9   t   t_it
   raw_originR2   RQ   t   one_minus_r(   R   R�   R�   RÎ   Rº   R�   RK   t   axist   pt   t_i_numt   t_lRÖ   RØ   t   one_minus_r_row_echelont   qt   rankt   qdt   o(    (    sC   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/symmetry_search.pyR   	  s.    			 		c         C   sR   xK t  d ƒ D]= } | | d k r |  j | d k r |  j | | | <q q Wd  S(   Ni   i    (   t   xrangeR×   (   R   RQ   RÁ   (    (    sC   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/symmetry_search.pyR»   +  s    #c         C   sš   |  j  | } |  j | } t j t | j ƒ  d t ƒ} t j |  j |  j j	 | ƒ j
 t ƒ ƒ |  _ t j |  j ƒ } | j ƒ  |  _ | j ƒ  |  _ d  S(   NR®   (   R×   RØ   R   R‡   RP   R°   R±   R�   RÖ   t   plusRˆ   R¿   t   translation_part_infot   origin_shiftRQ   t   intrinsic_part(   R   RQ   Rá   RÜ   t   tr_info(    (    sC   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/symmetry_search.pyR½   0  s    -t   ,s   %.3fc      	   C   sq   d i d |  j  6d |  j 6d |  j 6|  j |  j j ƒ  d |  j j ƒ  |  j |  j	 |  j
 t |  j ƒ |  j f S(   Ns&   [%s] % i |(%s) +(%s) @(%s)<=(%s): %.4ft   *t   ~t    s   % i, % i, % i(   Rµ   R·   R¸   Rº   R�   RK   R¤   Rœ   RÖ   RQ   t   fmt3vecR;   R×   RÎ   (   R   (    (    sC   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/symmetry_search.pyRÆ   ;  s    (((   R)   R*   Râ   Rµ   R·   R¸   R   R»   R½   RÅ   Rì   RÆ   (    (    (    sC   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/symmetry_search.pyR´     s   	"			(   t
   __future__R    t   boost.pythont   boostt   pythont
   import_extR   R   R   t   cctbxR   R   t   cctbx.sgtbxR   R   t   libtbxR   R4   R   R8   t   scitbx.mathR	   t   cctbx.array_familyR
   Ri   t   objectR   R,   RP   RC   R´   (    (    (    sC   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/symmetry_search.pyt   <module>   s$   ¸