ó
²™xTc           @   s¹  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  d l	 m
 Z
 d  d l j j Z d  d l Z d  d l Z d  d l m Z d  d l Z d  d l m Z d  d l Z d  d	 l m Z e j d
 ƒ e j d
 ƒ d „  Z d „  Z d d „ Z d g d. d/ d0 d1 d2 d3 d4 d5 d6 d7 g
 d8 d9 g d d  „ Z  d! d" d# „ Z! d! d$ „ Z" d! d% „ Z# d! d& „ Z$ d! d' „ Z% d( d) e& d* d+ „ Z' d, „  Z( e) d- k rµe( ƒ  n  d S(:   iÿÿÿÿ(   t   division(   t   pdb(   t   flexN(   t   approx_equal(   t   format_cpu_times(   t   sgtbx(   t   random_structure(   t   adptbxi    c          C   s=   t  j j d d d t j j ƒ }  t j d |  ƒ j ƒ  } | S(   Nt   relative_paths"   phenix_regression/pdb/2ERL_noH.pdbt   testt	   file_name(	   t   libtbxt   envt   find_in_repositoriest   ost   patht   isfileR   t   inputt   xray_structure_simple(   t   pdb_filet   xray_structure(    (    s]   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/bulk_solvent/tst_bulk_solvent_and_scaling.pyt   get_xray_structure_from_file   s    c      	   C   s/   t  j d |  d d g d d d d t ƒ } | S(   Nt   space_group_infot   elementst   Nid   t   volume_per_atomg      I@t   random_u_iso(   R   R   t   True(   R   R   (    (    s]   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/bulk_solvent/tst_bulk_solvent_and_scaling.pyt   get_xray_structure_random   s    		c      	   C   s  t  | j d |  d t ƒ j ƒ  ƒ } | j d d d d ƒ } t j j j ƒ  } | d  k	 rf | | _
 n  t | ƒ t k rŠ t | ƒ | _ n  t j j d | d | d	 | d
 | ƒ }	 |	 j d
 | d t d t ƒ |	 j ƒ  }
 |
 j d | d | d | ƒ t  |
 j ƒ } | | f S(   Nt   d_mint   anomalous_flagt   fractiongš™™™™™¹?t   max_freeiÿàõt   mask_paramst   r_free_flagst   f_obsR   t   update_f_calct   update_f_maskt   k_solst   b_solt   b_cart(   t   abst   structure_factorst   Falset   f_calct   generate_r_free_flagst   mmtbxt   maskst   mask_master_paramst   extractt   Nonet   radial_shell_widtht   typet   listt   lent   n_radial_shellst   f_modelt   managert   update_xray_structureR   t
   fmodel_kbut   update(   R   t   k_solR'   R(   R   R3   t   f_dummyR"   R!   t   fmodelR;   R#   (    (    s]   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/bulk_solvent/tst_bulk_solvent_and_scaling.pyt   get_f_obs_freer"   s2    				gš™™™™™ù?gš™™™™™¹?g      T@g333333ã?g      $@g      @g¸…ëQ¸¾?g     @V@g=
×£p=â?g      1@gìQ¸…ëÁ?g      ,@gHáz®Gá?g     ÀU@g      @g      ,Àg      @g        c         C   s  t  ƒ  } xt t g D]õ} xì|  D]ä} xÛ| D]Ó} xÊ| D]Â} t d | d | d d | d d | d | ƒ \ }	 }
 g  } |	 j d d	 ƒ x< |	 j ƒ  j ƒ  D]( } |	 j ƒ  j | ƒ } | j | ƒ q¡ Wt	 j
 j d
 |
 d |	 d | d | ƒ } | j d | d | ƒ t j d | j ƒ  d | ƒ } | sUt | j ƒ  | j j ƒ  ƒ smt ‚ n | j ƒ  d k  smt ‚ t | j j ƒ  d d d ƒs‘t ‚ t | j d ƒ | d d d ƒs¹t ‚ t | j ƒ  | d d d ƒsÞt ‚ t | j ƒ  | d d ƒs= t ‚ q= Wq0 Wq# Wq Wd  S(   NR   R=   i    R'   i   R(   R   t   reflections_per_bini2   R"   R#   t   bin_selectionst   nproct   fastR;   g{®Gázt?g        t   epsg�íµ ÷Æ°>(   R   R   R+   R@   t   setup_binnert   binnert
   range_usedt	   selectiont   appendR.   R8   R9   t   update_solvent_and_scalet   bsst   bulk_solvent_and_scalesR;   R   t   r_workt   fmodelst   r_factort   AssertionErrorR=   R'   R(   (   t   d_minst   solvkbt   b_cartsRC   R   RD   R   t   kbR(   R#   R"   RB   t   i_bint   selR?   t   result(    (    s]   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/bulk_solvent/tst_bulk_solvent_and_scaling.pyt   exercise_01_general>   s<    	

		'$(%g       @g�íµ ÷Æ°>c         C   sã  xÜt  j j t  j j D]Ä} t  j d | ƒ } t | ƒ } | j ƒ  } | j ƒ  } t j	 d d d d ƒ } t j
 | | ƒ } t j | | ƒ }	 t j | | j d | ƒ ƒ }
 x+|	 |
 f D]} t d |  d d d	 d d
 | d | ƒ \ } } t j j d | d | d | ƒ } xÆt t f D]¸} t j j ƒ  } t | _ t | _ t | _ t | _ t | _ | | _ d | _ d | _ t j d | j ƒ  d | ƒ } | t k rØt  | |	 d d  ƒrØt  | j" ƒ  | | ƒ sØt# ‚ n  | t k rt  | |
 d d  ƒrt  | j" ƒ  | | ƒ st# ‚ n  | t k r\t  | |
 d d  ƒr\t  | j" ƒ  | | ƒ s\t# ‚ n  | t k rt  | |	 d d  ƒrxS t$ |
 | j" ƒ  ƒ D]9 \ } } t% | ƒ d k  r“t  | d | ƒ sÌt# ‚ q“q“WqqWqº Wq Wd  S(   Nt   symbolt   u_scalei   t   u_mint   u_starR   R=   i    R'   R(   R   R"   R#   i2   R;   t   paramst   outg�íµ ÷Æ°>g        (&   R   t   bravais_typest   acentrict   centricR   R   t   space_groupt	   unit_cellR   t   random_u_cartt   u_cart_as_u_start   u_star_as_u_cartt   average_u_starR@   R.   R8   R9   R   R+   RL   t   master_paramsR1   t   bulk_solventt   anisotropic_scalingt   k_sol_b_sol_grid_searcht   minimization_k_sol_b_solt   minimization_b_cartt   symmetry_constraints_on_b_cartt   max_iterationst   min_iterationsRM   R;   R   R2   R(   RQ   t   zipR)   (   R   t	   toleranceRZ   R   R   t   sgt   uct	   u_cart_p1t	   u_star_p1t   b_cart_1t   b_cart_2R(   R#   R"   R?   t   flagR^   RX   t   u2t   ufm(    (    s]   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/bulk_solvent/tst_bulk_solvent_and_scaling.pyt   exercise_02_b_cart_sym_constrg   sR    										!!!!!!!" c         C   sà  t  ƒ  } d } d } d d d d d d g } t d |  d	 | d
 | d | d | ƒ \ } } t j j d | d | d | ƒ } | j ƒ  d } t j j ƒ  }	 t	 |	 _
 t	 |	 _ | j d |	 d t	 ƒ t j d | j ƒ  d |	 ƒ }
 | j ƒ  d } |
 j j d | j ƒ  j ƒ  ƒ j ƒ  d } | d k s.t ‚ t | | d d ƒsIt ‚ t | | d d ƒsdt ‚ t |
 j d ƒ d d d ƒsˆt ‚ t |
 j ƒ  d d d ƒs©t ‚ t |
 j ƒ  d d d d d d g d d ƒsÜt ‚ d  S(   Ng\�Âõ(\ï?g     À_@i   i   i   i    i   R   R=   R'   R(   R   R"   R#   g      Y@R^   RD   R;   RI   g        RE   g�íµ ÷Æ°>(   R   R@   R.   R8   R9   RN   RL   Ri   R1   R+   Rj   Rk   RK   RM   R;   RO   t   selectR"   t   dataRP   RQ   R   R=   R'   R(   (   R   R   R=   R'   R(   R#   R"   R?   t   r_work_startR^   RX   t   r_work1t   r_work2(    (    s]   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/bulk_solvent/tst_bulk_solvent_and_scaling.pyt   exercise_03_do_nothing’   s<    					 $!c         C   s
  t  ƒ  } d } d } d d d d d d g } t d |  d	 | d
 | d | d | ƒ \ } } t j j d | d | d | ƒ } | j ƒ  d } t j j ƒ  }	 t	 |	 _
 t	 |	 _ t	 |	 _ | |	 _ | |	 _ | d |	 j _ | d |	 j _ | d |	 j _ | d |	 j _ | d |	 j _ | d |	 j _ | j d |	 d t	 ƒ }
 | j ƒ  d } | d k sat ‚ t | d d d ƒs|t ‚ t | j ƒ  |
 j j ƒ  ƒ s t ‚ t |
 j d ƒ | d d ƒsÄt ‚ t |
 j ƒ  | d d ƒsåt ‚ t |
 j ƒ  | d d ƒst ‚ d  S(   Ng\�Âõ(\ï?g     À_@i   i   i   i    i   R   R=   R'   R(   R   R"   R#   g      Y@i   R^   RD   g        RE   g�íµ ÷Æ°>(   R   R@   R.   R8   R9   RN   RL   Ri   R1   R+   Rl   Rm   Rn   t	   fix_k_solt	   fix_b_solt
   fix_b_cartt   b11t   b22t   b33t   b12t   b13t   b23RK   RQ   R   RO   RP   R=   R'   R(   (   R   R   R=   R'   R(   R#   R"   R?   R€   R^   RX   RN   (    (    s]   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/bulk_solvent/tst_bulk_solvent_and_scaling.pyt"   exercise_04_fix_k_sol_b_sol_b_cart²   sF    							$$!c         C   së  t  ƒ  } d } d } d d d d d d g } t d |  d	 | d
 | d | d | ƒ \ } } t j j d | d | d | ƒ } t j j ƒ  } t | _	 t
 j | j ƒ  j ƒ  t
 j | ƒ ƒ }	 t j j d | j ƒ  d | j ƒ  d | j j j d | j j j d | j j j d | j d |	 ƒ }
 |
 j ƒ  } t j d |
 d | ƒ } | j j ƒ  d } | d k sft ‚ t | d d d ƒs�t ‚ t | j d ƒ | d d ƒs¥t ‚ t | j ƒ  | d d ƒsÆt ‚ t | j ƒ  | d d ƒsçt ‚ d  S(   Ng…ëQ¸Õ?g      A@i   i   i   i    i   R   R=   R'   R(   R   R"   R#   R,   t   f_maskst   f_part1t   f_part2t   ssR]   R;   R^   g      Y@gš™™™™™©?g        RE   g�íµ ÷Æ°>(   R   R@   R.   R8   R9   RL   Ri   R1   R+   Rk   R   Rf   R#   Rd   t   b_as_ut   manager_kbuR,   t   arrayst   coreRŽ   R�   R�   R‘   RP   RM   RO   RQ   R   R=   R'   R(   (   R   R   R=   R'   R(   R#   R"   R?   R^   R]   R;   R€   RX   RN   (    (    s]   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/bulk_solvent/tst_bulk_solvent_and_scaling.pyt   exercise_05_k_sol_b_sol_only×   sF    			!			$!c         C   sÑ  t  ƒ  } d } d } d d d d d d g } t d |  d	 | d
 | d | d | ƒ \ } } t j j d | d | d | ƒ } t j j d | j ƒ  d | j ƒ  d | j j	 j
 d | j j	 j d | j j	 j d | j d | g d
 | ƒ } | j ƒ  d }	 t j j ƒ  }
 t |
 _ t j d | d |
 ƒ } | j j ƒ  d } |	 d k sLt ‚ t | d d d ƒsgt ‚ t | j d ƒ | d d ƒs‹t ‚ t | j ƒ  | d d ƒs¬t ‚ t | j ƒ  | d d ƒsÍt ‚ d  S(   Ng…ëQ¸Õ?g      A@i   i   i   i    i   R   R=   R'   R(   R   R"   R#   R,   RŽ   R�   R�   R‘   R&   g      Y@R;   R^   g        RE   g�íµ ÷Æ°>(   R   R@   R.   R8   R9   R“   R#   R,   R”   R•   RŽ   R�   R�   R‘   RP   RL   Ri   R1   R+   Rj   RM   RO   RQ   R   R=   R'   R(   (   R   R   R=   R'   R(   R#   R"   R?   R;   R€   R^   RX   RN   (    (    s]   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/bulk_solvent/tst_bulk_solvent_and_scaling.pyt   exercise_06_b_cart_onlyü   sD    							$!g…ëQ¸Õ?i   g333333Ó?c         C   s€  t  ƒ  } d } d d d d d d g } t d | d |  d	 | d
 | d | d | ƒ \ } } t j j j ƒ  }	 | |	 _ t |  ƒ t k r™ t	 |  ƒ |	 _
 n	 d |	 _
 t j j d | d | d | d |	 ƒ }
 t j |
 j ƒ  j ƒ  t j | ƒ ƒ } |
 j ƒ  } | j d | ƒ | j ƒ  d } |
 j } d G| j GHd G| j GHt |  ƒ t k r�x= t t	 |  ƒ ƒ D]& } | j | d k rbd |  | <qbqbWn  t j j ƒ  } t | _ | | _ | j sÅd | _ n  d | _ t j  d | d | ƒ } | j! j ƒ  } d G| GHd G|
 j" j# GH| d k st$ ‚ t% | d d d ƒs:t$ ‚ t |  ƒ t k rt | j! j& j' ƒ  ƒ } x: t t	 | ƒ ƒ D]& } | j | d k rwd | | <qwqwWt	 |  ƒ t	 | ƒ k s¿t$ ‚ xx t t	 |  ƒ ƒ D]) } t% | | |  | d d ƒsÒt$ ‚ qÒWn8 x5 | j! j& j' ƒ  D]! } t% | |  d d ƒst$ ‚ qWt% | j( ƒ  | d d ƒs[t$ ‚ t% | j) ƒ  | d d ƒs|t$ ‚ d  S(   Ng      A@i   i   i   i    i   R   R=   R'   R(   R   R3   R"   R#   R!   R]   g      Y@s   Solvent content: s   Layer volume fractions: g        g333333ó?R;   R^   s   R-work: s   Solvent radius: RE   g-Cëâ6?g�íµ ÷Æ°>(*   R   R@   R.   R/   R0   R1   R3   R4   R5   R6   R7   R8   R9   R   Rf   R#   Rd   R’   R;   R<   RP   t   mask_managert   solvent_content_via_maskt   layer_volume_fractionst   rangeRL   Ri   R+   Rk   Rl   t   number_of_macro_cyclest	   k_sol_maxRM   RO   R!   t   solvent_radiusRQ   R   R?   R&   R'   R(   (   R=   R   t   grid_searcht   shell_widthR   R'   R(   R#   R"   R!   R?   R]   R;   R€   t   mskt   iR^   RX   RN   t   ksolst   ikt   ksol(    (    s]   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/bulk_solvent/tst_bulk_solvent_and_scaling.pyt   exercise_radial_shells   sr    				!							*!c           C   sž   t  ƒ  t ƒ  t ƒ  t ƒ  t ƒ  t ƒ  t ƒ  t d d d d g ƒ t d d d d g d t d d ƒ t d d d d d g d t d d ƒ d	 Gt ƒ  GHd  S(
   NR=   g…ëQ¸Õ?gš™™™™™¹?gÍÌÌÌÌÌì?RŸ   R    g      ð?g      Ð?s   OK: (	   RY   R}   Rƒ   R�   R–   R—   R¦   R   R   (    (    (    s]   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/bulk_solvent/tst_bulk_solvent_and_scaling.pyt   run_  s    "%t   __main__(   i    i    (   gš™™™™™¹?g      T@(   g333333ã?g      $@(   gš™™™™™¹?g      $@(   g333333ã?g      T@(   gš™™™™™¹?g      @(   g¸…ëQ¸¾?g     @V@(   g=
×£p=â?g      1@(   gìQ¸…ëÁ?g      ,@(   gHáz®Gá?g     ÀU@(   g      @g      $@g      ,Ài    g      @g        (   g        g        g        g        g        g        (*   t
   __future__R    t   iotbxR   t   cctbx.array_familyR   R   t   libtbx.test_utilsR   t   libtbx.utilsR   t+   mmtbx.bulk_solvent.bulk_solvent_and_scalingRj   t   bulk_solvent_and_scalingRL   t   randomt   mmtbx.f_modelR.   t   cctbxR   t   cctbx.sgtbx.bravais_typest   cctbx.developmentR   t   libtbx.load_envR   R   t   seedt   set_random_seedR   R   R2   R@   RY   R}   Rƒ   R�   R–   R—   R+   R¦   R§   t   __name__(    (    (    s]   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/bulk_solvent/tst_bulk_solvent_and_scaling.pyt   <module>   sB   			$+ %%$?	