ó
Ñ™xTc           @   sç   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	 m
 Z
 d  d l Z d  d l Z d  d l Z d  d l m Z d  d l Z d e f d „  ƒ  YZ d	 „  Z d
 e f d „  ƒ  YZ d e f d „  ƒ  YZ d S(   iÿÿÿÿ(   t   division(   t   flexN(   t   rotatable_bonds(   t   adopt_init_args(   t   individual_sitest   runc           B   sD   e  Z d  d d d e d „ Z d „  Z d „  Z d „  Z d „  Z RS(	   i   g¸…ëQ¸ž?g      @c      	   C   s‚  t  |  t ƒ  ƒ d d d d d g |  _ |  j j ƒ  j ƒ  |  _ |  j j d ƒ sY t ‚ t	 j
 | j ƒ  j ƒ  |  j ƒ |  _ t	 j ƒ  |  _ xE |  j j ƒ  D]4 } | j j ƒ  |  j k rœ |  j j | j ƒ qœ qœ Wt	 j
 | j ƒ  j ƒ  |  j ƒ |  _ | |  _ |  j ƒ  t j j j d |  j d |  j d	 |  j j ƒ  j ƒ  ƒ } t j j j d |  j d
 | d | d d ƒ |  _ |  j ƒ  d  S(   Nt   Nt   CAt   Ot   CBt   Ci    t   xray_structuret   selection_within_radiust
   iselectiont   map_datat   negate_selectiont   atom_radiusg      ø?(   R   t   localst   backbone_atom_namest   residuet   atomst   extract_i_seqt   residue_iselectiont   all_eqt   AssertionErrorR   t   boolt
   scattererst   sizet   residue_selectiont   size_tt   residue_backbone_selectiont   namet   stript   appendt   i_seqt   target_map_workt   fit_backbonet   mmtbxt
   refinementt
   real_spacet   selection_around_to_negateR   t   selection_radiust6   negate_map_around_selected_atoms_except_selected_atomst   fit_rotamers(   t   selft
   target_mapR   R   t   mon_lib_srvt   rotamer_managert   geometry_restraints_managert   real_space_gradients_deltaR)   t   rms_bonds_limitt   rms_angles_limitt   backbone_sample_anglet   allow_modified_residuest   atomR   (    (    sU   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/refinement/real_space/fit_residue.pyt   __init__   s0    	
			c         C   sF   |  j  d t d d d t ƒ |  j ƒ  |  j  d t d d d t ƒ d  S(   Nt   optimize_weightt   start_trial_weight_valuei    t   use_selection_real_spacei2   (   t   real_space_refinet   Falset   grid_sample_around_c_n_axist   True(   R,   (    (    sU   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/refinement/real_space/fit_residue.pyR$   8   s
    
c         C   s´   |  j  j ƒ  } t j j j j d |  j d |  j d | d |  j	 d t
 d |  j  j ƒ  d |  j d |  j ƒ |  j  j ƒ  } | j |  j |  j	 j ƒ  j ƒ  ƒ |  j  j | ƒ |  _  d  S(	   NR-   R.   t   special_position_settingsR   t   use_clash_filtert   sites_cart_allR/   R5   (   R   R?   R%   R&   R'   t   fit_residuet   managerR#   R.   R   R>   t
   sites_cartR/   R5   t   set_selectedR   R   t   extract_xyzt   replace_sites_cart(   R,   t   spst   sites_cart_poor(    (    sU   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/refinement/real_space/fit_residue.pyR+   B   s    				
c   
      C   st  |  j  j ƒ  } t j j j d |  j d |  j  j ƒ  d |  j d | ƒ } d „  } | |  ƒ } |  j j	 ƒ  j
 ƒ  } | j d | d | j ƒ d } d	 } |  j d  k	 rÑ |  j d k s» t ‚ |  j } |  j } n  t j j j d
 | g d | d | d | d | d d ƒ |  j j	 ƒ  j d | j ƒ |  j j	 ƒ  j ƒ  } |  j  j ƒ  }	 |	 j | | j ƒ |  j  j |	 ƒ |  _  d  S(   NR-   RA   R   R?   c         S   sÁ   g  } g  } t  j ƒ  } d } x{ |  j j ƒ  D]j } | j j ƒ  d k rY | j | ƒ n | j | ƒ | j j ƒ  |  j k rŽ | j | ƒ n  | d 7} q. Wt j	 j
 j j d | d | d | ƒ S(	   Ni    R   R
   i   t   axist   atoms_to_rotatet	   selection(   R   R
   (   R   R   R   R   R   R    R!   R   R%   R&   R'   RB   t   cluster(   R,   RJ   RK   t   use_in_target_selectiont   counterR6   (    (    sU   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/refinement/real_space/fit_residue.pyt   get_clusterY   s    RD   RL   i    ih  t   clusterst   scorert   startt   stopt   stepi   t   new_xyz(   R   R?   R%   R&   R'   t   scoreR#   RD   R   R   RF   t
   reset_withRL   R4   t   NoneR   t   torsion_searcht   set_xyzR   RE   RG   (
   R,   RH   RR   RP   t   clt   residue_sites_cartt   angle_startt	   angle_endRL   RI   (    (    sU   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/refinement/real_space/fit_residue.pyR=   R   s<    					

	c         C   s«   t  j d |  j d |  j d |  j j d d d d ƒ } | j d	 |  j d
 | d | d |  j d d d |  j	 d |  j
 ƒ | j |  _ |  j j ƒ  j | j j |  j ƒ ƒ d  S(   NR   R-   R0   R1   g      ð?i   t   max_iterationsiô  RL   R8   R9   t   selection_buffer_radiust   box_cushioni   R2   R3   g      Ð?(   R   t   box_refinement_managerR   R#   R0   t   geometryt   refineR   R)   R2   R3   R   R   R[   RD   t   selectR   (   R,   R8   R9   R:   t   brm(    (    sU   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/refinement/real_space/fit_residue.pyR;   ‚   s     								
N(	   t   __name__t
   __module__RY   R<   R7   R$   R+   R=   R;   (    (    (    sU   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/refinement/real_space/fit_residue.pyR      s   	
		0c      	   C   sy   |  j  d t d | j d | j ƒ  j ƒ  d | j ƒ  j ƒ  ƒ } | d  k rO d  S| j d  k	 rb d  S| j d  k ru d  S| S(   Nt   fine_samplingt   comp_idt
   atom_namesRD   (	   t   rotamer_iteratorR>   t   resnameR   t   extract_nameRF   RY   t   problem_messaget   rotamer_info(   R.   R   Rm   (    (    sU   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/refinement/real_space/fit_residue.pyt   get_rotamer_iterator•   s    		RM   c           B   s   e  Z d d d  „ Z RS(   c         C   s   t  |  t ƒ  ƒ d  S(   N(   R   R   (   R,   RJ   RK   t   vectorRL   (    (    sU   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/refinement/real_space/fit_residue.pyR7   ¤   s    N(   Rh   Ri   RY   R7   (    (    (    sU   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/refinement/real_space/fit_residue.pyRM   £   s   RC   c           B   sw   e  Z d e e e e e d  d d d d d e d d „ Z d „  Z d „  Z d e e d	 „ Z e d
 „ Z	 d d „ Z
 RS(   i    ih  i   iÎÿÿÿi2   i   c         C   sÁ   t  |  t ƒ  ƒ |  j d  k r. t j |  _ n  | sg t j j } | | j	 ƒ d k sg t
 | j	 ƒ ‚ n  d  |  _ d  |  _ d  |  _ |
 rš |  j ƒ  |  _ n  | r­ |  j ƒ  n  |  j d |	 ƒ d  S(   Nt   common_amino_acidt   debug(   R   R   t   logRY   t   syst   stdoutt   iotbxt   pdbt   common_residue_names_get_classRn   R   t   vector_selectionsRQ   t   axes_and_atoms_aa_specifict   define_clusterst
   get_vectort   fit(   R,   R-   R   R?   R.   R/   RA   R@   t	   use_slopeRu   t   use_torsion_searcht   use_rotamer_iteratort   torsion_search_all_startt   torsion_search_all_stopt   torsion_search_all_stept   torsion_search_local_startt   torsion_search_local_stopt   torsion_search_local_stepR5   Rv   t	   get_class(    (    sU   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/refinement/real_space/fit_residue.pyR7   ¬   s     '			  c   	      C   sÄ  g  } g  } g  } g  } d } x„ |  j  j ƒ  D]s } | j j ƒ  j ƒ  d k r_ | j | ƒ n | j | ƒ | j j ƒ  j ƒ  d k r— | j | ƒ n  | d 7} q. W| j t d | d	 | d
 | ƒ ƒ t j d |  j  d |  j	 d |  j
 ƒ |  _ |  j d  k	 rÀx½ t |  j ƒ D]© \ } } | t |  j ƒ d k ru| j t d | d d	 | d d
 t j | d ƒ d d  ƒ ƒ q| j t d | d d	 | d d
 t j | d d g ƒ d d  ƒ ƒ qWn  | S(   Ni    R   R
   R   R   R	   i   RJ   RK   RL   R   R.   Rv   Rs   (   R   R
   (   s   CAR   s   CB(   R   R   R   R    t   upperR!   RM   R   R}   R.   Rv   RY   t	   enumeratet   lenR   R   (	   R,   t   resultt   backrub_axist   backrub_atoms_to_rotatet   backrub_atoms_to_evaluateRO   R6   t   i_aat   aa(    (    sU   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/refinement/real_space/fit_residue.pyR~   Ì   sD    
			



c         C   sÌ   g  |  _  |  j d  k	 rÈ |  j d  k	 rÈ xT t |  j ƒ D]C \ } } x4 | d D]( } | |  j  k rN |  j  j | ƒ qN qN Wq7 W|  j  j |  j t |  j ƒ d j ƒ x  |  j D] } |  j  | _ q¯ Wn  d  S(   Ni    i   (	   R|   R}   RY   RQ   RŒ   R!   R�   RK   Rs   (   R,   R’   R“   t   aa_R\   (    (    sU   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/refinement/real_space/fit_residue.pyR   ô   s    		c         C   sO   t  j j j d |  j d |  j d |  j d |  j d | d | d | d |  j ƒ S(	   NR-   RA   R?   R   Rs   t
   use_binaryR@   t   rotamer_eval(	   R%   R&   R'   RW   R-   RA   R?   R   R/   (   R,   Rs   R•   R@   (    (    sU   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/refinement/real_space/fit_residue.pyt
   get_scorer  s    				c   	      C   s9  |  j  r²t d |  j d |  j ƒ } | d  k	 r5|  j d |  j d |  j d t ƒ } d } xÉ| D]Á\ } } | r† | j	 Gd d GHn  | d k rÇ | j
 d	 | j ƒ  ƒ | rù | j Gd G| j	 GHqù n2 | j d	 | j ƒ  ƒ | rù | j Gd G| j	 GHn  | d
 7} |  j rÃ|  j ƒ  } | j d	 | j ƒ  ƒ t j j j d |  j d	 | j ƒ  d | d |  j d |  j d |  j ƒ | r‰| j Gd
 GHn  | j d	 | j j ƒ  d | j	 ƒ | r| j Gd GHqn@ | rØ| j Gd GHn  | j d	 | j ƒ  ƒ | r| j Gd GHn  | ra | j	 G| j G| j GHqa qa W| rBd G| j G| j GHn  | j d  k	 r¯|  j j ƒ  j d | j ƒ |  j d  k	 r¬|  j j |  j j ƒ  j ƒ  | j ƒ |  _ q¬q¯q5nƒ |  j r5|  j ƒ  } t j j j d |  j d	 |  j j ƒ  j ƒ  d | d |  j d |  j  d |  j! ƒ |  j j ƒ  j d | j ƒ n  d  S(   NR.   R   Rs   R@   R•   i    t   -i2   RD   i   RQ   RR   RS   RT   RU   t   tmpi   i   i   s   final:RV   ("   Rƒ   Rr   R.   R   RY   R—   R|   R@   R>   t   idRX   t	   deep_copyt   targett   updateR‚   R%   R&   R'   RZ   RQ   R‡   Rˆ   R‰   RD   R™   R   R[   RA   RE   R   RF   R„   R…   R†   (	   R,   Ru   Rm   t   score_rotamerst   cntrt   rotamert   rotamer_sites_cartt   score_rotamert   score_residue(    (    sU   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/refinement/real_space/fit_residue.pyR€     sz    						   
				
 "     	$	
				
iú   c         C   sl  d d  l  } d d  l } d d  l } t j ƒ  } t j ƒ  } d } x\ |  j j ƒ  D]K } | j j	 ƒ  j
 ƒ  d k rR | j | j ƒ | j | ƒ | d 7} qR qR W| j j ƒ  } | j j j d | ƒ }	 |	 j j j d | d | d	 d
 ƒ | j j j d t ƒ }
 t j j d | ƒ } | j j j j d |  j d |  j d |	 d d d d d | d |  j d |
 ƒ } | j S(   Niÿÿÿÿi    R   R
   i   t   generic_restraints_managerRD   RL   t   sigmag      à?t   generic_restraintsR`   R   t   density_mapR0   t   real_space_target_weightR1   g       @g      Ð?t   lbfgs_termination_paramst	   unit_cellt   cctbx_geometry_restraints_flags(   R   R
   g      à?(   t   mmtbx.geometry_restraintst!   cctbx.geometry_restraints.managert&   mmtbx.refinement.real_space.rigid_bodyR   t   vec3_doubleR   R   R   R   R    R‹   R!   t   xyzt   geometry_restraintsRC   R¤   t   reference_managert   add_coordinate_restraintst   flagsR>   t   scitbxt   lbfgst   termination_parametersR&   R'   t
   rigid_bodyRe   R-   Rª   t   sites_cart_residue(   R,   R`   R%   t   cctbxt   reference_sitest   reference_selectionRŸ   R6   R¤   t   restraints_managerR´   R©   t	   minimized(    (    sU   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/refinement/real_space/fit_residue.pyt   rigid_body_refineO  s>    						N(   Rh   Ri   RY   R<   R>   R7   R~   R   R—   R€   R¿   (    (    (    sU   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/refinement/real_space/fit_residue.pyRC   «   s&   	(	B(   t
   __future__R    t   cctbx.array_familyR   t   scitbx.rigid_bodyRµ   t   scitbx.lbfgst   mmtbx.utilsR   t   libtbxR   t	   iotbx.pdbRy   t   mmtbx.refinement.real_spaceR%   t   cctbx.geometry_restraints.flagsRº   R   Rw   t   objectR   Rr   RM   RC   (    (    (    sU   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/refinement/real_space/fit_residue.pyt   <module>   s   ˆ	