ó
L™xTc           @   sh  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 „  Z d „  Z d	 „  Z d
 d 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 d „  Z d „  Z d „  Z d „  Z d e f d „  ƒ  YZ d e f d  „  ƒ  YZ  d! e f d" „  ƒ  YZ! d# „  Z" d$ „  Z# d S(%   iÿÿÿÿ(   t   division(   t	   cut_plane(   t   flex(   t   matrixN(   t   rationalc   
      C   s‘  t  |  ƒ d k s t ‚ t j ƒ  } t j ƒ  } d } x  |  D] } | j d | ƒ } q= WxT |  D]L } x( | j D] } | j t | | ƒ ƒ qp W| j t | j | ƒ ƒ q` W| j t j	 d d ƒ ƒ | j t j	 d d ƒ ƒ t
 j j | | ƒ } | d k s	t ‚ | d k rd  S| j t j	 d ƒ ƒ t j d ƒ } t
 j j | | | ƒ } | d k sht ‚ t g  | D] }	 t j |	 | ƒ ^ qrƒ S(   Ni   i   t	   start_lcmi   i    (   i   i   (   t   lent   AssertionErrorR   t   intt   lcm_of_denominatorst   nt   appendt   ct   reshapet   gridt   scitbxt   matht   row_echelon_form_tt   Nonet!   row_echelon_back_substitution_intt   tupleR   (
   t   cutst   mt   tt   denominatort   cutt   et   rt   solt   dt   s(    (    sY   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/sgtbx/direct_space_asu/facet_analysis.pyt   intersection   s*      c         C   sY   i  } xL | j  ƒ  D]> } x5 |  D] } | j | ƒ d k  r  Pq  q  W| | | | <q W| S(   Ni    (   t   keyst   evaluate(   t
   other_cutst   verticest   resultt   vertexR   (    (    sY   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/sgtbx/direct_space_asu/facet_analysis.pyt   eliminate_outside_vertices   s    c         C   s¬   i  } t  | ƒ } x„ t | d ƒ D]r } xi t | d | ƒ D]T } t d |  | | | | f ƒ } | d  k	 r= | j | g  ƒ j | | f ƒ q= q= Wq# Wt d | d | ƒ S(   Ni   R   R"   R#   (   R   t   xrangeR   R   t
   setdefaultR   R&   (   t   pivotR"   R$   R
   t   it   jR%   (    (    sY   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/sgtbx/direct_space_asu/facet_analysis.pyt   polygon_vertices'   s     *t   &t   |c         C   sÇ   t  |  t j ƒ r |  g g St  |  t j ƒ s4 t ‚ t |  j | | ƒ } t |  j | | ƒ } |  j | k ru | | S|  j | k sŠ t ‚ g  } x0 | D]( } x | D] } | j	 | | ƒ q¤ Wq— W| S(   N(
   t
   isinstanceR   R   t   cut_expressionR   t   depth1_cutst   lhst   rhst   opR   (   t   exprt   op_andt   op_orR2   R3   R$   t   lR   (    (    sY   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/sgtbx/direct_space_asu/facet_analysis.pyR1   1   s    
c   	      C   sø   |  j  | } |  j  |  |  j  | d } | j ƒ  sN t | | ƒ | j f g St | j ƒ } t | j d d ƒ } g  } x. | D]& } | j t | | | ƒ t f ƒ q WxH | D]@ } g  | D] } | ^ q½ } | j t | | | ƒ t f ƒ q° W| S(   Ni   R.   R-   (	   R   t   has_cutsR,   t	   inclusiveR1   t   cut_exprR   t   Truet   False(	   t   asut   i_pivotR)   R"   t   cuts_insidet   cuts_outsideR$   R   t   f(    (    sY   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/sgtbx/direct_space_asu/facet_analysis.pyt   face_vertices@   s    $$c         C   sŸ   t  | ƒ d k s t ‚ t j } | | d d ƒ } | |  ƒ | | d d ƒ | | | d d ƒ | g } t j | ƒ j ƒ  j ƒ  } | d k s› t ‚ | S(   Ni   i    iÿÿÿÿi   (   R   R   R   t   rowt   colt   resolve_partitionst   determinant(   t   cut_nt   polygonRD   t   p00t   rowsR   (    (    sY   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/sgtbx/direct_space_asu/facet_analysis.pyt   sense_of_polygonO   s    	9c   	      C   sü   d } xÉ | D]Á \ } } | d 7} x¨ | D]  } | d | k re t  | ƒ } | j ƒ  t | ƒ } n  | d | k r* t d |  | | f g d | d | d d | |  | | d ƒ } | d  k	 rÊ | Sq* q* Wq Wt | ƒ d k rè d  S| | k rø d  S|  S(   Niÿÿÿÿi   i    RI   t   begin_cut_indext   end_cut_indext   unused_face_vertices(   t   listt   reverseR   t   trace_polygonR   R   (	   RI   RM   RN   RO   t   i_vertexR%   t   list_of_other_cut_indicest   cut_indicest   full_polygon(    (    sY   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/sgtbx/direct_space_asu/facet_analysis.pyRR   X   s,    


  c         C   së   t  d |  d | ƒ } g  } xÉ | D]Á \ } } | j ƒ  } | d \ } } xH | D]@ }	 t | |	 f g |	 d |	 d | d ƒ }
 |
 d  k	 rQ PqQ qQ W|
 d  k	 r" t |  j | j |
 ƒ d k  rÍ |
 j ƒ  n  | j |
 | f ƒ q" q" W| S(   NR>   R?   i    i   (	   RC   t   itemsRR   R   RL   R   R
   RQ   R   (   R>   R?   t   vertex_dictsR$   t   vertex_dictt   flagt   vertex_listR%   RT   t   other_cut_indicesRI   (    (    sY   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/sgtbx/direct_space_asu/facet_analysis.pyt   face_polygonss   s"     c         C   sY   g  } x9 t  t |  j ƒ ƒ D]" } | j t d |  d | ƒ ƒ q Wt d |  d | ƒ | S(   NR>   R?   t   list_of_polygons(   R'   R   R   R   R]   t   verify_asu_polygons(   R>   R$   R?   (    (    sY   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/sgtbx/direct_space_asu/facet_analysis.pyt   asu_polygons…   s
     c         C   sY   i  } xF |  D]> } x5 | D]- \ } } x | D] \ } } d | | <q- Wq Wq W| j  ƒ  S(   Ni   (   R    (   R^   R$   t   polygonsRI   t   inclusive_flagR%   RU   (    (    sY   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/sgtbx/direct_space_asu/facet_analysis.pyt   extract_polygon_verticesŒ   s    c         C   s   t  t |  j ƒ  ƒ ƒ S(   N(   Rc   R`   t
   shape_only(   R>   (    (    sY   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/sgtbx/direct_space_asu/facet_analysis.pyt   shape_vertices”   s    c         C   sA   g  t  d ƒ D]0 } |  | t j | | ƒ | | |  | ^ q S(   Ni   (   R'   R   R   (   t   at   bRB   t   griddingR*   (    (    sY   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/sgtbx/direct_space_asu/facet_analysis.pyt   line_sample_point—   s    i   c      
   C   sé   xâ | D]Ú } xÑ | D]É \ } } t  | ƒ } x® t | d ƒ D]œ } x“ t | d t | | | d ƒ ƒ D]m } | | d | | d }	 }
 xG t d | ƒ D]6 } t |	 |
 | | ƒ } |  j | ƒ | k s› t ‚ q› Wqh Wq= Wq Wq Wd  S(   Ni   i   i    (   R   R'   t   minRi   t	   is_insideR   (   R>   R^   Rh   Ra   RI   Rb   R
   R*   R+   Rf   Rg   RB   t   x(    (    sY   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/sgtbx/direct_space_asu/facet_analysis.pyR_   š   s    +c         C   s�   |  d  k r g  St |  t j ƒ r) |  g St |  t j ƒ sA t ‚ t |  j ƒ } t |  j ƒ } x* | D]" } | | k rf | j	 | ƒ qf qf W| S(   N(
   R   R/   R   R   R0   R   t   collect_cutsR2   R3   R   (   R5   R2   R3   R   (    (    sY   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/sgtbx/direct_space_asu/facet_analysis.pyRm   ¥   s     c         C   s=   x6 |  D]. } | j  | j  k r | j | j k r t Sq Wt S(   N(   R
   R   R<   R=   (   t   cut_listt   addl_cutR   (    (    sY   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/sgtbx/direct_space_asu/facet_analysis.pyt	   is_one_of±   s    $c         C   s  i  } xî |  j  D]ã } xÚ t | j ƒ D]É } xÀ t | j ƒ D]¯ } | | | f } | j ƒ  r¨ t | j t j ƒ sx t ‚ | j j t	 k s� t ‚ t
 | | ƒ s¨ t ‚ n  t d | ƒ } | d  k	 sÉ t ‚ |  j | d t ƒr< d | | <q< q< Wq& Wq W| j ƒ  S(   NR   Rd   i   (   R   Rm   R;   R9   R/   R   R   R   R:   R=   Rp   R   R   Rk   R<   R    (   R>   R$   R)   t	   first_cutt
   second_cutt   all_cutst   point(    (    sY   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/sgtbx/direct_space_asu/facet_analysis.pyt   all_cut_points·   s    c         C   s¹   i  } x¦ |  D]ž } x• | D]� \ } } t  | ƒ } xr t | ƒ D]d } | d | } | | d } | | d }	 | |	 f }
 | j |
 ƒ s™ |	 | f }
 n  d | |
 <q? Wq Wq W| j ƒ  S(   Ni   i    (   R   R'   t   has_keyR    (   R^   R$   Ra   RI   Rb   R
   R*   R+   t   v1t   v2t   key(    (    sY   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/sgtbx/direct_space_asu/facet_analysis.pyt   get_edge_verticesÇ   s    c   	      C   s¿   |  d } |  d } | } d  } x˜ t d ƒ D]Š } | | | | } | d  k r‘ | d k rv | | | | | } q· | | | | k r· d  Sq- | | | | } | | | k r- d  Sq- W| S(   Ni    i   i   (   R   R'   (	   t   edge_end_pointst   other_pointRf   Rg   Rl   RB   R*   t   d_it   y_i(    (    sY   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/sgtbx/direct_space_asu/facet_analysis.pyt   edge_positionÖ   s    

  c         C   s4   |  d | d k  r d S|  d | d k r0 d Sd S(   Ni   iÿÿÿÿi    (    (   Rf   Rg   (    (    sY   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/sgtbx/direct_space_asu/facet_analysis.pyt   packed_cut_point_sort_functionç   s
      t   edge_with_cut_pointsc           B   s\   e  Z d  d g Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z	 d	 „  Z
 RS(
   t
   end_pointst
   cut_pointsc         C   s"   t  | ƒ |  _ t  | ƒ |  _ d  S(   N(   R   R‚   Rƒ   (   t   selfR‚   Rƒ   (    (    sY   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/sgtbx/direct_space_asu/facet_analysis.pyt   __init__ð   s    c         C   s   d G|  j  GHd G|  j GHd  S(   Ns   end points:s   cut points:(   R‚   Rƒ   (   R„   (    (    sY   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/sgtbx/direct_space_asu/facet_analysis.pyt   show_pointsô   s    c         C   s&   g  |  j  D] } t |  j | ƒ ^ q
 S(   N(   Rƒ   R   R‚   (   R„   Rt   (    (    sY   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/sgtbx/direct_space_asu/facet_analysis.pyt   cut_point_positionsø   s    c         C   s@   t  |  j |  j ƒ  ƒ } | j t ƒ g  | D] } | d ^ q, S(   Ni    (   t   zipRƒ   R‡   t   sortR€   (   R„   t   packedt   p(    (    sY   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/sgtbx/direct_space_asu/facet_analysis.pyt   sorted_cut_pointsû   s    c         C   s   t  |  j |  j ƒ  ƒ S(   N(   R�   R‚   RŒ   (   R„   (    (    sY   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/sgtbx/direct_space_asu/facet_analysis.pyt   sort_cut_points   s    c         C   s#   |  j  d f |  j |  j  d f S(   Ni    i   (   R‚   Rƒ   (   R„   (    (    sY   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/sgtbx/direct_space_asu/facet_analysis.pyt
   all_points  s    c         C   sé   t  |  j | ƒ } | d  k sE | d k sE | d k sE | |  j k rO | |  f S| d k  rŒ | t | |  j d f |  j d f |  j ƒ f S| d k rÉ | t |  j d | f |  j |  j d f ƒ f S| t |  j |  j | f ƒ f S(   Ni    i   (   R   R‚   R   Rƒ   R�   (   R„   Rt   RB   (    (    sY   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/sgtbx/direct_space_asu/facet_analysis.pyt
   join_point  s    3
c         C   sQ   |  } t  } x8 | D]0 } | j | ƒ \ } } | d  k r t } q q W| | f S(   N(   R<   R�   R   R=   (   R„   t   edgeR$   t   linear_dependentRt   RB   (    (    sY   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/sgtbx/direct_space_asu/facet_analysis.pyt	   join_edge  s     (   t   __name__t
   __module__t	   __slots__R…   R†   R‡   RŒ   R�   RŽ   R�   R’   (    (    (    sY   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/sgtbx/direct_space_asu/facet_analysis.pyR�   ì   s   							t   edge_segmentc           B   s    e  Z d  d d g Z d „  Z RS(   R%   t   vertex_inclusive_flagt   edge_inclusive_flagc         C   s   | |  _  | |  _ | |  _ d  S(   N(   R%   R—   R˜   (   R„   R%   R—   R˜   (    (    sY   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/sgtbx/direct_space_asu/facet_analysis.pyR…   "  s    		(   R“   R”   R•   R…   (    (    (    sY   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/sgtbx/direct_space_asu/facet_analysis.pyR–     s   t"   consolidated_edges_with_cut_pointsc           B   sD   e  Z d  d g Z d „  Z d „  Z d „  Z d „  Z d d „ Z RS(   R>   RP   c         C   sn   | |  _  g  |  _ t | ƒ } x$ t | ƒ D] } |  j | | ƒ q+ Wg  |  j D] } | j ƒ  ^ qO |  _ d  S(   N(   R>   RP   Ru   Rz   t   addR�   (   R„   R>   R^   t   addl_cut_pointsR�   t   ec(    (    sY   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/sgtbx/direct_space_asu/facet_analysis.pyR…   +  s    		c   	      C   sÖ   xJ t  t |  j ƒ ƒ D]3 } |  j | j | ƒ \ } |  j | <| r d  Sq Wt | d ƒ } x= |  j D]2 } x) | j ƒ  D] } | j | ƒ \ } } qy Wqf Wx# | D] } | j | ƒ \ } } q£ W|  j j | ƒ d  S(   N(    (   R'   R   RP   R’   R�   RŽ   R�   R   (	   R„   R�   R›   R*   R‘   t   edge_and_cutst   listed_edge_and_cutsRt   RB   (    (    sY   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/sgtbx/direct_space_asu/facet_analysis.pyRš   3  s    # c      
   C   sò   | j  ƒ  } g  } x£ t t | ƒ d ƒ D]‹ } | | | | d f } t j | d ƒ t j | d ƒ d j } | j t d | d d |  j j	 | d ƒ d |  j j	 | ƒ ƒ ƒ q) W| j t d | d d |  j j	 | d ƒ d d  ƒ ƒ | S(   Ni   i    i   R%   R—   R˜   iÿÿÿÿ(   RŽ   R'   R   R   RE   t   elemsR   R–   R>   Rk   R   (   R„   R�   t   pointsR$   R*   R#   t	   mid_point(    (    sY   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/sgtbx/direct_space_asu/facet_analysis.pyt   get_segments?  s    +


c         C   sA   g  } x' |  j  D] } | j |  j | ƒ ƒ q W|  j | ƒ | S(   N(   RP   R   R¢   t   verify_edge_segments(   R„   R$   R�   (    (    sY   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/sgtbx/direct_space_asu/facet_analysis.pyt   get_all_segmentsP  s
    i   c   
      C   sÈ   xÁ | D]¹ } x° t  t | ƒ d ƒ D]˜ } | | j } | | d j } d  } xk t  d | ƒ D]Z } t | | | | ƒ }	 | d  k rš |  j j |	 ƒ } q^ | |  j j |	 ƒ k s^ t ‚ q^ Wq$ Wq Wd  S(   Ni   (   R'   R   R%   R   Ri   R>   Rk   R   (
   R„   t   all_edge_segmentsRh   t   edge_segmentst	   i_segmentRf   Rg   Rk   RB   Rl   (    (    sY   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/sgtbx/direct_space_asu/facet_analysis.pyR£   W  s    (   R“   R”   R•   R…   Rš   R¢   R¤   R£   (    (    (    sY   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/sgtbx/direct_space_asu/facet_analysis.pyR™   '  s   				c         C   s   t  |  | ƒ j ƒ  S(   N(   R™   R¤   (   R>   R^   (    (    sY   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/sgtbx/direct_space_asu/facet_analysis.pyt   get_all_edge_segmentsd  s    c         C   sm   i  } x` |  D]X } xO | D]G } | j  | j ƒ rQ | | j | j k sa t ‚ q | j | | j <q Wq W| S(   N(   Rv   R%   R—   R   (   R¥   R$   R¦   t   segment(    (    sY   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/sgtbx/direct_space_asu/facet_analysis.pyt   get_all_verticesh  s    ($   t
   __future__R    t   cctbx.sgtbx.direct_space_asuR   t   cctbx.array_familyR   R   R   t   scitbx.matht   boostR   R   R&   R,   R1   RC   RL   RR   R]   R`   Rc   Re   Ri   R_   Rm   Rp   Ru   Rz   R   R€   t   objectR�   R–   R™   R¨   Rª   (    (    (    sY   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/sgtbx/direct_space_asu/facet_analysis.pyt   <module>   s:   		
	
															2	=	