ó
L™xTc           @   sv   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 e f d „  ƒ  YZ d S(	   iÿÿÿÿ(   t   division(   t   sgtbx(   t	   cut_plane(   t   r1(   t   matrixNt   direct_space_asuc           B   sË   e  Z g  d  „ Z d „  Z d „  Z d d „ Z d d „ Z e d „ Z	 d „  Z
 d „  Z d „  Z d	 „  Z d
 „  Z d d „ Z d d „ Z d d „ Z d e d „ Z d „  Z d „  Z d d d „ Z RS(   c         C   s   | |  _  | |  _ d  S(   N(   t   hall_symbolt   cuts(   t   selfR   R   (    (    sS   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/sgtbx/direct_space_asu/__init__.pyt   __init__
   s    	c         C   s   t  d |  j d |  j ƒ S(   NR   R   (   R   R   R   (   R   (    (    sS   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/sgtbx/direct_space_asu/__init__.pyt   __copy__   s    	c         C   s   |  j  j | ƒ |  S(   N(   R   t   append(   R   t   obj(    (    sS   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/sgtbx/direct_space_asu/__init__.pyt   __and__   s    c         C   sH   | d  k r t j } n  | d I|  j IJ| d It |  j ƒ IJ|  S(   Ns   Hall symbol:s   Number of cuts:(   t   Nonet   syst   stdoutR   t   lenR   (   R   t   f(    (    sS   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/sgtbx/direct_space_asu/__init__.pyt   show_summary   s
     c         C   sM   | d  k r t j } n  |  j | ƒ x! |  j D] } | d I| IJq/ W|  S(   Ns       &(   R   R   R   R   R   (   R   R   t   cut(    (    sS   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/sgtbx/direct_space_asu/__init__.pyt   show_comprehensive_summary   s     c         C   sa   | r6 xT |  j  D] } | j | ƒ d k  r t Sq Wn' x$ |  j  D] } | j | ƒ s@ t Sq@ Wt S(   sÉ  Check if a given point in direct space is inside the asymmetric unit.
    The coordinates of the point are expected to be factional coordinates.
    To use cartesian coordinates you can use something like:
    asu.is_inside(unit_cell.fractionalize(site_cart)).

    :param shape_only: If set to 'True' ??? #XXX what exactly is this option for?
    :type shape_only: boolean

    :returns: True if point is inside the asymmetric unit
    :rtype: boolean
    i    (   R   t   evaluatet   Falset	   is_insidet   True(   R   t   pointt
   shape_onlyR   (    (    sS   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/sgtbx/direct_space_asu/__init__.pyR   $   s      c         C   sC   g  } x6 |  j  D]+ } | j | ƒ d k r | j | ƒ q q W| S(   Ni    (   R   R   R   (   R   R   t   resultR   (    (    sS   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/sgtbx/direct_space_asu/__init__.pyt   in_which_cuts8   s
    c         C   s+   g  } x |  j  D] } | j | ƒ q W| S(   N(   R   t   extract_all_cuts(   R   R   R   (    (    sS   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/sgtbx/direct_space_asu/__init__.pyR   ?   s    c         C   s=   t  |  j ƒ } x' |  j D] } | j j | j ƒ  ƒ q W| S(   N(   R   R   R   R   t   strip(   R   R   R   (    (    sS   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/sgtbx/direct_space_asu/__init__.pyR   E   s    c         C   sF  t  ƒ  } |  j } t | ƒ } xt d | d ƒ D]} xý t | d | d ƒ D]ä } xÛ t | d | ƒ D]Æ } t j | | j | | j | | j d ƒ } | j ƒ  } | d k rj | j ƒ  t	 | }	 t j
 | | j | | j | | j g ƒ }
 |	 |
 } |  j | d t ƒr0| j | j ƒ q0qj qj WqP Wq2 Wt | ƒ S(   Ni    i   i   i   R   (   i   i   (   t   setR   R   t   xrangeR   t   rect   nt   determinantt   co_factor_matrix_transposedR   t   colt   cR   R   t   addt   elemst   sorted(   R   R   R   t   n_cutst   i0t   i1t   i2t   mt   dt   m_invt   bt   vertex(    (    sS   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/sgtbx/direct_space_asu/__init__.pyt   shape_verticesK   s    		/0
"c         C   sŒ   | d  k r |  j ƒ  } n  t | ƒ d k r1 d  St | d ƒ } xD | d D]8 } x/ t d ƒ D]! } | | | | | ƒ | | <q_ WqL W| S(   Ni    i   i   (   R   R4   R   t   listR!   (   R   R4   t
   min_or_maxR   R3   t   i(    (    sS   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/sgtbx/direct_space_asu/__init__.pyt   _box_corner\   s    #c         C   s   |  j  | t ƒ S(   N(   R8   t   min(   R   R4   (    (    sS   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/sgtbx/direct_space_asu/__init__.pyt   box_ming   s    c         C   s   |  j  | t ƒ S(   N(   R8   t   max(   R   R4   (    (    sS   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/sgtbx/direct_space_asu/__init__.pyt   box_maxj   s    c         C   s]   | d  k r |  j ƒ  } n  |  j j t j d | d t j | ƒ j t j | ƒ ƒ ƒ ƒ d  S(   NR#   R'   (	   R   R:   R   R   R   R   R   R&   t   dot(   R   t   normal_directionR   (    (    sS   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/sgtbx/direct_space_asu/__init__.pyt	   add_planem   s
    c         C   sg   | d  k r |  j ƒ  } n  xE | D]= } |  j d | d | ƒ | r" |  j j |  j d ƒ q" q" Wd  S(   NR>   R   iÿÿÿÿ(   R   R:   R?   R   R   (   R   t   normal_directionsR   t   both_directionsR>   (    (    sS   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/sgtbx/direct_space_asu/__init__.pyt
   add_planest   s    c         C   s°   t  | t j ƒ s$ t j | ƒ } n  d  } |  j d  k	 rs t j d |  j ƒ } | j | ƒ } | j ƒ  j ƒ  } n  t | ƒ } x* |  j	 D] } | j	 j
 | j | ƒ ƒ q‰ W| S(   Ns   Hall: (   t
   isinstanceR   t   change_of_basis_opR   R   t   space_group_infot   change_basist   typeR   R   R   (   R   t   cb_opt   cb_hall_symbolRE   t   cb_space_group_infot   cb_asuR   (    (    sS   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/sgtbx/direct_space_asu/__init__.pyRF   |   s    c         C   s(   d d  l  } | j j j d |  d | ƒ S(   Niÿÿÿÿt   asut	   unit_cell(   t   cctbx.crystal.direct_space_asut   crystalR   (   R   RM   t   cctbx(    (    sS   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/sgtbx/direct_space_asu/__init__.pyt   define_metric‰   s    c         C   s   |  j  | ƒ j d | d | ƒ S(   Nt	   thicknesst   relative_thickness(   RQ   t
   add_buffer(   R   RM   RR   RS   (    (    sS   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/sgtbx/direct_space_asu/__init__.pyRT   Ž   s    N(   t   __name__t
   __module__R	   R
   R   R   R   R   R   R   R   R   R   R4   R8   R:   R<   R?   RB   RF   RQ   RT   (    (    (    sS   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/sgtbx/direct_space_asu/__init__.pyR      s$   									(   t
   __future__R    RP   R   t   cctbx.sgtbx.direct_space_asuR   t'   cctbx.sgtbx.direct_space_asu.short_cutsR   t   scitbxR   R   t   objectR   (    (    (    sS   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/sgtbx/direct_space_asu/__init__.pyt   <module>   s   