ó
Ï™xTc           @   sk  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  d l 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
 m Z d  d l m Z d  d l Z d e f d „  ƒ  YZ d e f d „  ƒ  YZ e e e e d „ Z d „  Z d e f d „  ƒ  YZ  d d d d „ Z! d „  Z" d S(   iÿÿÿÿ(   t   division(   t   adopt_init_args(   t   flex(   t   rotate_point_around_axisN(   t   maptbx(   t   RotamerEval(   t   user_plus_sys_time(   t   miller(   t   format_value(   t   crystal(   t   model_statisticst   residue_monitorc        
   B   s5   e  Z d d d d d d d d d d  „	 Z d „  Z RS(   c         C   s   t  |  t ƒ  ƒ d  S(   N(   R   t   locals(   t   selft   residuet   id_strt   selection_allt   selection_sidechaint   selection_backbonet   selection_ct   selection_nt   map_cc_sidechaint   map_cc_backbonet
   map_cc_allt   rotamer_statust   clashes_with_resseqs(    (    sR   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/refinement/real_space/__init__.pyt   __init__   s    c         C   sk   |  j  d  k r d } n t |  j  ƒ } d |  j t d |  j ƒ t d |  j ƒ t d |  j ƒ |  j | f S(   Nt   nones   %7s %6s    %6s     %6s %9s %7ss   %6.3f(	   R   t   Nonet   strR   R   R   R   R   R   (   R   t   cw(    (    sR   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/refinement/real_space/__init__.pyt   format_info_string!   s     	N(   t   __name__t
   __module__R   R   R   (    (    (    sR   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/refinement/real_space/__init__.pyR      s   t   structure_monitorc           B   sn   e  Z d  d „ Z d „  Z d „  Z d d e d „ Z d d d „ Z d d d d	 „ Z	 e
 d
 „ Z d „  Z RS(   g      ð?c         C   sô   t  |  t ƒ  ƒ |  j j ƒ  |  _ | j ƒ  |  _ | j ƒ  |  _ t j j d |  j	 d |  j ƒ |  _
 |  j
 j d |  j j ƒ  ƒ t ƒ  |  _ d  |  _ d  |  _ d  |  _ d  |  _ d  |  _ d |  _ d |  _ d |  _ d  |  _ d  |  _ |  j ƒ  d  S(   Nt   pdb_hierarchyt   xray_structuret
   sites_carti    (   R   R   R$   t	   unit_cellt   deep_copy_scattererst   xray_structure_startt   mmtbxt   utilst   statesR#   t   states_collectort   addR%   R   t   rotamer_managerR   t   map_cc_whole_unit_cellt   map_cc_around_atomst   map_cc_per_atomt   rmsd_bt   rmsd_at   dist_from_startt   dist_from_previoust   number_of_rotamer_outlierst   residue_monitorst   clashing_residue_i_seqst
   initialize(   R   R#   R$   t   target_map_objectt   geometry_restraints_managert   clash_threshold(    (    sR   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/refinement/real_space/__init__.pyR   -   s(    											c         C   sˆ  g  |  _  d d d d d g } t j j } |  j j ƒ  } |  j d |  j ƒ } x6|  j j ƒ  D]%} x| j	 ƒ  D]} x| j
 ƒ  D]÷} | j ƒ  } t | ƒ d k r® q„ n  xÊ| j ƒ  D]¼}	 |	 j ƒ  }
 d | j |
 j |
 j j ƒ  f } | |
 j ƒ d	 k rt j ƒ  } t j ƒ  } t j ƒ  } t j ƒ  } t j ƒ  } x¦ |
 j ƒ  D]˜ } | j j ƒ  } | | k } | j | j ƒ | r—| j | j ƒ n | j | j ƒ | d k rÆ| j | j ƒ n  | d k rM| j | j ƒ qMqMW| j | ƒ } | j | ƒ } | j | ƒ } | j ƒ  d
 k r1d  } n |  j d | d | ƒ } | j ƒ  d
 k rdd  } n |  j d | d | ƒ } | j ƒ  d
 k r—d  } n |  j d | d | ƒ } |  j  j t d |
 d | d | d | d | d | d | d | d | d | d |  j j |
 ƒ ƒ ƒ q» |
 j ƒ  j ƒ  } | j | ƒ } |  j d | d | ƒ } |  j  j t d |
 d | d | d | ƒ ƒ q» Wq„ Wqq Wq^ W|  j d | ƒ |  _  |  j d | d | ƒ |  _! |  j d | d | d t" ƒ |  _# |  j$ j% d | ƒ } | j& ƒ  d |  _' | j( ƒ  d |  _) t j* |  j+ j, d |  j ƒ ƒ |  _- d
 |  _. x2 |  j  D]' } | j/ d k rJ|  j. d 7_. qJqJW|  j0 ƒ  |  _1 d  S(   Nt   Nt   CAt   Ct   Ot   CBR$   i   s   %s%s%st   common_amino_acidi    R%   t	   other_mapR   R   R   R   R   R   R   R   R   R   R   t   per_atomi   t   othert   OUTLIER(2   R7   t   iotbxt   pdbt   common_residue_names_get_classR$   R%   t   compute_mapR#   t   modelst   chainst   residue_groupst
   conformerst   lent   only_residuet   idt   resnamet   resseqt   stripR   t   size_tt   atomst   namet   appendt   i_seqt   selectt   sizeR   t   map_ccR   R.   t   evaluate_residuet   extract_i_seqR/   R0   t   TrueR1   R;   t   energies_sitest   angle_deviationsR3   t   bond_deviationsR2   t   meanR(   t	   distancesR4   R6   R   t   find_sidechain_clashesR8   (   R   t   backbone_atomst	   get_classR%   t   current_mapt   modelt   chaint   residue_groupRN   t	   conformerR   R   t   residue_i_seqs_backbonet   residue_i_seqs_sidechaint   residue_i_seqs_allt   residue_i_seqs_ct   residue_i_seqs_nt   atomt   ant   bbt   scat   scst   scbt   ccst   ccat   ccbt   est   r(    (    sR   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/refinement/real_space/__init__.pyR9   J   sœ    	 "    	 	 		c         C   sP   |  j  j j d | ƒ j ƒ  } t j d |  j  j d | ƒ } | j ƒ  | j ƒ  S(   NR$   t   crystal_griddingt   fourier_coefficients(	   R:   t   miller_arrayt!   structure_factors_from_scattererst   f_calcR   t   fft_mapR}   t   apply_sigma_scalingt   real_map_unpadded(   R   R$   t   mcR‚   (    (    sR   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/refinement/real_space/__init__.pyRJ   œ   s    		
i   c         C   s�  | d  k	 r\| rÌ t j ƒ  } x8| D]  } t j d |  j d | j ƒ  d | j ƒ  d t j | g ƒ d t j d | ƒ ƒ } | j	 t j
 d | j | ƒ j ƒ  d |  j j j | ƒ j ƒ  ƒ j ƒ  ƒ q% WqŒt j d |  j d | j ƒ  d | j ƒ  d | d t j | j ƒ  | ƒ ƒ } t j
 d | j | ƒ j ƒ  d |  j j j | ƒ j ƒ  ƒ j ƒ  } n0 t j
 d | j ƒ  d |  j j j ƒ  ƒ j ƒ  } | S(	   NR&   t
   fft_n_realt
   fft_m_realR%   t
   site_radiii   t   xt   y(   R   R   t   doubleR   t   grid_indices_around_sitesR&   t   focust   allt   vec3_doubleRX   t   linear_correlationRZ   t   as_1dR:   t   datat   coefficientR[   (   R   RC   R%   t   atom_radiusRD   t   resultt	   site_cartt   sel(    (    sR   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/refinement/real_space/__init__.pyR\   ¨   s4    		,			'	t    c         C   s  | d  k r t j } n  d } t j d |  j d t j j d ƒ d |  j	 ƒ } | | | |  j
 | |  j | |  j | |  j | |  j | |  j | t d | j ƒ | | t d | j ƒ | t d | j ƒ | t d | j ƒ | t d | j ƒ j ƒ  | t d	 | j ƒ f IJd  S(
   NsÌ  %s Map CC (whole unit cell):  %-6.3f
%s Map CC (around atoms):     %-6.3f
%s rmsd (bonds):              %-6.4f
%s rmsd (angles):             %-5.2f
%s Dist. moved from start:    %-6.3f
%s Dist. moved from previous: %-6.3f
%s All-atom clashscore        %-s
%s Ramachandran plot:
%s   outliers:                %-s %%
%s   allowed:                 %-s %%
%s   favored:                 %-s %%
%s Rotamer outliers:          %-s %%
%s C-beta deviations:         %-s
R#   t   molprobity_scorest   probet   restraints_managers   %-6.2fs   %-5.2fs   %6.2fs   %-3d(   R   t   syst   stdoutR
   t   geometryR#   t   libtbxt   envt
   has_moduleR;   R/   R0   R2   R3   R4   R5   R   t
   clashscoret   ramachandran_outlierst   ramachandran_allowedt   ramachandran_favoredt   rotamer_outliersRT   t
   c_beta_dev(   R   t   prefixt   logt   fmtt   mso(    (    sR   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/refinement/real_space/__init__.pyt   showÉ   s*     								gš™™™™™é?c   
      C   sØ   | d  k r t j } n  t } x³ |  j D]¨ } | j | k  } | j d k } | j d  k	 } | j d  k	 ov | j | k  }	 | | | |	 g j	 t ƒ d k r( | r½ | d IJ| d IJt
 } n  | | j ƒ  IJq( q( Wd  S(   NRF   i    s5   Residue     CC        CC         CC   Rotamer Clashess5        id    all  backbone  sidechain        id    with(   R   Rœ   R�   R_   R7   R   R   R   R   t   countt   FalseR   (
   R   R   R   R©   t   header_printedR|   t   i1t   i2t   i3t   i4(    (    sR   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/refinement/real_space/__init__.pyt   show_residuesì   s     !

	c         C   s•  | s4|  j  d | ƒ } | j ƒ  } |  j j ƒ  } xì |  j D]á } | j | j ƒ } | j | j ƒ } | j | j ƒ }	 |  j d | d | ƒ }
 |  j d | d | ƒ } |  j d |	 d | ƒ } |
 | j	 k oë | | j
 k oë | | j k } | r= | j | j ƒ } | j | j | ƒ } q= q= W| j | ƒ } n  t j |  j j d | ƒ ƒ |  _ | |  _ |  j j | ƒ |  j ƒ  |  j j d | j ƒ  ƒ d  S(   NR$   R%   RC   RE   (   RJ   R%   R$   R7   RZ   R   R   R   R\   R   R   R   t   set_selectedt   replace_sites_cartR   Rc   Rd   R5   R#   t   adopt_xray_structureR9   R,   R-   (   R   R$   t   accept_as_isRh   R%   t   sites_cart_R|   Ru   Rv   Rw   R   R   R   t   flagt   residue_sites_cart_new(    (    sR   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/refinement/real_space/__init__.pyt   updateû   s2    	
c         C   sù  t  j ƒ  } t j j } |  j j d |  j j ƒ  ƒ j	 j
 } g  } x | D] } | j | j ƒ qI W|  j j d |  j ƒ } | j ƒ  } | j ƒ  } t t | ƒ j t | ƒ ƒ ƒ }	 g  }
 x8|	 D]0} g  } g  } xc t |  j ƒ D]R \ } } | d | j k s| d | j k rã | j | ƒ | j | j ƒ qã qã Wt | ƒ d k rÁ | d |  j | d _ | d |  j | d _ |  j | d j |  j | d j k  rÊ| d | k rî| j | d ƒ qîqñ| d | k rñ| j | d ƒ qñqÁ qÁ W| S(   NR%   t   distance_cutoffi    i   i   (   R   RU   RG   RH   RI   R;   t   pair_proxiesR$   R%   t   bond_proxiest   simpleRX   t   i_seqst   pair_asu_tableR<   t   extract_pair_sym_tablet   simple_edge_listt   listt   sett
   differencet	   enumerateR7   R   R   RO   R   R   (   R   R•   Rg   t   bond_proxies_simplet   bonded_i_seqst   bpRÂ   t   pair_sym_tablet   atom_pairs_i_seqst   nonbonded_pairst   residue_i_seqst   pairt   residue_pair_i_seqst   residue_pair_resseqst   i_resR|   (    (    sR   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/refinement/real_space/__init__.pyRe     s<    !&N(   R    R!   R   R9   RJ   R   R®   R\   R¬   R´   R_   R¼   Re   (    (    (    sR   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/refinement/real_space/__init__.pyR"   ,   s   	R	!#c         C   sb  | | g j  d  ƒ d k rH t j | j ƒ  | ƒ } | j | t ƒ } n  |  j d | d t j |  j ƒ  j ƒ  | ƒ ƒ } | d  k	 r± t j | j ƒ  | ƒ }	 | j |	 t	 ƒ }
 n0 t j
 t t | j ƒ  ƒ j t | ƒ ƒ ƒ ƒ }
 | d  k	 rú |
 | @} n |
 } | d  k	 r/| j ƒ  d k r/t	 | | d <n  | d  k	 r^| j ƒ  d k r^t	 | | d <n  | S(   Ni    t   radiust	   selection(   R­   R   R   t   boolR[   Rµ   R_   t   selection_withint
   scatterersR®   RU   t   tupleRÆ   t
   iselectionRÇ   (   R$   t   selection_within_radiusRÚ   t   selection_goodt   iselection_backbonet   iselection_n_externalt   iselection_c_externalR   t
   sel_aroundt   ssbt   sel_around_minus_selft   negate_selection(    (    sR   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/refinement/real_space/__init__.pyt   selection_around_to_negate:  s&    		!	'c         C   sÓ   |  j  | ƒ j d t ƒ j ƒ  } t j d |  j ƒ  d | j ƒ  d | j ƒ  d | d t	 j
 | j ƒ  | ƒ ƒ } t	 j d | j ƒ  d | ƒ } | j | j ƒ  ƒ | j ƒ  j | d	 ƒ } | j | d
 ƒ } | | S(   Nt   sites_mod_positiveR&   R†   R‡   R%   Rˆ   R[   RÚ   iÿÿÿÿi   (   RZ   t   expand_to_p1R_   R%   R   RŒ   R&   R�   RŽ   R   R‹   R[   RÖ   t   reshapet   accessort	   deep_copyRµ   (   R$   t   map_dataRã   R”   t   sites_cart_p1t   around_atoms_selectionst   sel_t   md(    (    sR   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/refinement/real_space/__init__.pyt6   negate_map_around_selected_atoms_except_selected_atomsY  s    	t   scorec           B   s_   e  Z d d d  d e e d d „ Z d d „ Z d „  Z d d d „ Z d „  Z d d „ Z	 RS(	   i   i   c         C   s5   t  |  t ƒ  ƒ d  |  _ d  |  _ | j ƒ  |  _ d  S(   N(   R   R   R   t   targetR%   R&   (   R   t   special_position_settingst   sites_cart_allt
   target_mapR   t   rotamer_evalt   vectort   slope_decrease_factort   tmpt
   use_binaryt   use_clash_filtert   clash_radius(    (    sR   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/refinement/real_space/__init__.pyR   n  s    		c         C   sÍ   |  j  j | ƒ } d } | d  k rv x¢ | D]D } |  j j | ƒ } | | 7} |  j r+ | d k r+ | d 7} q+ q+ WnS xP | D]H } |  j j | | ƒ } | | 7} |  j r} | d k r} | d 7} q} q} W| S(   Ni    g      ð?i   (   R&   t   fractionalizeR   Rô   t   eight_point_interpolationRù   (   R   R%   RÕ   t
   sites_fracR•   t	   site_fract   epiR—   (    (    sR   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/refinement/real_space/__init__.pyt   compute_target  s    
 
 c         C   s¾   |  j  j ƒ  j ƒ  } |  j j ƒ  j | | ƒ } t j d |  j j ƒ  d | ƒ } t	 j
 d |  j j d |  j d | ƒ d |  j ƒ j d | ƒ j ƒ  } t j t t | ƒ j t | ƒ ƒ ƒ ƒ S(   NR[   RÚ   t   asu_mappingst   buffer_thicknessR%   R½   t   primary_selection(   R   RV   R^   Ró   Ré   Rµ   R   RÖ   R[   R	   t   neighbors_fast_pair_generatorRò   R  Rû   t   neighbors_ofRÚ   RU   RÙ   RÆ   RÇ   (   R   R%   RÚ   t   sites_cart_all_RÕ   t   selection_around(    (    sR   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/refinement/real_space/__init__.pyt   find_clashesŽ  s    !			c         C   s8  |  j  d | d | ƒ } |  j d  k	 s- t ‚ d  } |  j d  k	 rW |  j d | ƒ } n  | |  j k r4| d  k s„ | d  k	 r4| r4|  j j ƒ  j | ƒ |  j	 d  k pÄ |  j	 j
 d |  j ƒ d k } | r4t j ƒ  } |  j r|  j d | ƒ } | j ƒ  d k rd  Sn  | |  _ | |  _ | | f |  _ q4n  d  S(   NR%   RÕ   R   RF   i    (   R  Rñ   R   t   AssertionErrorRö   t	   get_slopeR   RV   t   set_xyzRõ   R]   R   RU   Rú   R	  R[   R%   Rø   (   R   R%   RÕ   Rø   Rñ   t   slopet   flt
   clash_list(    (    sR   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/refinement/real_space/__init__.pyR¼   ›  s$    -	 		c         C   sï  |  j  j | ƒ } t j ƒ  } x™ |  j D]Ž } t | ƒ t d ƒ k rf | j |  j j | | ƒ ƒ q( t j ƒ  } x+ | D]# } | j |  j j | | ƒ ƒ qy W| j t j	 | ƒ ƒ q( Wt
 } x™ t | ƒ D]‹ \ } }	 | d k rë qÍ n  | d k r:| d | j ƒ  k  r:| | d | | | | d d | | <qÍ | | d | | d | | <qÍ Wt j ƒ  }
 x7 | D]/ }	 |	 d k  r‘|
 j d ƒ qo|
 j d ƒ qoWt } x@ |
 D]8 }	 | rÑ|	 d k rÑt
 } n  | r¯|	 d k r¯t Sq¯Wt
 S(   Ni   i    i   i   (   R&   Rü   R   R‹   Rö   t   typeRX   Rô   Rý   Rc   R_   RÈ   R[   R®   (   R   R%   Rþ   RŠ   t   vRø   t   v_R•   t   it   y_t   ynewt   found(    (    sR   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/refinement/real_space/__init__.pyR  ®  s8     ! "-"  	 c         C   s(   |  j  d | d | ƒ |  _ | |  _ d  S(   NR%   RÕ   (   R  Rñ   R%   (   R   R%   RÕ   (    (    sR   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/refinement/real_space/__init__.pyt
   reset_withË  s    N(
   R    R!   R   R®   R   R  R	  R¼   R  R  (    (    (    sR   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/refinement/real_space/__init__.pyRð   m  s   		iìÿÿÿi   i   c         C   s3  d „  } x#t  |  ƒ D]\ } } | d k rP | j d | j ƒ  d | j ƒ n" | j d | j j ƒ  d | j ƒ | j j ƒ  }	 x§ | d | d | d | ƒ D]Š }
 |	 j ƒ  } x\ | j D]Q } t d |	 | j d d	 |	 | j d
 d |	 | d |
 d t ƒ } | | | <q¹ W| j	 d | d | j ƒ q� Wq W| S(   Nc         S   sd   t  |  ƒ t  | ƒ k s t ‚ |  } g  } x3 t  | ƒ t  | ƒ k r_ | j | ƒ | | 7} q- W| S(   N(   t   absR
  RX   (   t   startt   stopt   stept   incR•   (    (    sR   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/refinement/real_space/__init__.pyt   generate_rangeØ  s    i    R%   RÕ   R  R  R  t   axis_point_1t   axis_point_2i   t   pointt   anglet   deg(
   RÈ   R  Ré   RÕ   R%   t   atoms_to_rotateR   t   axisR_   R¼   (   t   clusterst   scorerR%   R  R  R  R  t   i_clt   clR¹   t	   angle_degt	   xyz_movedRr   t   new_xyz(    (    sR   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/refinement/real_space/__init__.pyt   torsion_searchÑ  s&    	
"
!c         C   ss  t  |  ƒ } | GH| d k r> d d d g } d d d g } n7 | d k rq d d d	 d	 g } d
 d
 d d g } n d  St j d | d | d t ƒ } |  d j } | j d | d | ƒ x¶ | D]® } | j ƒ  }	 xƒ t | ƒ D]u \ }
 } |  |
 } x\ | j D]Q } t d |	 | j	 d d |	 | j	 d d |	 | d | d t
 ƒ } | |	 | <qü WqÜ W| j d |	 d | ƒ q½ W| S(   Ni   iýÿÿÿiùÿÿÿi÷ÿÿÿi   i	   i   iûÿÿÿiöÿÿÿi   i
   t   begint   endt
   open_rangei    R%   RÕ   R  R  i   R   R!  R"  (   RO   R   t   nested_loopR®   R#  R  Ré   RÈ   R   R$  R_   R¼   (   R%  R&  R%   t   n_anglest   r1t   r2R0  RÕ   t   anglesR*  R  R!  R(  Rr   R+  (    (    sR   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/refinement/real_space/__init__.pyt   torsion_search_nestedô  s2    

(#   t
   __future__R    RŸ   R   t   scitbx.array_familyR   t   scitbx.matrixR   t   timeRœ   t   cctbxR   t   mmtbx.utilsR)   t   mmtbx.rotamer.rotamer_evalR   t   libtbx.utilsR   t	   iotbx.pdbRG   R   t   libtbx.str_utilsR   R	   R
   t   libtbx.load_envt   objectR   R"   R   Rä   Rï   Rð   R,  R5  (    (    (    sR   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/refinement/real_space/__init__.pyt   <module>   s6   ÿ 	h