ó
7™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 e	 j
 d Z d f  d	 „  ƒ  YZ d
 f  d „  ƒ  YZ d S(   iÿÿÿÿ(   t   division(   t'   tensor_rank_2_gradient_transform_matrix(   t   matrix(   t   flexNiþÿÿÿi   t   structure_factorc           B   sP   e  Z d  „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z	 RS(   c         C   sm   | j  ƒ  |  _  | j ƒ  |  _ | j ƒ  |  _ | j ƒ  |  _ | j ƒ  |  _ | |  _ |  j  j | ƒ |  _ d  S(   N(   t	   unit_cellt   space_groupt
   scattererst   site_symmetry_tablet   scattering_type_registryt   hklt	   d_star_sq(   t   selft   xray_structureR
   (    (    s[   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/examples/structure_factor_derivatives_4.pyt   __init__   s    	c         C   s·  d } d t  j t j |  j ƒ } x�|  j D]‚} | j ƒ  } | j j ƒ  st | j	 |  j
 } t  j t | ƒ } n  |  j j d | j ƒ } | j |  j
 ƒ } | | j }	 | j }
 |	 d |
 } xê |  j D]ß } | | j } t j | ƒ j | ƒ } | j j ƒ  r‚| j ƒ  j ƒ  j ƒ  } | t j d | j ƒ | j ƒ  } t j |  j ƒ | j t j |  j ƒ ƒ } t  j t | ƒ } n  t j d | ƒ } | | | | | 7} qÌ Wq- W| S(   Ni    i   t   scattering_typey              ð?t   sym_mat3(   t   matht   piR   t   colR
   R   t   weightt   flagst   use_u_anisot   u_isoR   t   expt   mtpsR	   t   gaussian_not_optionalR   t   at_d_star_sqt   fpt   fdpR   t   sitet   dott   rt   as_rationalt   as_floatt   symt   u_start	   transposet   rowt   cmath(   R   t   resultt   tphklt	   scatterert   wt   huht   dwt   gaussiant   f0t   ffpR   t   fft   st   s_sitet   alphaR    t
   s_u_star_st   e(    (    s[   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/examples/structure_factor_derivatives_4.pyt   f   s0    	#+c   $      c   s—  d t  j t j |  j ƒ } |  j \ } } } t j | d | d | d d | | d | | d | | g ƒ } xt |  j ƒ D]\ } } d  } |  j j	 | ƒ rç |  j j
 | ƒ } | j ƒ  }	 | j j ƒ  rç | j ƒ  }
 qç n  | j ƒ  } | j ƒ  } | j j ƒ  s4| j |  j } t  j t | ƒ } n  |  j j d | j ƒ } | j |  j ƒ } | | j } | j } | d | } t j d d d g ƒ } | j j ƒ  s¸d } d  } n' d  } t j d d d d d d g ƒ } d } d } d } xª|  j D]Ÿ} | j ƒ  j ƒ  j ƒ  } | | j } t j | ƒ j  | ƒ } | j j ƒ  r±| t j! d | j" ƒ | j# ƒ  } t j$ |  j ƒ | j  t j |  j ƒ ƒ } t  j t | ƒ } n  t% j d | ƒ } | j# ƒ  }  | |  | | | | d | 7} | j j ƒ  s%| | | | | t |  j 7} n7 t j& t' | ƒ ƒ }! | |! | | | | t | 7} | | | | | 7} | | | | 7} | | | | d 7} qûW| d  k	 r'|	 j( ƒ  }" t j) d |" d |" j* ƒ  ƒ }" |" | } | j j ƒ  r'|
 j( ƒ  }" t j) d |" d |" j* ƒ  ƒ }" |" | } q'n  t+ j, | ƒ }# | j j ƒ  sU|# j- | ƒ n |# j. t+ j, | ƒ ƒ |# j. t+ j, | | | g ƒ ƒ |# Vq„ Wd  S(	   Ni   R   y              ð?i    y                R   t   elemst   n(/   R   R   R   R   R
   t	   enumerateR   t   NoneR   t   is_special_positiont   gett   site_constraintsR   R   t   adp_constraintsR   t   weight_without_occupancyR   R   R   R   R	   R   R   R   R   R   R   R    R!   R"   R   R   R#   R$   R%   R&   R'   t   sqrR   t   gradient_sum_matrixt   rect   focusR   t   complex_doublet   appendt   extend($   R   R)   t   ht   kt   lt   d_exp_huh_d_u_start   i_scattererR*   t   site_symmetry_opsR>   R?   R+   t   wwoR,   R-   R.   R/   R0   R   R1   t   d_sitet   d_u_isot   d_u_start   d_occt   d_fpt   d_fdpR2   R    R3   R4   R5   R6   t	   site_gtmxt   u_star_gtmxt   gsmR(   (    (    s[   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/examples/structure_factor_derivatives_4.pyt   df_d_params/   s€    E		!#+$
