ó
I™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 m Z d  d l m	 Z	 d  d l
 m Z d  d l m Z m Z d  d	 l m Z d  d
 l Z d  d
 l Z d „  Z d „  Z d „  Z d e j f d „  ƒ  YZ d „  Z d „  Z e d k r
e ƒ  n  d
 S(   iÿÿÿÿ(   t   division(   t   euclidean_model_matching(   t   crystal(   t   sgtbx(   t   random_structure(   t   debug_utils(   t   matrix(   t   approx_equalt	   show_diff(   t   StringIONc         C   sœ   | d } x‹ | D]ƒ } |  | d j  } | | | d j  } t j |  j | j ƒ ƒ }	 t j |	 | ƒ }
 |
 j ƒ  | k  s t t |  j	 ƒ  ƒ ƒ ‚ q Wd  S(   Ni   g�íµ ÷Æ°>i    gzo ð?(
   t   siteR   t   sym_equiv_sitest   site_symmetryt   elemst   min_sym_equiv_distance_infot   distt   AssertionErrort   strt   space_group_info(   t   model1t   model2t	   tolerancet   match_rtt   pairst   adj_tolerancet   pairt   c1t   c2t   equiv_c2t	   dist_info(    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/regression/tst_emma.pyt   verify_match   s    
c         C   s/   x( | D]  } |  | j  j d ƒ r t Sq Wt S(   Nt   S(   t   labelt
   startswitht   Falset   True(   t   modelt   singlest   i(    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/regression/tst_emma.pyt   analyze_singles   s     c         C   sã   d } xœ | D]” } d s | r, | j  ƒ  n  t | j | j | j | j | j ƒ t |  | | j | j | j ƒ t |  | j	 ƒ r t | | j
 ƒ r | d 7} q q Wd s± | rÍ d Gt | ƒ GHd G| GHHn  | d k sß t ‚ d  S(   Ni    i   s   total matches:s
   solutions:(   t   showR   t
   ref_model1t
   ref_model2R   t   ref_eucl_rtR   t   rtR'   t   singles1t   singles2t   lenR   (   R   R   t   refined_matchest   verboset   solution_countert   match(    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/regression/tst_emma.pyt   analyze_refined_matches   s     	t
   test_modelc           B   sh   e  Z d  d d „ Z d „  Z d „  Z d „  Z d d „ Z d d	 d
 d „ Z d d
 d „ Z d „  Z	 RS(   t   SBTi   c         C   s2  | d  k r d  S| |  _ t j } t | ƒ t d ƒ k r´ | d k r¤ t j j |  t j t j	 d d ƒ ƒ | d d ƒ | d
 d ƒ | d d  ƒ | d d! ƒ f ƒ q.t
 d | ‚ nz t j | d d g | d d d d ƒ} g  } x3 | j ƒ  D]% } | j t j | j | j ƒ ƒ qï Wt j j |  | | ƒ d  S("   Nt    R6   gƒ/L¦
æ0@g—ÿ�~û’N@s	   R -3 m :Rt   SI1gÇº¸�ðÖ¿g¤ß¾œ3Ò?gM„O¯”Ý?t   SI2gvOjMË¿gÔšæ§èî?gîëÀ9#Jå¿t   SI3gÉå?¤ß¾ê¿gffffffæ?g…|Ð³YõÕ?t   SI4gôlV}®¶Þ?gÇK7‰A`ý?g[Ó¼ãå?s   Unknown model_id: t   elementsR   t   volume_per_atomg      I@t   min_distanceg       @(   gƒ/L¦
æ0@gƒ/L¦
æ0@gƒ/L¦
æ0@g—ÿ�~û’N@g—ÿ�~û’N@g—ÿ�~û’N@(   gÇº¸�ðÖ¿g¤ß¾œ3Ò?gM„O¯”Ý?(   gvOjMË¿gÔšæ§èî?gîëÀ9#Jå¿(   gÉå?¤ß¾ê¿gffffffæ?g…|Ð³YõÕ?(   gôlV}®¶Þ?gÇK7‰A`ý?g[Ó¼ãå?(   t   Nonet   model_idt   emmat   positiont   typeR$   t   __init__R   t   special_position_settingst   symmetryt   RuntimeErrorR   t   xray_structuret
   scattererst   appendR    R
   (   t   selfR@   t
   n_elementst   post	   structuret	   positionst	   scatterer(    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/regression/tst_emma.pyRD   /   s0     				#c         C   s&   t  d  ƒ } t j j | |  | ƒ | S(   N(   R5   R?   RA   R$   RD   (   RK   t   new_positionst   new_test_model(    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/regression/tst_emma.pyt   create_new_test_modelJ   s    c         C   s,   t  |  j ƒ  ƒ } t j | ƒ |  j | ƒ S(   N(   t   listRO   t   randomt   shuffleRS   (   RK   t   shuffled_positions(    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/regression/tst_emma.pyt   shuffle_positionsO   s    c         C   s†   g  } xp |  j  ƒ  D]b } t j |  j | j ƒ ƒ } t j | j ƒ  j ƒ  ƒ } | j	 t
 j | j | j ƒ  | ƒ ƒ q W|  j | ƒ S(   N(   RO   R   R   R   R
   RU   t	   randranget   coordinatest   sizeRJ   RA   RB   R    RS   (   RK   RQ   RM   t   equivR&   (    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/regression/tst_emma.pyt   random_symmetry_matesT   s    *i    c   
      C   só   t  j |  j ƒ  d t d | ƒ} t j | j j ƒ  ƒ } | j | ƒ } g  t d ƒ D] } d t j ƒ  ^ qV } t	 j
 | j | d d ƒƒ } g  } xM |  j ƒ  D]? } t	 j
 | | j ƒ | }	 | j t  j | j |	 j ƒ ƒ q£ W|  j | ƒ S(   Nt   use_k2lt   use_l2ni   g      à?t   selectori   (   RA   t   euclidean_match_symmetryR   R#   RU   RY   t   rt_mxt   order_zt   xrangeR   t   colt   filter_shiftRO   R
   RJ   RB   R    R   RS   (
   RK   t'   models_are_diffraction_index_equivalentt   match_symmetryR&   t
   eucl_symopt   shiftt   allowed_shiftRQ   RM   t   new_site(    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/regression/tst_emma.pyt   apply_random_eucl_op\   s    )#i   t   Rg      ð?c   
      C   s¸   g  } x$ |  j  ƒ  D] } | j | j ƒ q Wt j d |  d | d | d | d t ƒ } g  } d } x; | D]3 }	 | d 7} | j t j d | | f |	 ƒ ƒ qj W|  j |  j  ƒ  | ƒ S(	   NRE   t   existing_sitest   n_newt   min_hetero_distancet   general_positions_onlyi    i   s   %s%d(	   RO   RJ   R
   R   t   random_sitesR"   RA   RB   RS   (
   RK   t   number_of_new_positionsR    R>   Ro   RM   t	   new_sitesRQ   R&   R
   (    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/regression/tst_emma.pyt   add_random_positionsj   s    		
'gš™™™™™É?c         C   sq   g  } x[ |  j  ƒ  D]M } t j d |  d | j d | d | d ƒ } | j t j | j | ƒ ƒ q W|  j | ƒ S(   NRE   R
   t   gauss_sigmat   max_distanceg®Gáz®ï?(	   RO   R   t   random_modify_siteR
   RJ   RA   RB   R    RS   (   RK   Rw   R>   RQ   RM   t   new_coor(    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/regression/tst_emma.pyt   shake_positions|   s    		 c         C   sL   t  j  ƒ  d k  r! t j ƒ  } n |  j ƒ  j ƒ  j ƒ  } |  j | ƒ j ƒ  S(   Ng      à?(   RU   R   t   change_of_basis_opR   RC   t   change_of_hand_opt   change_basist   reset_cb_op(   RK   t   cb_op(    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/regression/tst_emma.pyt   random_hand‡   s    (
   t   __name__t
   __module__RD   RS   RX   R]   Rm   Rv   R{   R�   (    (    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/regression/tst_emma.pyR5   -   s   			c         C   sÕ  |  j  } |  j r9t ƒ  j d d ƒ j ƒ  j ƒ  j ƒ  } t ƒ  j d d ƒ j ƒ  j ƒ  j ƒ  j ƒ  j ƒ  } xÆ d D]¾ } | } | rš | j	 ƒ  j
 ƒ  } n  x” d D]Œ } | } | rÈ | j	 ƒ  j
 ƒ  } n  d sÔ | rÿ | j d | f ƒ | j d | f ƒ n  t j | | d	 d ƒ}	 t | | |	 j | ƒ q¡ Wqs Wt St | ƒ }
 |
 j d d ƒ } |
 j d d ƒ j ƒ  j ƒ  j ƒ  j ƒ  j ƒ  } d s“| r½|
 j d
 ƒ | j d ƒ | j d ƒ n  t j | | d	 d ƒ}	 t | | |	 j | ƒ |	 j ƒ  j ƒ  | j ƒ  d k st ‚ |	 j d d ƒ j ƒ  | j ƒ  d k sAt ‚ | j ƒ  | j ƒ  xyd d | | f d d | | f g D]S\ } } } } |	 j d | ƒ } | j ƒ  j | j ƒ  ƒ s¿t ‚ | j ƒ  | j ƒ  k sÝt ‚ xÔ |	 j d j D]Â } | j ƒ  | | d j } | j ƒ  | | d j } t j | j | ƒ ƒ } t j  | | ƒ } | j! ƒ  |	 j" d k  sst ‚ | j# ƒ  | } t$ | j ƒ  j% | | ƒ | j! ƒ  ƒ sît ‚ qîW| d k rÓ|	 j d j& } n |	 j d j' } xç | D]ß } | j ƒ  | j } xÃ t( t) | j ƒ  ƒ ƒ D]© } | j ƒ  | j } t j | j | ƒ ƒ } t j  | | ƒ } | j! ƒ  |	 j" d k  rt } x5 |	 j d j D]# } | | d | k r�t* } q�q�W| sÅt ‚ qqWqêWqzWd  S(   Ni   t   Ai   t   Bi    i   s
   Model1(%d)s
   Model2(%d)t   rms_penalty_per_sitet   Coret   Model1t   Model2t   i_modelg�íµ ÷Æ°>(   i    i   (   i    i   (+   t   Verboset   StaticModelsR5   Rv   RX   R]   Rm   R{   R�   t   transform_to_reference_settingR   R(   RA   t   model_matchesR4   R0   R"   t   consensus_modelR[   R   t   expand_to_p1t   as_xray_structuret   transform_modelt	   unit_cellt   is_similar_tot   space_groupR   RO   R
   R   R   R   R   R   R   t   sym_opR   t   distanceR.   R-   Rd   R/   R#   (   t   flagsR   R1   R   R   R&   t   m1t   jt   m2RŽ   t
   model_coret   i1t   i2t   m2_tR   t   site1t   site2t   equiv_sites1R   t   site2_closestR%   t   i_site2t   i_site1t   ok(    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/regression/tst_emma.pyt   run_call_backŽ   s‚    				*  *(.

7!c          C   sƒ   t  j d t j d d ƒ d t d t ƒ }  t ƒ  } |  j d d d | ƒ t | j	 ƒ  d	 ƒ se t
 ‚ t j t j d
 t d ƒ d  S(   NR   t   symbolt   P1R^   R_   t   titlet   testt   fsF   euclidean_match_symmetry: test
P -1
((1, 0, 0), (0, 1, 0), (0, 0, 1))
i   RŒ   (   s   StaticModels(   RA   Ra   R   R   R#   R"   R	   R(   R   t   getvalueR   R   t   parse_options_loop_space_groupst   syst   argvR§   (   Rh   t   out(    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/regression/tst_emma.pyt   runá   s    			t   __main__(   t
   __future__R    t   cctbxR   RA   R   R   t   cctbx.developmentR   R   t   scitbxR   t   libtbx.test_utilsR   R   t	   cStringIOR	   RU   R¯   R   R'   R4   R$   R5   R§   R²   R‚   (    (    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/regression/tst_emma.pyt   <module>   s$   				a	S	