ó
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
 m Z d  d l m Z d  d	 l m Z d  d
 l Z d  d
 l Z d e f d „  ƒ  YZ dQ e e d „ Z d „  Z d „  Z d e f d „  ƒ  YZ d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z  d „  Z! d „  Z" d „  Z# d „  Z$ d d „ Z% d  „  Z& d! „  Z' e( d" k r±e j) e j* d d# d$ d% d& d' d( d) d* g ƒ Z+ e, e+ j- ƒ d+ k sÑt. ‚ e+ j- d+ j/ d, ƒ Z0 e, e0 ƒ dR k sÿt. ‚ e1 g  e0 D] Z2 e3 e2 ƒ ^ q	ƒ Z0 e, e0 ƒ d k rCe0 d- 9Z0 n  e j4 j5 d. ƒ see j6 d. ƒ n  e, e+ j- ƒ d k r¼e+ j7 s�e' e0 ƒ q¼e+ j- j8 g  dS D] Z9 e: e9 ƒ ^ q ƒ n  e, e+ j- ƒ d k r±xÚe+ j- d D]ÈZ; g  e; j/ dE ƒ D] Z2 e3 e2 ƒ ^ qõZ< e, e< ƒ dT k s%t. ‚ e, e< ƒ d k rDe< dF 9Z< n  x`e= e< d+ e< d d ƒ D]CZ> e+ j? s±e j@ e> ƒ ZA e jB eA jC ƒ e jD dG e> ƒ jE ƒ  k sæt. ‚ n5 d  dH l mF ZF eF j@ dI e> ƒ ZA dJ Ge> GHe> d  9Z> eA ZG e+ jH sþe+ jI reA jJ ƒ  ZG n  dK GHe jK e> eG ƒ e+ jL r:eA jJ ƒ  ZG n  e+ jM rPeG jN ƒ  n  e dL e> dM eG dN e0 dO e+ jH pwe+ jL dP e+ jO ƒ e+ jP r`e& dM eA dN e0 ƒ q`q`WqßWq±n  d
 S(U   iÿÿÿÿ(   t   division(   t   reference_table(   t   jv_asu(   t   sgtbx(   t   matrix(   t   dicts(   t   command_line(   t   easy_run(   t   rationalNt   colored_grid_pointc           B   s   e  Z d  „  Z RS(   c         C   s   t  | ƒ |  _ | |  _ d  S(   N(   t   tuplet   sitet   color(   t   selfR   R   (    (    s]   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/sgtbx/direct_space_asu/check_redundancies.pyt   __init__   s    (   t   __name__t
   __module__R   (    (    (    s]   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/sgtbx/direct_space_asu/check_redundancies.pyR	      s   i   c         C   sÔ  d } g  } x� t  | d ƒ D]o } g  } xS t  | d ƒ D]A } g  }	 x% t  | d ƒ D] }
 |	 j d ƒ qW W| j |	 ƒ q: W| j | ƒ q Wg  } g  } x%t  | d d | d d ƒ D]} g  } xçt  | d d | d d ƒ D]Å} g  }	 x©t  | d d | d d ƒ D]‡}
 t j | | |
 f | ƒ } |  j | ƒ } |  j | d t ƒ} t |  j | ƒ ƒ d k rŸ| rŸ| j t | t	 j
 | ƒ ƒ ƒ n  | r¾| sÄ| s»t ‚ qÄn t } | sÐ| r‘| | d } | | d } |
 | d } | | | | d k rG| d 7} | sGd G| | |
 f G| | | f GHqGn  | rod | | | | <|	 j d ƒ qžd | | | | <|	 j d ƒ q|	 j d ƒ qW| j |	 ƒ qê W| j | ƒ q½ W| | | | f S(   Ni    i   i   t
   shape_onlys   Redundancy at(   t   xranget   appendR   t   vectort	   is_insidet   Truet   lent   in_which_cutsR	   R   t   select_colort   AssertionErrort   False(   t   asut   nt   shapet   is_stripped_asut   n_redundanciest   u_gridt   it   bt   jt   ct   kt   r_gridt   colored_grid_pointst   fract   ft   fvt   i_prt   j_prt   k_pr(    (    s]   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/sgtbx/direct_space_asu/check_redundancies.pyt
   sample_asu   sZ    '''!	 
%c         C   s�   d GHd } xy |  j  ƒ  D]k } d } xG | D]? } | t j d d ƒ k  sV | d k r+ d } | d 7} Pq+ q+ Wd t | ƒ | f GHq W| d k s™ t ‚ d  S(   Ns   Shape vertices:i    t    i   i   s    outside sampling grids     %s%s(   t   shape_verticesR   t   intt   strR   (   R   t   n_outside_sampling_gridt   vertext   st   v(    (    s]   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/sgtbx/direct_space_asu/check_redundancies.pyt&   check_compatibility_with_sampling_gridC   s    %
c         C   s÷  t  j | j ƒ j ƒ  } | j ƒ  |  d k rO | j ƒ  j ƒ  |  k sO t ‚ n  d G| GH| j ƒ  } t	 d | ƒ t
 j j ƒ  t | | d | ƒ\ } } }	 }
 d } i  } x— t | d ƒ D]… } x| t | d ƒ D]j } xa t | d ƒ D]O } | t d | d | d	 | d
 | d | d | d | d |
 d | d | ƒ 
7} qê WqÓ Wq¼ Wd |
 | f G| j ƒ  t
 j j ƒ  t | ƒ } t | |	 | | ƒ t j |  | d |	 ƒ| sæt | | | ƒ | sæ|
 d k sÎt ‚ | d k sãt ‚ qæn  t
 j j ƒ  d  S(   Ni    s	   Gridding:R   R   i   i   t   opsR   R!   R'   R"   R$   R&   t   sampling_n_redundanciest   redundanciest	   soft_modes   number of redundancies: %d+%d,R(   (   R   t   space_groupt   hall_symbolt   infot   show_summaryt   typet   numberR   t   groupR8   t   syst   stdoutt   flushR/   R   t   grid_asut   sort_redundanciest   recolor_grid_pointsR   t
   asu_as_jvxt   analyze_redundancies(   t   group_type_numberR   R   R   R<   t   sg_infoR9   R!   R'   R(   R:   R    R;   R"   R$   R&   (    (    s]   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/sgtbx/direct_space_asu/check_redundancies.pyt	   check_asuP   sF    
!		*
t   color_serverc           B   s   e  Z d  „  Z d „  Z RS(   c         C   s:   d	 d
 f d d f d d f d d f f |  _  d |  _ d  S(   Ni    iÿ   i™   iÌ   if   i3   i²   iÿÿÿÿ(   i    i    iÿ   (   i™   iÌ   iÿ   (   iÿ   iÿ   i    (   iÿ   i™   i    (   iÿ   i    iÿ   (   iÿ   if   i™   (   i3   i3   i3   (   i²   i²   i²   (   t   color_pairsR"   (   R   (    (    s]   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/sgtbx/direct_space_asu/check_redundancies.pyR   w   s
    			c         C   s<   |  j  t |  j ƒ d k  r. |  j  d 7_  n  |  j |  j  S(   Ni   (   R"   R   RP   (   R   (    (    s]   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/sgtbx/direct_space_asu/check_redundancies.pyt   next   s    (   R   R   R   RQ   (    (    (    s]   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/sgtbx/direct_space_asu/check_redundancies.pyRO   u   s   	c         C   sò   t  ƒ  } i  } xÜ | D]Ô \ } } | r> d t | ƒ G| GHn  t j j ƒ  i  } x | D] }	 |	 | |	 j <qX W| j ƒ  }
 xl | D]d } x[ t | |
 ƒ D]J \ } } t t	 j
 | |  ƒ ƒ } | | k r˜ d | | <| | | _ q˜ q˜ Wq‚ Wq Wd  S(   Ns   Coloring %d redundancies:i   (   RO   R   RD   RE   RF   R   RQ   t   zipR
   R   R   R   (   t   griddingR(   R;   t   verboset	   color_srvt   processed_pointst   symopt   pairst   colored_point_dictt   colored_pointt   colorst   pairt   pointR   R)   (    (    s]   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/sgtbx/direct_space_asu/check_redundancies.pyRI   „   s     	
c         C   s(   |  d k  r t  |  d ƒ St  |  d ƒ S(   Ni    g      à?(   R2   (   t   x(    (    s]   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/sgtbx/direct_space_asu/check_redundancies.pyt   iround–   s    c         C   s1   t  j |  j ƒ  |  j ƒ  j t  j | d ƒ ƒ ƒ S(   Ni   (   R   t   rt_mxt   rt   tt   plust   tr_vec(   t   rtt   unit_shifts(    (    s]   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/sgtbx/direct_space_asu/check_redundancies.pyt   rt_plus_unit_shifts›   s    c         C   sE  t  j g  t d ƒ D] } | | t | | ƒ ^ q ƒ } t  j |  j ƒ  j ƒ  ƒ } t  j |  j ƒ  j ƒ  ƒ } | | | } d d d g } d d d g }	 x� t d ƒ D] } t | j	 | | | ƒ }
 |
 | | | | <t | | |
 ƒ | | } t | ƒ |	 | <t
 | |	 | ƒ d k  s© t ‚ q© Wt | ƒ t |  |	 ƒ f S(   Ni   i    gñhãˆµøä>(   R   t   colR   t   floatt   sqrRa   t	   as_doubleRb   R_   t   elemst   absR   R
   Rg   (   Re   t   i_gridR   R"   t
   grid_pointt   rotatt   transt   eq_ptt   eq_gptRf   t   egt   u(    (    s]   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/sgtbx/direct_space_asu/check_redundancies.pyt   rt_times_grid_pointž   s    :$c         C   s¾  d  } x™d D]‘} | d | |  d } | |  d d } | d k  s | |  d d |  d d k rm q n  x.d D]&} | d | |  d }	 |	 |  d d }
 |
 d k  st |
 |  d d |  d d k rÔ qt n  xÃ d D]» } | d | |  d } | |  d d } | d k  sÛ | |  d d |  d d k r;qÛ n  | | |
 | d k rÛ | d  k r�| |	 | f | | | f } } q–| s–t d ƒ ‚ qÛ qÛ Wqt Wq W| d  k	 s´t ‚ | | f S(	   Ni    iÿÿÿÿi   i   s   Double redundancy.(   i    iÿÿÿÿi   (   i    iÿÿÿÿi   (   i    iÿÿÿÿi   (   t   NoneR   (   R   t   u_indexR'   t   allow_ambiguityt   r_indext   uit   rit   qit   ujt   rjt   qjt   ukt   rkt   qkRf   (    (    s]   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/sgtbx/direct_space_asu/check_redundancies.pyt   u_index_as_r_index­   s,    , , , "!c
         C   sû  d }
 d } x»|  D]³} t  | | | | f | ƒ \ } } | | | | d k r˜d } | d | k sˆ | d | k sˆ | d | k rÆ| | d | d | d d k r•t | | | | f | d | d k ƒ\ } } t  | | | ƒ \ } } t | | | d | d k ƒ\ } } t | | ƒ } t | ƒ } | | f } |
 d 7}
 y | | j | ƒ Wq’t k
 rq‚  q’t k
 rŽ| g | | <q’Xq•qÆq | | d | d | d d k r d } Pq q W| d k r÷d G| | | f GH|	 s÷t ‚ n  |
 S(   Ni    i   i   Ry   s-   Orbit does not intersect with asymmetric unit(   Rv   R„   Rg   R3   R   t   KeyboardInterruptt	   ExceptionR   (   R9   R   R!   R'   R"   R$   R&   R:   R;   R<   t   resultt   markerRe   Rs   t   rtut   r_pivott   us_pivott   u_eqt   r_eqt   us_eqt   rtuuR6   R7   (    (    s]   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/sgtbx/direct_space_asu/check_redundancies.pyRG   Ã   s<    	!0$
   $c         C   s!   t  t | d ƒ t |  d ƒ ƒ S(   Ni   (   t   cmpR   (   t   aR#   (    (    s]   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/sgtbx/direct_space_asu/check_redundancies.pyt   compare_redundanciesë   s    c         C   s   |  j  ƒ  }  |  j t ƒ |  S(   N(   t   itemst   sortR’   (   R;   (    (    s]   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/sgtbx/direct_space_asu/check_redundancies.pyRH   î   s    c         C   s   d |  S(   Ns
   [%d,%d,%d](    (   t   ev(    (    s]   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/sgtbx/direct_space_asu/check_redundancies.pyt   str_evó   s    c         C   s,   g  } x |  D] } | j  | | ƒ q W| S(   N(   R   (   RX   R"   R‡   R\   (    (    s]   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/sgtbx/direct_space_asu/check_redundancies.pyt   sliceö   s    c         C   sP  t  j |  j ƒ  ƒ } t  j |  ƒ } t | j ƒ  j ƒ  ƒ } t | j ƒ  j ƒ  ƒ } | j ƒ  d k rj d S| j ƒ  d k rŸ t | j ƒ  ƒ d d d | f f St	 | j ƒ  ƒ d k rñ t | j ƒ  ƒ d t
 | j ƒ  ƒ d | f d | f f Sd	 } | j ƒ  d
 k  rd } n  t | j ƒ  ƒ | d t
 | j ƒ  ƒ d | f d | f f S(   Ni   t   1t   -iÿÿÿÿs   location=(%s)i   s   axis=s   (%s)t   +i    (   R˜   R™   R™   R™   (   R   t   rot_mx_infoRa   t   translation_part_infoR3   t   intrinsic_partt   mod_positivet   origin_shiftRA   Rm   R–   R•   t   sense(   R6   t   r_infot   t_infot   t_intrinsict   t_shiftR    (    (    s]   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/sgtbx/direct_space_asu/check_redundancies.pyt   rt_mx_analysisü   s(    #
	
i   c         C   s  t  | ƒ d k r d  Sd GHx? | D]7 \ } } | Gd Gt  | ƒ GHd Gt t j | ƒ ƒ GHq" Wd GHx³| D]«\ } } | Gd Gt  | ƒ GHd Gt t j | ƒ ƒ GHt j t ƒ } i  } xm | D]e } x\ | D]T }	 |  j t j	 |	 | ƒ ƒ }
 t  |
 ƒ d k r	d | |	 <n  d | t
 |
 ƒ |	 <qÉ Wq¼ Wd GHx{ | j ƒ  D]m \ }
 } d Gt } x% |
 D] } | rgd	 Gn  | Gt } qTWd
 t  | ƒ Gt | j ƒ  d  ƒ j d d ƒ GHq7W| rÐd GHx | D] } d G| GHqºWn  t  | ƒ d k rd GHx | j ƒ  D] }	 d G|	 GHqôWt d ‚ n  Hqi Wd  S(   Ni    s	   Overview:s   : number of redundancies:s     s   Details:i   s       In cuts:s        t   &s   #points: %d:i   t    R0   s
       Pairs:s         s       Not in cuts:s&   Some redundant points not in any cuts.(   R   R¥   R   R`   R   t   with_default_factoryt   dictR   R   R   R
   R“   R   R   R3   t   keyst   replaceR   (   R   R   R;   RT   RW   RX   t   all_cutst   not_in_cutsR\   R]   t   cutst   pointst   show_ampt   cut(    (    s]   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/sgtbx/direct_space_asu/check_redundancies.pyRK     sN      
%c            s  t  j |  j ƒ } |  j ƒ  ‰  d Gt ˆ  ƒ GH‡  f d †  } i  } xô t | d d | d d ƒ D]Ò } xÉ t | d d | d d ƒ D]§ } xž t | d d | d d ƒ D]| } t j | | | f | ƒ } |  j | ƒ r± | | ƒ }	 |	 d k r-| j	 d | ƒ }
 | j
 |	 t ƒ  ƒ j |
 ƒ q-q± q± WqŠ Wqc WxË | j ƒ  D]; \ }	 } t | ƒ d k rFd G| j ƒ  j ƒ  G| GHPqFqFWd GH| j ƒ  } g  } xY t | j ƒ  ƒ D]E }	 t | |	 ƒ d }
 |
 | k r¯|	 G|
 GH| j |	 |
 f ƒ q¯q¯Wd	 Gt | ƒ GHd  S(
   Ns   Total number of cuts:c            sM   d } d } x: ˆ  D]2 } | j  |  ƒ d k r; | | 7} n  | d 9} q W| S(   Ni    i   i   (   t   evaluate(   R]   R‡   t   bitR±   (   R¬   (    s]   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/sgtbx/direct_space_asu/check_redundancies.pyt   get_code=  s    i    i   i   R   s   PROBLEM:s'   cut intersection multiplicities unique:s!   Number of cut intersection codes:(   R   R=   R>   t   extract_all_cutsR   R   R   R   R   t   multiplicityt
   setdefaultt   sett   addR“   RA   RB   t   order_zt   sortedRª   t   listR   (   R   R   R=   R´   t   mults_by_codeR"   R$   R&   R]   t   codet   mt   multsRº   t	   tab_codes(    (   R¬   s]   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/sgtbx/direct_space_asu/check_redundancies.pyt   check_multiplicities9  s6    '''.	c         C   sn   xg t  d d ƒ D]V } d t j d d |  t | ƒ } | GHt j j ƒ  t j | ƒ Ht j j ƒ  q Wd  S(   Ni   iç   s   cctbx.python %si    s
    %d,%d,%d (   R   RD   t   argvR3   RE   RF   R   t   call(   R   t   space_group_numbert   cmd(    (    s]   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/sgtbx/direct_space_asu/check_redundancies.pyt   test_all^  s    #t   __main__t   show_asut   stript
   strip_gridt   strip_polygonst   enantiomorphict   softt   multiplicitiest   plane_groupi    t   ,i   t   asu_galleryiL   iN   i[   i_   i\   i`   i�   i‘   i—   i™   i˜   iš   i©   iª   i«   i¬   i²   i³   i´   iµ   iÔ   iÕ   R™   i   RB   (   t   plane_group_reference_tablet   point_group_numbers   Plane group number:s   Writing asu_gallery filesRL   R   R   R   R<   (   i   i   i   (   i   i   (   iL   iN   i[   i_   i\   i`   i�   i‘   i—   i™   i˜   iš   i©   iª   i«   i¬   i²   i³   i´   iµ   iÔ   iÕ   (   i   i   (Q   t
   __future__R    t   cctbx.sgtbx.direct_space_asuR   t   cctbx.web.asu_galleryR   t   cctbxR   t   scitbxR   t   scitbx.python_utilsR   R   t   libtbxR   t   boostR   RD   t   ost   objectR	   R   R/   R8   RN   RO   RI   R_   Rg   Rv   R„   RG   R’   RH   R–   R—   R¥   RK   RÂ   RÇ   R   t   parse_optionsRÃ   t   flagsR   t   regular_argsR   t   splitRS   R
   R   R2   t   patht   isdirt   mkdirRÍ   t   extendR"   R3   t   argt   numbersR   RL   RÐ   t   get_asut   asu_originalR=   R>   t   space_group_infoRC   RÓ   R   RÊ   RÌ   R   RJ   RË   RÉ   t   show_comprehensive_summaryRÎ   RÏ   (    (    (    s]   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/sgtbx/direct_space_asu/check_redundancies.pyt   <module>   s²   1		%						(					'	%	
% 	    ( "	$			
		
	