c   8      c   sŽ
  d t  j t j |  j ƒ } | j | ƒ j ƒ  } |  j \ } } } t j | d | d | d d | | d | | d | | g ƒ } | j | ƒ j ƒ  } xé	t |  j ƒ D]Ø	\ } }	 d  }
 |  j
 j | ƒ r|  j
 j | ƒ }
 |
 j ƒ  } |	 j j ƒ  r|
 j ƒ  } qn  |	 j ƒ  } |	 j ƒ  } |	 j j ƒ  s^|	 j |  j } t  j t | ƒ } n  |  j j d |	 j ƒ } | j |  j ƒ } | |	 j } |	 j } | d | } t j d d d d ƒ } |	 j j ƒ  süt j t j d d ƒ d ƒ } d  } n$ d  } t j t j d d ƒ d ƒ } t j t j d d ƒ d ƒ } t j t j d d ƒ d ƒ } t j t j d d ƒ d ƒ } |	 j j ƒ  s¤d } d } d } d } nt t j d d d d ƒ }  t j t j d d ƒ d ƒ }! t j t j d d ƒ d ƒ }" t j t j d d ƒ d ƒ }# d }$ d }% xk|  j D]`}& |& j  ƒ  j! ƒ  j" ƒ  }' |& |	 j# }( | j$ t j |( ƒ ƒ }) |	 j j ƒ  rä|' t% j& d |	 j' ƒ |' j( ƒ  }* t% j) |  j ƒ |* j$ t% j* |  j ƒ ƒ } t  j t | ƒ } n  t+ j d |) ƒ }+ t j |' j( ƒ  ƒ }, |, j, t j d d ƒ ƒ | | | | |+ d	 |, j- | ƒ 7} |	 j j ƒ  s�| | | | |+ d t |  j |, j. | ƒ 7} nO t/ |' ƒ }- | | | | |+ d t |, j. | j | ƒ ƒ j. |- j0 ƒ  ƒ 7} |, j. | ƒ }. | | | | |+ d |. 7} | | | |+ d |. 7} | | | |+ d	 |. 7} |	 j j ƒ  sÖ| | | | |+ t |  j d 7} | | | | |+ t |  j 7} | | | |+ t |  j 7} | d | | |+ t |  j 7} n� |  | | | |+ t d |- j- | ƒ 7}  |- j. | ƒ }/ |! | | | |+ t |/ 7}! |" | | |+ t |/ 7}" |# | | d |+ t |/ 7}# |$ | | |+ 7}$ |% | | |+ d 7}% q.W|
 d  k r§d }0 n | j1 ƒ  }0 |	 j j ƒ  sÏ|0 d }1 n) |
 d  k rè|0 d }1 n |0 | j1 ƒ  }1 |1 d |1 d |1 d }2 }3 }4 |
 d  k	 r| j2 ƒ  }5 |5 j- d
 | ƒ } |	 j j ƒ  sc|5 j. | ƒ } n |5 j. | ƒ } |5 j. | ƒ } |5 j. | ƒ } |5 j. | ƒ } |	 j j ƒ  r| j2 ƒ  }5 | j. |5 j0 ƒ  ƒ } |5 j- d
 |  ƒ }  |5 j. |! ƒ }! |5 j. |" ƒ }" |5 j. |# ƒ }# qn  t j t j |4 |4 ƒ d ƒ }6 |6 j3 }7 |7 | j4 ƒ  d d ƒ |	 j j ƒ  s‰|7 | d |0 ƒ |7 | j0 ƒ  |0 d ƒ n& |7 | d |0 ƒ |7 | j0 ƒ  |0 d ƒ |7 | d |1 ƒ |7 | j0 ƒ  |1 d ƒ |7 | d |2 ƒ |7 | j0 ƒ  |2 d ƒ |7 | d |3 ƒ |7 | j0 ƒ  |3 d ƒ |	 j j ƒ  s±	| |6 |0 |4 |0 <| |6 |0 |4 |1 <| |6 |1 |4 |0 <| |6 |0 |4 |2 <| |6 |2 |4 |0 <| |6 |0 |4 |3 <| |6 |3 |4 |0 <nˆ |7 |  j4 ƒ  |0 |0 ƒ |7 |! |0 |1 ƒ |7 |! j0 ƒ  |1 |0 ƒ |7 |" |0 |2 ƒ |7 |" j0 ƒ  |2 |0 ƒ |7 |# |0 |3 ƒ |7 |# j0 ƒ  |3 |0 ƒ |$ |6 |1 |4 |2 <|$ |6 |2 |4 |1 <|% |6 |1 |4 |3 <|% |6 |3 |4 |1 <|6 Vq® Wd  S(   Ni   R   y              ð?i   i   y                i   R   iÿÿÿÿt   packed_ui    i   i   (5   R   R   R   t   doubleR
   t   matrix_outer_productt   matrix_symmetric_as_packed_uR:   R   R;   R   R<   R=   R>   R   R   R?   R   R@   R   R   R   R   R	   R   R   R   R   R   RE   t   gridR   R    R!   R"   R   R   R   R#   R$   R%   R&   R   R'   t   reshapet/   matrix_multiply_packed_u_multiply_lhs_transposet   matrix_multiplyR   t   matrix_transposet   n_independent_paramsRB   t   matrix_paste_block_in_placet   matrix_packed_u_as_symmetric(8   R   R)   t   tphkl_outerRH   RI   RJ   RK   t   d2_exp_huh_d_u_star_u_starRL   R*   RM   R>   R?   R+   RN   R,   R-   R.   R/   R0   R   R1   t   d2_site_sitet   d2_site_u_isot   d2_site_u_start   d2_site_occt
   d2_site_fpt   d2_site_fdpt   d2_u_iso_u_isot   d2_u_iso_occt   d2_u_iso_fpt   d2_u_iso_fdpt   d2_u_star_u_start   d2_u_star_occt   d2_u_star_fpt   d2_u_star_fdpt	   d2_occ_fpt
   d2_occ_fdpR2   R    R3   R4   R5   R6   RU   RV   t   site_gtmx_tphklt   u_star_gtmx_d_exp_huh_d_u_start   i_ut   i_occt   i_fpt   i_fdpt   npRW   t   dpt   paste(    (    s[   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/examples/structure_factor_derivatives_4.pyt   d2f_d_paramst   s,   E			#+!%!$		 					c   %      #   sÏ  d t  j t j |  j ƒ } | j | ƒ j ƒ  } |  j \ } } } t j | d | d | d d | | d | | d | | g ƒ } | j | ƒ j ƒ  } x*t |  j ƒ D]\ } }	 d  }
 |  j
 j | ƒ r|  j
 j | ƒ }
 |
 j ƒ  } |	 j j ƒ  r|
 j ƒ  } qn  |	 j ƒ  } |	 j j ƒ  sR|	 j |  j } t  j t | ƒ } n  |  j j d |	 j ƒ } | j |  j ƒ } | |	 j } |	 j } | d | } t j d d d d ƒ } |	 j j ƒ  sÒd } n t j d d d d ƒ } x—|  j D]Œ} | j ƒ  j ƒ  j  ƒ  } | |	 j! } | j" t j | ƒ ƒ } |	 j j ƒ  r¬| t# j$ d |	 j% ƒ | j& ƒ  } t# j' |  j ƒ | j" t# j( |  j ƒ ƒ } t  j t | ƒ } n  t) j d | ƒ } t j | j& ƒ  ƒ } | j* t j+ d d ƒ ƒ | | | | | d	 | j, | ƒ 7} |	 j j ƒ  sK| | | | | t |  j d 7} qöt- | ƒ } | | | | | t d | j, | ƒ 7} qöW|
 d  k r›d }  n | j. ƒ  }  |	 j j ƒ  sÃ|  d }! n) |
 d  k rÜ|  d }! n |  | j. ƒ  }! |! d }" |
 d  k	 rS| j/ ƒ  }# |# j, d
 | ƒ } |	 j j ƒ  rS| j/ ƒ  }# |# j, d
 | ƒ } qSn  t j t j+ |" d ƒ d ƒ ‰  ‡  f d †  }$ |$ | j0 ƒ  d ƒ |	 j j ƒ  s¯| ˆ  |  <n |$ | j0 ƒ  |  ƒ ˆ  Vq® Wd  S(   Ni   R   y              ð?i   i   y                i   R   iÿÿÿÿRY   c            s6   |  j  t j |  j ƒ  d ƒ ƒ ˆ  j |  | d ƒ d  S(   Ni   i    (   R^   R   R]   t   sizeRc   (   t   dt   i(   t   dpd(    s[   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/examples/structure_factor_derivatives_4.pyR   `  s    i    i   i   (1   R   R   R   RZ   R
   R[   R\   R:   R   R;   R   R<   R=   R>   R   R   R?   R   R   R   R   R   R	   R   R   R   R   R   RE   R   R    R!   R"   R   R   R   R#   R$   R%   R&   R   R'   R^   R]   R_   R   Rb   RB   t   matrix_packed_u_diagonal(%   R   R)   Re   RH   RI   RJ   RK   Rf   RL   R*   RM   R>   R?   R+   R,   R-   R.   R/   R0   R   R1   Rg   Rm   Rq   R2   R    R3   R4   R5   R6   RU   RV   Ry   Rz   R}   RW   R   (    (   R„   s[   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/examples/structure_factor_derivatives_4.pyt   d2f_d_params_diag  sŽ    E		#+(	
			c         C   s{   t  j ƒ  } | j ƒ  | j ƒ  } } xO |  j ƒ  D]A } | j t  j g  | D] } | | j | | j ^ qK ƒ ƒ q2 W| S(   N(   R   RZ   t   dat   dbRX   RG   t   realt   imag(   R   t   targetR(   R‡   Rˆ   t   d_scattererR‚   (    (    s[   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/examples/structure_factor_derivatives_4.pyt   d_target_d_paramsj  s    0c      	   C   sl  g  } | j  ƒ  | j ƒ  } } | j ƒ  | j ƒ  | j ƒ  } } } t |  j ƒ  ƒ } |  j ƒ  }	 xù t | |	 ƒ D]è \ }
 } t	 | ƒ } xÍ |
 D]Å } g  } x© | D]¡ } x˜ | D]� } | | j
 | j
 | | j | j | | j
 | j | j | j
 } |
 | k r5| j ƒ  } | | | j
 | | j 7} n  | j | ƒ q² Wq¥ W| j | ƒ q’ Wqs Wt j | ƒ S(   N(   R‡   Rˆ   t   daat   dbbt   dabt   listRX   R€   t   zipt   iterR‰   RŠ   t   nextRF   R   RZ   (   R   R‹   R(   R‡   Rˆ   RŽ   R�   R�   t   dst   d2st   di0t   d2it	   d2ij_itert   diR&   t   dj0t   djt   sumt   d2ij(    (    s[   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/examples/structure_factor_derivatives_4.pyt   d2_target_d_paramsr  s$    &Fc         C   s  t  j ƒ  } | j ƒ  | j ƒ  } } | j ƒ  | j ƒ  | j ƒ  } } } |  j ƒ  } |  j ƒ  }	 x¨ t	 t
 | |	 ƒ ƒ D]‘ \ }
 \ } } x| t
 | | ƒ D]k \ } } | | j | j | | j | j | d | j | j | | j | | j } | j | ƒ q› Wqy W| S(   Ni   (   R   RZ   R‡   Rˆ   RŽ   R�   R�   RX   R†   R:   R’   R‰   RŠ   RF   (   R   R‹   R(   R‡   Rˆ   RŽ   R�   R�   R•   t   d2sdRL   R—   t   d2idRš   Rž   R�   (    (    s[   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/examples/structure_factor_derivatives_4.pyt   d2_target_d_params_diagˆ  s    &(R(
   t   __name__t
   __module__R   R7   RX   R€   R†   R�   RŸ   R¢   (    (    (    s[   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/examples/structure_factor_derivatives_4.pyR   
   s   				E	£	S		t   structure_factorsc           B   sG   e  Z d  „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z RS(   c         C   s1   | j  | ƒ s t ‚ | |  _ | j ƒ  |  _ d  S(   N(   t   is_similar_symmetryt   AssertionErrorR   t   indicest   miller_indices(   R   R   t
   miller_set(    (    s[   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/examples/structure_factor_derivatives_4.pyR   ™  s    	c         C   sI   t  j ƒ  } x6 |  j D]+ } | j t d |  j d | ƒ j ƒ  ƒ q W| S(   NR   R
   (   R   RE   R©   RF   R   R   R7   (   R   R(   R
   (    (    s[   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/examples/structure_factor_derivatives_4.pyt   fsž  s
    c         C   s   t  j |  j ƒ  ƒ S(   N(   R   R�   R«   (   R   (    (    s[   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/examples/structure_factor_derivatives_4.pyR7   ¥  s    c   	      C   s—   d  } xŠ t |  j | j ƒ  ƒ D]p \ } } t d |  j d | ƒ } | d | d | j ƒ  ƒ } | j d | ƒ } | d  k r… | } q | | 7} q W| S(   NR   R
   t   obst   calcR‹   (   R;   R’   R©   t   dataR   R   R7   R�   (	   R   t   f_obst   target_typeR(   R
   R¬   t   sfR‹   t   contribution(    (    s[   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/examples/structure_factor_derivatives_4.pyR�   ¨  s    % 	c   	      C   s—   d  } xŠ t |  j | j ƒ  ƒ D]p \ } } t d |  j d | ƒ } | d | d | j ƒ  ƒ } | j d | ƒ } | d  k r… | } q | | 7} q W| S(   NR   R
   R¬   R­   R‹   (   R;   R’   R©   R®   R   R   R7   RŸ   (	   R   R¯   R°   R(   R
   R¬   R±   R‹   R²   (    (    s[   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/examples/structure_factor_derivatives_4.pyRŸ   ²  s    % 	c   	      C   s—   d  } xŠ t |  j | j ƒ  ƒ D]p \ } } t d |  j d | ƒ } | d | d | j ƒ  ƒ } | j d | ƒ } | d  k r… | } q | | 7} q W| S(   NR   R
   R¬   R­   R‹   (   R;   R’   R©   R®   R   R   R7   R¢   (	   R   R¯   R°   R(   R
   R¬   R±   R‹   R²   (    (    s[   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/examples/structure_factor_derivatives_4.pyR¢   ¼  s    % 	c   	      C   sã   t  j ƒ  } t  j ƒ  } x£ t |  j | j ƒ  ƒ D]‰ \ } } t d |  j d | ƒ } | d | d | j ƒ  ƒ } | j	 t
 | j ƒ  | j ƒ  ƒ ƒ | j	 | j ƒ  | j ƒ  | j ƒ  f ƒ q1 W|  j j d | j ƒ  d | d | ƒ S(   NR   R
   R¬   R­   R©   t   da_dbt   daa_dbb_dab(   R   RE   t   vec3_doubleR’   R©   R®   R   R   R7   RF   t   complexR‡   Rˆ   RŽ   R�   R�   t   grads_and_curvs_target_simpleR¨   (	   R   R¯   R°   R³   R´   R
   R¬   R±   R‹   (    (    s[   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/examples/structure_factor_derivatives_4.pyt   d2_target_d_params_diag_cppÆ  s    %",(	   R£   R¤   R   R«   R7   R�   RŸ   R¢   R¸   (    (    (    s[   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/examples/structure_factor_derivatives_4.pyR¥   —  s   				
	
	
(   t
   __future__R    t   scitbx.mathR   t   scitbxR   t   scitbx.array_familyR   R'   R   R   R   R   R¥   (    (    (    s[   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/examples/structure_factor_derivatives_4.pyt   <module>   s   ÿ Ž