ó
§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 Z d  d l	 Z	 d  d l
 m Z d e f d     YZ d	   Z d
   Z d   Z e d k r´ e   d GHn  d S(   i˙˙˙˙(   t   division(   t   sgtbx(   t   lbfgs(   t   flexN(   t   approx_equalt   detwinc           B   s;   e  Z d  d  Z d d  Z d   Z d   Z d   Z RS(   gvIhÂ%<=c         C   sę   | d k s t   | d k s$ t   | |  _ | |  _ | |  _ | |  _ | |  _ | |  _ t j t	 j
 t	 j |   t	 j
 t	 j |   g  |  _ t j d |   |  _ |  j d |  _ |  j d |  _ |  j |  j |  j  |  _ d  S(   Ni    t   target_evaluatori   (   t   AssertionErrort   i1t   s1t   i2t   s2t   at   epsR   t   doublet   matht   sqrtt   fabst   xR   t   runt	   minimizert   xmt   ymt   sndt   vcv(   t   selfR   R	   R
   R   t   alphaR   (    (    sU   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/twinning/probabalistic_detwinning.pyt   __init__   s    						!	g:0âyE>c         C   sL   |  j  |  j d |  j d  } |  j |  j d |  j d  } | | f S(   Ni    i   (   t   log_pR   t   d_log_p(   R   t   ht   ft   g(    (    sU   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/twinning/probabalistic_detwinning.pyt    compute_functional_and_gradients"   s    !!c   	      C   sď   | d k r |  j  } n  | d k r0 |  j  } n  t j |  t j |  } |  j } d | | | | | | } d | | | | | | } |  j | } | | d |  j |  j } |  j | } | | d |  j |  j } | | | S(   Ni    i   g       @(   R   R   t   logR   R   R	   R
   R   (	   R   R   R   t   tmp1R   t   ic1t   ic2t   tmp2t   tmp3(    (    sU   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/twinning/probabalistic_detwinning.pyR   '   s    	c         C   sS  | d k r |  j  } n  | d k r0 |  j  } n  |  j } d d | | d | | | | | | |  j |  j d d | | | | | | | | | |  j |  j d d | } d | | d | | | | | | |  j |  j d d d | | | | | | | | | |  j |  j d d | } t j | | g  S(   Ni    iţ˙˙˙i˙˙˙˙i   g      đ?(   R   R   R   R	   R
   R   R   R   (   R   R   R   R   t   df1t   df2(    (    sU   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/twinning/probabalistic_detwinning.pyR   7   s    	wzc         C   s`  | d k r |  j  } n  | d k r0 |  j  } n  |  j } d | | | d | | | | | | | | |  j |  j |  j } | d d | | | d d | | | | | | |  j |  j |  j |  j d 7} | | | |  j |  j |  j |  j } d d | | | | | | d | | d | | | |  j |  j d } | d | | | d | | | d | | | |  j |  j d |  j d 7} | | | |  j |  j |  j |  j } d d | | | | |  j d |  j d |  j d |  j d } | | | | } | | } | | }	 | | }
 | |	 |
 f S(   Ni    i   i   i˙˙˙˙i   (   R   R   R
   R	   R   R   (   R   R   R   R   t   sndxt   sndyt   dxyt   dett   s11t   s22t   s12(    (    sU   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/twinning/probabalistic_detwinning.pyR   H   s&    	K=+QT+-

(   t   __name__t
   __module__R   R!   R   R   R   (    (    (    sU   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/twinning/probabalistic_detwinning.pyR   
   s
   		c         C   s  t  j |  } |  j |  j |   } |  j |  j |   \ } } |  j   d  k	 s] t  |  j   d  k	 su t  | j	   r | j
   } | j
   } n  t j   } t j   } | j   rm| j   rmx t | j   | j   | j   | j    D]i \ }	 }
 } } t |	 |
 | |  } | j } t j t j t j d   } | j |  t j |  qú Wqmn  | j   } | j } d  S(   Ni    (   R   t   change_of_basis_opt   change_basist   set_observation_typet   common_setst   observation_typet   NoneR   t   sigmast   is_xray_amplitude_arrayt	   f_as_f_sqR   R   t   is_xray_intensity_arrayt   zipt   dataR   R   R   R   t   absR   R   t   appendt   detwinned_st	   f_sq_as_ft   customized_copy(   t
   miller_obst   twin_lawt   twin_fractiont   cb_opt   twin_related_millert   set1t   set2t   detwinned_ft   detwinned_sigmaR   R	   R
   R   t   tmp_detwinnert   ni1t   ns1t   new_f(    (    sU   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/twinning/probabalistic_detwinning.pyt   detwin_miller_arraya   s.    	(	c          C   sĐ  d }  d } d } d } d } t  |  | | | |  } t | j d d d sT t  t | j t j d  d d s{ t  d }  d	 } d
 } d
 } d } t  |  | | | |  } | | d | | d } | d | } t | j d | | d d s˙ t  |  |  d | | d } | d | } t | j d | | d d sMt  t | j d d d d sot  d }  d } d } d } d } t  |  | | | |  } t | j | j g d d g  sĚt  d  S(   Ng      @g      @g{ŽGáz?g      Đ?g       @R   g-Cëâ6?g      @g      "@gš?g        i   i   gńhăľřä>i    g:0âyE>g     @Ż@g     XŤ@i
   i   g      ŕ?gţťkÍN@góĐÍˇKÍN@(   R   R   R   R   R   R   R   R   (   R   R
   R	   R   R   t   tmpt   ttt(    (    sU   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/twinning/probabalistic_detwinning.pyt   test_detwin   s8    '&&"c           C   s   t    d  S(   N(   RT   (    (    (    sU   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/twinning/probabalistic_detwinning.pyR   Ś   s    t   __main__t   OK(   t
   __future__R    t   cctbxR   t   scitbxR   t   cctbx.array_familyR   t   scitbx.lbfgsR   t   libtbx.test_utilsR   t   objectR   RQ   RT   R   R1   (    (    (    sU   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/twinning/probabalistic_detwinning.pyt   <module>   s   W	!	$	