ó
L™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 m Z d  d l	 Z d  d l
 m Z d  d	 l
 m Z d  d
 l m Z d  d l 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 „  Z e d k r&e ƒ  d GHn  d S(   iÿÿÿÿ(   t   division(   t
   generators(   t   sgtbx(   t   uctbx(   t   crystal(   t   flexN(   t   reticular_pg_tools(   t   sub_lattice_tools(   t   matrixt   symmetry_safe_sublattice_xsc           B   s,   e  Z d  d d d „ Z d „  Z d „  Z RS(   i   i   g      @c         C   s¯   | |  _  | j ƒ  |  _ |  j  j |  j ƒ |  _ t j |  j j ƒ  j ƒ  ƒ |  _	 | |  _
 g  |  _ t j | | ƒ |  _ g  |  _ g  |  _ x |  j D] } |  j | ƒ q” Wd  S(   N(   t   xst!   change_of_basis_op_to_niggli_cellt   cb_op_to_nigglit   change_basist   xs_nR   t   sqrt	   unit_cellt   orthogonalization_matrixt   basist	   max_deltat	   xs_expandt   sltt   generate_matrix_up_to_ordert   matricest   add_to_nigglit   metric_r_valuest   make_new_xs(   t   selft   xsint   start_ordert
   stop_orderR   t   mat(    (    sM   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/sgtbx/reticular_twin_laws.pyt   __init__   s    	!				c         C   sÏ   | j  ƒ  } | j  ƒ  } t j | ƒ } t j | ƒ } t j | | ƒ } d } d } d } xM t | | ƒ D]< \ }	 }
 t j |	 |
 ƒ } | | 7} | t j |	 ƒ 7} qk W| d k s½ t ‚ d | | } | S(   Ni    g      Y@(   t   metrical_matrixR   t   doublet   abst   zipt   matht   fabst   AssertionError(   R   t   at   bt   oldt   newt   deltat   resultt   topt   bottomt   oit   nit   tmp(    (    sM   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/sgtbx/reticular_twin_laws.pyt   metric_r   s    
c         C   sÚ   |  j  | j ƒ  } t j d | ƒ } t j | d ƒ } | j ƒ  } | j | ƒ } t j d | j ƒ  d t j	 j
 | j ƒ  |  j ƒ d t ƒ } |  j j |  j | j ƒ  | j ƒ  ƒ ƒ |  j j | ƒ |  j j | ƒ d  S(   NR   t   P1R   t   space_groupt   assert_is_compatible_unit_cell(   R   t   as_floatR   R   R   t   symmetryR   R   R   t   lattice_symmetryt   groupR   t   FalseR   t   appendR3   R   R   (   R   R   t	   new_basist   new_uct   new_xst   ecbnt	   cb_new_xs(    (    sM   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/sgtbx/reticular_twin_laws.pyR   /   s    	((   t   __name__t
   __module__R    R3   R   (    (    (    sM   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/sgtbx/reticular_twin_laws.pyR	      s   	t   ret_twin_law_infoc           B   s   e  Z d  „  Z d d „ Z RS(   c         C   s@   | |  _  | |  _ | |  _ | j ƒ  |  _ | |  _ | |  _ d  S(   N(   t   mR3   t	   twin_lawst   determinantt   ordert   base_xst   subl_xs(   R   RF   RE   R3   RI   RJ   (    (    sM   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/sgtbx/reticular_twin_laws.pyR    @   s    				c         C   sû   | d  k r t j } n  | J| d IJ| J| d IJ|  j j d | ƒ | J| d IJ|  j j d | ƒ | J| d IJ|  j GH| d |  j IJ| d |  j IJ| d IJ|  j	 d  k	 ré x7 |  j	 D] } | d	 It
 j | ƒ IJqÃ Wn
 | d
 IJ| Jd  S(   Ns(   ----- Reticular twin laws summary ----- s   Base crystal symmetryt   fs   Sublattice symmetrys       Matrix M : s       Order    : %is       Metric R : %3.2es       Twin laws:s              s            No twin laws(   t   Nonet   syst   stdoutRI   t   show_summaryRJ   RE   RH   R3   RF   t   rmpgt   as_hkl(   R   t   outt   law(    (    sM   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/sgtbx/reticular_twin_laws.pyt   showH   s*    




 
N(   RB   RC   R    RL   RT   (    (    (    sM   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/sgtbx/reticular_twin_laws.pyRD   ?   s   	t   reticular_twin_lawsc           B   s/   e  Z d  d d „ Z e d „ Z d d „ Z RS(   g      @i   c         C   sL  | |  _  |  j  j ƒ  } |  j  j | ƒ |  _ t j | ƒ |  _ t |  j d | | ƒ |  _ t j |  j j	 ƒ j
 ƒ  |  _ t j |  j j ƒ  ƒ |  _ |  j j |  j j
 ƒ  ƒ g  |  _ x� t |  j j |  j j |  j j |  j j ƒ D]a \ } } } } |  j | | | | ƒ }	 |	 d  k	 rã |  j | | | | ƒ }
 |  j j |
 ƒ qã qã Wd  S(   Ni   (   t   xs1R   R   t   xs2RP   t   cb_op_as_rationalt   cbopR	   t
   xs_sl_listR   t   inverset   base_to_niggli_invt   construct_rational_point_groupR5   t   ori_sgt   derived_lawsR$   R   R   R   R   t   construct_twin_lawsRL   R<   (   R   R
   R   t	   max_indext	   cbop_primt   nxsR   t	   add_cb_opt   mrt
   these_lawst	   this_info(    (    sM   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/sgtbx/reticular_twin_laws.pyR    a   s"    				c         C   sÙ   | j  d |  j j ƒ  j ƒ  ƒ j ƒ  } t j | ƒ } t j | ƒ j ƒ  } | j | ƒ | j | j ƒ  ƒ | j |  j	 ƒ | j |  j
 j ƒ  ƒ t j |  j | ƒ }	 |	 d  k	 rÑ t |	 | | |  j | ƒ }
 |
 Sd  Sd  S(   Nt   anomalous_flag(   t   reflection_intensity_symmetryRW   R5   t	   is_chiralRP   R]   RX   R[   R   R\   RY   t   build_reticular_twin_lawsR^   RL   RD   RV   (   R   R
   R   t   additional_cb_opt   rRT   t   tmp_sgt   new_sgt	   tmp_cb_opt   these_twin_lawst   tlinfo(    (    sM   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/sgtbx/reticular_twin_laws.pyR`   w   s    'c         C   s\   | d  k r t j } n  t |  j ƒ rN x. |  j D] } | j d | ƒ q1 Wn
 | d IJd  S(   NRR   s   No reticular twin laws found.(   RL   RM   RN   t   lenR_   RT   (   R   RR   t   o(    (    sM   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/sgtbx/reticular_twin_laws.pyRT   Ž   s    N(   RB   RC   R    R;   R`   RL   RT   (    (    (    sM   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/sgtbx/reticular_twin_laws.pyRU   `   s   c       	   C   sz  t  j d ƒ }  t j |  d ƒ } t | d d d d ƒ} d d d d d d d d d g	 } x9 t | j d j | ƒ D] \ } } | | k st t ‚ qt Wd	 d d d d	 d d	 d d g	 } | j d j	 d } x/ t | | ƒ D] \ } } | | k sÛ t ‚ qÛ Wt  j d
 ƒ }  t j |  d ƒ } t | d d d d ƒ} x= | j D]2 }	 x) |	 j	 D] }
 |
 j
 ƒ  d k sPt ‚ qPWq@Wd S(   sy  
  uc = uctbx.unit_cell( "10.079 10.079 48.409 90 90 120" )
  xs = crystal.symmetry( uc, "R32")
  reticular_twin_laws( xs , max_index=3, max_delta=1.5).show()

  uc = uctbx.unit_cell( "5.05 11.15 11.45 108.25 98.42 95.78" )
  xs = crystal.symmetry( uc, "P1" )
  reticular_twin_laws( xs, max_index=3 ).show()

  uc = uctbx.unit_cell( "127.6, 58.1, 51.2, 90, 97.2, 90" )
  xs = crystal.symmetry( uc, "C2" )
  reticular_twin_laws( xs, max_index=3, max_delta=1.5 ).show()

  uc = uctbx.unit_cell( "127.6, 152.1, 51.2, 90, 90.0, 90" )
  xs = crystal.symmetry( uc, "P222" )
  reticular_twin_laws( xs, max_index=3, max_delta=1.5 ).show()
  s   96 74 77 90 113 90t   C2Ra   i   R   g      ø?i   i    iÿÿÿÿs   10.079 10.079 48.409 90 90 120t   R32i   N(   R   R   R   R8   RU   R$   R_   RE   R'   RF   RG   (   t   ucR
   t   trlwRE   t   iit   jjt   tlt   dlt   rtlt   tlit   ttl(    (    sM   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/sgtbx/reticular_twin_laws.pyt   exerciseš   s     !&!t   __main__t   OK(   t
   __future__R    R   t   cctbxR   R   R   t   cctbx.array_familyR   t   cctbx.sgtbx.lattice_symmetryt   cctbx.sgtbxR   RP   R   R   t   scitbxR   R%   RM   t   scitbx.matht   objectR	   RD   RU   R€   RB   (    (    (    sM   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/sgtbx/reticular_twin_laws.pyt   <module>   s$   1!:	)