ó
M™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 m Z d  d l Z d  d l	 m
 Z
 d  d l Z d  d l Z d  d l 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 e d „ Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d d „ Z  d d „ Z! d „  Z" d d „ Z# d e$ f d „  ƒ  YZ% d e$ f d „  ƒ  YZ& d „  Z' d „  Z( d „  Z) d  „  Z* d! „  Z+ e, d" k r¾e+ ƒ  n  d S(#   iÿÿÿÿ(   t   division(   t   sgtbx(   t   uctbx(   t   crystal(   t   flexN(   t   matrix(   t   approx_equal(   t   format_cpu_times(   t   rational(   t   ifloor(   t   StringIOc   	      C   sÏ   t  |  ƒ } t |  ƒ } t  t j t j |  ƒ ƒ ƒ } g  } xŒ t d | d ƒ D]w } | | d k rP | } | | } | s¨ | j | ƒ | | k r¨ | j | ƒ q¨ n  | rÇ | j | | f ƒ qÇ qP qP W| S(   s    find all divisors i   i    (   t   intt   floatt   matht   floort   sqrtt   xranget   append(	   t   nt   pairst   i_nt   d_nt   w_nt   resultt	   trial_divt   at   b(    (    sK   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/sgtbx/sub_lattice_tools.pyt   divisor   s    
c         C   s‘   t  |  ƒ } g  } xx | D]p } xg | D]_ } xV | D]N } | | | } | |  k r3 | | | f } | | k r� | j | ƒ q� q3 q3 Wq& Wq W| S(   s%    finds all triples for which a*b*c==n(   R   R   (   R   t   divst   triplest   fstt   sndt   trdt   tmpt   trip(    (    sK   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/sgtbx/sub_lattice_tools.pyt   find_triples_slowly$   s    c         C   sF   t  j t  j |  ƒ t ƒ } |  | d |  | d |  | d f } | S(   Ni    i   i   (   R   t   sort_permutationR   t   False(   t   triplet   ordert   sorted_triple(    (    sK   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/sgtbx/sub_lattice_tools.pyt   sort_triple6   s
    c   
      C   sñ   |  d |  d |  d f } |  d |  d |  d f } |  d |  d |  d f } |  d |  d |  d f } |  d |  d |  d f } |  d |  d |  d f } | | | | | | g } g  } x* | D]" }	 |	 | k rÇ | j  |	 ƒ qÇ qÇ W| S(   Ni    i   i   (   R   (
   R&   t   c1t   c2t   c3t   c4t   c5t   c6t   permutsR   t   item(    (    sK   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/sgtbx/sub_lattice_tools.pyt   make_permutations?   s    c   	      C   sø   t  |  t ƒ } g  } xÜ | D]Ô } t  | d t ƒ } t  | d t ƒ } xQ | D]I } | d | d | d f } t | ƒ } | | k rO | j | ƒ qO qO WxQ | D]I } | d | d | d f } t | ƒ } | | k r£ | j | ƒ q£ q£ Wq W| S(   s%    finds all triples for which a*b*c==ni    i   (   R   t   TrueR)   R   (	   R   R   R   R1   t   div_at   div_bR   t
   trial_tripR   (    (    sK   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/sgtbx/sub_lattice_tools.pyt   make_triplesP   s     c         C   s7   t  |  ƒ } g  } x | D] } | t | ƒ 7} q W| S(   N(   R7   R2   (   R   R   R   R"   (    (    sK   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/sgtbx/sub_lattice_tools.pyt   find_triplesg   s
    c         C   sT  t  |  ƒ } g  } x;| D]3} | d } | d } | d } g  } g  } | d d k r™ | d d }	 x. |	 | d k r• | j |	 ƒ |	 d 7}	 qk Wn  | d d k rí | d d }	 x2 |	 | d d k ré | j |	 ƒ |	 d 7}	 q» Wn  | d d k r=| d d }	 x. |	 | d k r9| j |	 ƒ |	 d 7}	 qWn  | d d k r‘| d d }	 x2 |	 | d d k r�| j |	 ƒ |	 d 7}	 q_Wn  x¸ | D]° }
 x§ | D]Ÿ } x– | D]Ž } t j | ƒ t j |
 ƒ t j | ƒ t j d ƒ t j | ƒ t j | ƒ t j d ƒ t j d ƒ t j | ƒ g	 } | j t j | ƒ ƒ q²Wq¥Wq˜Wq W| S(   s1    make all sub lattices generators of order order i    i   i   (   R8   R   R   R   R   t   sqr(   R'   R   t   matricesR&   R   R   t   ct   d_and_et   f_listR!   t   dt   et   ft   mat(    (    sK   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/sgtbx/sub_lattice_tools.pyt   generate_matrixp   sT    


&i   c         C   sJ   d } g  } x7 t  t | ƒ t |  ƒ d ƒ D] } | t | ƒ 7} q, W| S(   Ni    i   (   R   R   RB   (   t	   end_ordert   start_ordert   cumt   all_matricesR   (    (    sK   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/sgtbx/sub_lattice_tools.pyt   generate_matrix_up_to_order¨   s
    &c   
      C   s¹   d „  } t  |  | ƒ } g  } x” | D]Œ } | d | d | d g } | d | d | d g } | d | d	 | d
 g } | | ƒ d | | ƒ d | | ƒ }	 | j |	 ƒ q% W| S(   Nc         S   s>  d } d d d g } d } xt  |  | ƒ D]\ } } d } | d k r,| d 7} | d k rÒ | d k r“ | d k r€ | } q“ t | ƒ | } n  | d k rÒ | d k r¸ d | } qÏ d t | ƒ | } qÒ n  | d k  r,| d k r| d k rd	 | } q&t | ƒ | } q)t | ƒ | } q,n  | | 7} q+ W| S(
   Nt    R   R   R;   i    i   t   +iÿÿÿÿt   -(   t   zipt   str(   t   rowR   t   abct   partR   t   jt   nn(    (    sK   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/sgtbx/sub_lattice_tools.pyt	   string_it°   s0    
	i    i   i   i   i   i   i   i   i   t   ,(   RG   R   (
   RC   RD   RR   t   matst   cb_opsRA   t   new_at   new_bt   new_cR!   (    (    sK   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/sgtbx/sub_lattice_tools.pyt   generate_cb_op_up_to_order¯   s    	(c         C   sR   |  j  ƒ  j ƒ  } g  } x* | D]" } | j t j t | ƒ ƒ ƒ q Wt j | ƒ S(   N(   t   rt	   as_doubleR   R   R   R	   R   R9   (   t   rot_matt   tmp_matt   rational_listt   ij(    (    sK   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/sgtbx/sub_lattice_tools.pyt   rt_mx_as_rationalØ   s
     c         C   sC   t  |  | ƒ } g  } x' | D] } | j ƒ  } | j | ƒ q W| S(   N(   RG   t   inverseR   (   RC   RD   t   mat_listt   inv_mat_listRA   t   inv_mat(    (    sK   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/sgtbx/sub_lattice_tools.pyt#   generate_inverse_matrix_up_to_orderà   s    t"   make_list_of_target_xs_up_to_orderc           B   s#   e  Z d  d d „ Z e d „ Z RS(   i   i   c         C   så   | |  _  |  j  j |  j  j ƒ  ƒ |  _ |  j  j ƒ  |  _ t j |  j j ƒ  j ƒ  ƒ |  _	 | |  _
 | |  _ t |  j
 ƒ |  _ t |  j
 ƒ |  _ g  |  _ g  |  _ g  |  _ x3 t |  j |  j ƒ D] \ } } |  j | | ƒ qÁ Wd  S(   N(   t   basic_xst   change_basist!   change_of_basis_op_to_niggli_cellt
   basic_xs_nt   basic_to_niggli_cb_opR   R9   t	   unit_cellt   orthogonalization_matrixt   basisR'   t	   max_deltaRG   R:   RY   RU   t   xs_listt   sg_listt   extra_cb_opRK   t   make_new_xs(   t   selfRg   R'   Ro   RA   t   cb_op(    (    sK   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/sgtbx/sub_lattice_tools.pyt   __init__é   s    	!					"c   	      C   s  |  j  | j ƒ  } t j d | ƒ } t j d | d t j j | |  j	 ƒ d t
 ƒ } | j ƒ  } |  j j | ƒ d  } y( t j d |  j j ƒ  ƒ j | ƒ } Wn t k
 r² n X| rò | j | ƒ } y | j | ƒ } Wqò t k
 rî qò Xn  |  j j | ƒ |  j j | ƒ d  S(   NRm   Rl   t   space_groupt   assert_is_compatible_unit_cellt   group(   Rn   t   as_floatR   Rl   R   t   symmetryR   t   lattice_symmetryRy   Ro   R%   t'   change_of_basis_op_to_reference_settingRr   R   t   Nonet   space_group_infoRj   Rw   Rh   t	   ExceptionRp   Rq   (	   Rt   RA   Ru   t   to_referencet	   new_basist   new_uct   tmp_xsRr   t   new_sg(    (    sK   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/sgtbx/sub_lattice_tools.pyRs     s(    	(  (   t   __name__t
   __module__Rv   R3   Rs   (    (    (    sK   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/sgtbx/sub_lattice_tools.pyRf   è   s   t   compare_latticec           B   s;   e  Z d  d d d d d „ Z d „  Z d „  Z d „  Z RS(	   g       @gš™™™™™©?g      $@i   c         C   s+  | |  _  | |  _ | |  _ | |  _ | |  _ |  j d  k rK t j |  _ n  | |  _ | |  _	 |  j j
 ƒ  |  _ |  j	 j
 ƒ  |  _ |  j j
 ƒ  j ƒ  j ƒ  |  j	 j
 ƒ  j ƒ  j ƒ  k rð | |  _ | |  _	 |  j j
 ƒ  |  _ |  j	 j
 ƒ  |  _ n  |  j j ƒ  j ƒ  |  j j ƒ  j ƒ  } t j | d ƒ }	 |  j ƒ  t j |  j j ƒ  j ƒ  ƒ |  _ |  j d IJ|  j j ƒ  }
 |  j d |
 d d |
 d d |
 d d f IJ|  j d |
 d d |
 d d |
 d d f IJ|  j d |
 d d |
 d d |
 d d f IJ|  j Jt j |  j j ƒ  j ƒ  ƒ |  _ |  j d IJ|  j j ƒ  }
 |  j d |
 d d |
 d d |
 d d f IJ|  j d |
 d d |
 d d |
 d d f IJ|  j d |
 d d |
 d d |
 d d f IJ|  j Jt j j |  j j ƒ  |  j ƒ |  _ t j j |  j j ƒ  |  j ƒ |  _ t j d	 |  j j ƒ  d
 |  j d t ƒ |  _  t! |	 t" |	 d d ƒ ƒ |  _# g  |  _$ g  |  _% |  j d t& |  j# ƒ IJ|  j d |	 t" |	 d d ƒ f IJd } |  j J|  j d IJ|  j J|  j d IJ|  j d Ix‹|  j# D]€} | d 7} t } |  j' | ƒ } |  j$ j( | ƒ |  j j ƒ  j) | d j ƒ  |  j  |  j |  j ƒ } | j* ƒ  d k rôt+ } t j, t j- t j. | d ƒ ƒ ƒ j/ ƒ  } | | | d j0 | ƒ | d f } |  j% j( | ƒ n  | r|  j d I|  j j1 ƒ  nG | d d k rD|  j d I|  j j1 ƒ  n |  j d I|  j j1 ƒ  | d d k r|  j J|  j d I|  j j1 ƒ  qqW|  j J|  j d IJd } t& |  j% ƒ d k rä| J| d IJ| d IJ| Jn  x@ |  j% D]5 } | d 7} |  j J|  j d | IJ|  j2 | ƒ qîWd  S(   Ni   s.   Cartesian basis (column) vectors of lego cell:s     / %5.1f %5.1f %5.1f \  i    i   s     | %5.1f %5.1f %5.1f |  s     \ %5.1f %5.1f %5.1f /  s0   Cartesian basis (column) vectors of target cell:Rl   Rw   Rx   sG   A total of %4i matrices in the hermite normal form have been generated.s6   The volume changes they cause lie between %4i and %4i.s   Trying all matricess*      1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0s     i   t   *i
   t   |t   .i   s    Listing all possible solutionssO   No relations found for this particular sublattice of the specified target cell.s      s   Solution %4i(3   t   relative_length_tolerancet   absolute_angle_toleranceR'   Ro   t   outR~   t   syst   stdoutt   xs_at   xs_bt   niggli_cellt   xs_a_nt   xs_b_nRl   t   volumeR   R   t   show_basic_infoR   R9   Rm   t   basis_at   as_list_of_listst   basis_bR   R|   Ry   t   lattice_symm_at   lattice_symm_bR   R{   R%   t   xs_refRG   t   maxt   matrix_listt   uc_and_symm_listt   possible_solutionst   lent   make_new_cell_and_symmetryR   t   similarity_transformationst   sizeR3   t   change_of_basis_opt   rt_mxt   rot_mxRa   Rh   t   flusht   show_solution(   Rt   R‘   R’   Ro   RŽ   RŒ   R�   R'   t   volume_ratiot   n_volume_ratiot   tmp_bast   countRA   t   found_itR„   t   tmp_genRu   t   tmp_sol(    (    sK   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/sgtbx/sub_lattice_tools.pyRv      s²    								6		(
!222!222$$			$
+#


c         C   s  |  j  J|  j  d IJ|  j  J|  j  d IJ|  j j d |  j  d d ƒ |  j  d IJ|  j j d |  j  d d ƒ |  j  J|  j  d IJ|  j  J|  j  d IJ|  j j d |  j  d d ƒ |  j  d IJ|  j j d |  j  d d ƒ |  j  J|  j  d	 |  j j ƒ  j ƒ  |  j j ƒ  j ƒ  IJ|  j  Jd  S(
   Ns&   Crystal symmetries in supplied settings   Target crystal symmetry:R@   t   prefixs       s!   Building block crystal symmetry: s$   Crystal symmetries in Niggli settings-   Building block (lego cell) crystal symmetry: s0   Volume ratio between target and lego cell: %5.2f(   RŽ   R’   t   show_summaryR‘   R•   R”   Rl   R–   (   Rt   (    (    sK   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/sgtbx/sub_lattice_tools.pyR—   œ  s*    3c         C   su  | d j  ƒ  } |  j d IJ|  j d |  j j ƒ  j ƒ  d |  j j ƒ  j ƒ  d |  j j ƒ  j ƒ  d |  j j ƒ  j ƒ  d |  j j ƒ  j ƒ  d |  j j ƒ  j ƒ  d f IJ|  j d	 |  j j ƒ  j ƒ  d |  j j ƒ  j ƒ  d |  j j ƒ  j ƒ  d |  j j ƒ  j ƒ  d |  j j ƒ  j ƒ  d |  j j ƒ  j ƒ  d f IJ|  j J|  j d
 | d d | d d | d d f IJ|  j d | d d | d d | d d f IJ|  j d | d d | d d | d d f IJ|  j J|  j d I| d j ƒ  IJ|  j d I| d j ƒ  IJ|  j d | d j ƒ  j ƒ  d | d j ƒ  j ƒ  d | d j ƒ  j ƒ  d | d j ƒ  j ƒ  d | d j ƒ  j ƒ  d | d j ƒ  j ƒ  d f IJ|  j d d |  j j ƒ  j ƒ  d | d j ƒ  j ƒ  d |  j j ƒ  j ƒ  d d |  j j ƒ  j ƒ  d | d j ƒ  j ƒ  d |  j j ƒ  j ƒ  d d |  j j ƒ  j ƒ  d | d j ƒ  j ƒ  d |  j j ƒ  j ƒ  d |  j j ƒ  j ƒ  d | d j ƒ  j ƒ  d |  j j ƒ  j ƒ  d | d j ƒ  j ƒ  d |  j j ƒ  j ƒ  d | d j ƒ  j ƒ  d f IJ|  j d IJ|  j d IJ|  j J|  j d IJ|  j d IJd  S(   Ni    s>   --------------------------------------------------------------s:   Target unit cell :     %5.1f %5.1f %5.1f %5.1f %5.1f %5.1fi   i   i   i   i   s:   Lego cell :            %5.1f %5.1f %5.1f %5.1f %5.1f %5.1fs                   /%4i %4i %4i  \  s    matrix :  M =  |%4i %4i %4i  |  s                   \%4i %4i %4i  /  s!   Additional Niggli transform:     s!   Additional similarity transform: s:   Resulting unit cell :  %5.1f %5.1f %5.1f %5.1f %5.1f %5.1fs:   Deviations :           %5.1f %5.1f %5.1f %5.1f %5.1f %5.1fid   s1   Deviations for unit cell lengths are listed in %.s)   Angular deviations are listed in degrees.t    (   R™   RŽ   R•   Rl   t
   parametersR”   t   as_xyz(   Rt   t	   sol_entryRA   (    (    sK   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/sgtbx/sub_lattice_tools.pyRª   µ  sP      222

III..5c         C   s‰   |  j  | j ƒ  } t j d | ƒ } t j | d ƒ } t j | j ƒ  j	 ƒ  ƒ } | j
 ƒ  } | j | ƒ } | j ƒ  } | | | | f S(   NRm   t   P1(   R˜   Rz   R   Rl   R   R{   R   R¦   Ri   R¶   R“   Rh   R   (   Rt   RA   R‚   Rƒ   R„   Rr   t   lattice_group(    (    sK   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/sgtbx/sub_lattice_tools.pyR£   ß  s    N(   R†   R‡   R~   Rv   R—   Rª   R£   (    (    (    sK   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/sgtbx/sub_lattice_tools.pyRˆ     s   u		*c          C   s…   t  j d ƒ }  t j |  d ƒ } t  j d ƒ } t j | d ƒ } t ƒ  } t | | d d d | ƒ} t | j ƒ d k s� t ‚ d  S(   Ns   61.28,95.92,145.02,90,90,90t   P212121s   115.5,149.0,115.60,90,115.3,90t   P1211R'   i   RŽ   (	   R   Rl   R   R{   R
   Rˆ   R¢   R¡   t   AssertionError(   t   uc1t   xs1t   uc2t   xs2RŽ   t   compare_object(    (    sK   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/sgtbx/sub_lattice_tools.pyt   tst_compareó  s    	c       	   C   sŠ   d d d d d d d d d	 g	 }  d d
 d d d d d d d g	 } xA t  |  | ƒ D]0 \ } } t | ƒ } t | ƒ | k sR t ‚ qR Wd  S(   Ni   i   i   i   i   i   i   i	   i
   i   i#   i   i[   i9   i›   i‚   iÙ   (   RK   RB   R¢   R¼   (   t   it   Nt   iit   iNR!   (    (    sK   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/sgtbx/sub_lattice_tools.pyt   tst_sublatticeü  s
    !!c    	      C   sÛ   t  j d ƒ }  t j |  d ƒ } t | d d ƒ} x¡ t | j | j | j ƒ D]„ \ } } } | j ƒ  j	 ƒ  | j ƒ  j	 ƒ  } t
 | j ƒ  ƒ } t
 | j ƒ  j ƒ  j ƒ  ƒ } t | | | d d d ƒsO t ‚ qO Wd  S(   Ns   61.28,95.92,145.02,90,90,90Rº   R'   i   g      ð?t   epsgü©ñÒMbP?(   R   Rl   R   R{   Rf   RK   Rp   R:   Rr   R–   R   t   determinantR;   RZ   R   R¼   (	   R½   R¾   R!   t   xsRA   Ru   t   ratiot   dett   det_ref(    (    sK   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/sgtbx/sub_lattice_tools.pyt   tst_make_bigger_cell  s    "c          C   s	  t  ƒ  }  t j d ƒ } t j | d ƒ } | j ƒ  } | j | ƒ } t j | d ƒ } t | | d |  ƒ} t | j	 ƒ d k s‡ t
 ‚ t j d ƒ } t j | d ƒ } | j ƒ  } | j | ƒ } t j | d ƒ } t | | d |  ƒ} t | j	 ƒ d k st
 ‚ d  S(   Ns   13,19,23,90,97,90t   C2R¸   RŽ   i   s   13,13,23,90,90,120s   R32:H(   R
   R   Rl   R   R{   t'   change_of_basis_op_to_primitive_settingRh   Rˆ   R¢   R¡   R¼   (   RŽ   R½   R¾   Ru   t   xs1pRÀ   t   comp(    (    sK   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/sgtbx/sub_lattice_tools.pyt   tst_centered_cells  s    	c           C   s(   t  ƒ  t ƒ  t ƒ  t ƒ  t ƒ  GHd  S(   N(   RÇ   RÂ   RÎ   RÓ   R   (    (    (    sK   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/sgtbx/sub_lattice_tools.pyt   exercise%  s
    t   __main__(-   t
   __future__R    t   cctbxR   R   R   t   cctbx.array_familyR   t   cctbx.sgtbx.lattice_symmetryt   scitbxR   R   R�   t   scitbx.matht   libtbx.test_utilsR   t   libtbx.utilsR   t   boostR   t   libtbx.math_utilsR	   t	   cStringIOR
   R%   R   R#   R)   R2   R7   R8   RB   RG   RY   R`   Re   t   objectRf   Rˆ   RÂ   RÇ   RÎ   RÓ   RÔ   R†   (    (    (    sK   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/sgtbx/sub_lattice_tools.pyt   <module>   sB   								8)	7Ô						