ó
Ñ™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 Z d  d l 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 Z d  d	 l m Z d  d
 l m Z d Z d Z d e e f Z d „  Z d „  Z d e  f d „  ƒ  YZ! d e  f d „  ƒ  YZ" d e  f d „  ƒ  YZ# d „  Z$ d „  Z% d e  f d „  ƒ  YZ& d „  Z' d „  Z( d d e* d „ Z+ d „  Z, d# e* e* d  „ Z- e* d! „ Z. e* d d d" „ Z/ d S($   iÿÿÿÿ(   t   division(   t   print_statistics(   t   flex(   t   adopt_init_args(   t   lockit(   t   maptbxN(   t	   map_tools(   t   rotate_point_around_axis(   t   rotatable_bondssú   torsion_search
  .style = box auto_align
{
  min_angle_between_solutions = 5
    .type = float
    .short_caption = Min. angle between solutions
  range_start = -40
    .type = float
  range_stop = 40
    .type = float
  step = 2
    .type = float
}
s-    number_of_macro_cycles = 1
    .type = int
  real_space_refine_overall = False
    .type = bool
    .short_caption = Run overall real-space refinement (RSR)
  validate_change = True
    .type = bool
  exclude_hydrogens = True
    .type = bool
    .short_caption = Exclude hydrogens from RSR
  filter_residual_map_value = 2.0
    .type = float
  filter_2fofc_map = None
    .type = float
  target_map = 2mFo-DFc
    .type = str
  residual_map = mFo-DFc
    .type = str
  model_map = Fc
    .type = str
  exclude_free_r_reflections = False
    .type = bool
sl  fit_side_chains
  .short_caption = Sidechain rotamer fitting
  .style = menu_item auto_align
{
  mode = *every_macro_cycle every_cycle_after_first
    .type = choice
  %s
  use_dihedral_restraints = False
    .type = bool
  ignore_water_when_move_sidechains = True
    .type = bool
    .short_caption = Ignore water when moving sidechains
  residue_iteration
    .style = box auto_align
  {
    poor_cc_threshold = 0.9
      .type = float
      .short_caption = Poor CC threshold
    real_space_refine_rotamer = True
      .type = bool
    real_space_refine_max_iterations = 25
      .type = int
    real_space_refine_target_weight = 100.
      .type = float
    use_rotamer_iterator = True
      .type = bool
    torsion_grid_search = True
      .type = bool
    ignore_alt_conformers = True
      .type = bool
      .short_caption = Ignore alternate conformers
    %s
  }
}
c           C   s   t  j j d t ƒ S(   Nt   input_string(   t   iotbxt   philt   parset   master_params_str(    (    (    sK   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/refinement/fit_rotamers.pyt   master_paramsc   s    c           C   s   t  j j d t ƒ S(   NR	   (   R
   R   R   t   torsion_search_params_str(    (    (    sK   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/refinement/fit_rotamers.pyt   torsion_search_paramsf   s    t   residue_rsr_monitorc        	   B   s)   e  Z d d d d d d d d d  „ Z RS(   c	   	      C   s   t  |  t ƒ  ƒ d  S(   N(   R   t   locals(	   t   selft   residue_id_strt	   selectiont
   sites_cartt	   twomfodfct   mfodfct   cct   residue_typet   validate_iselection(    (    sK   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/refinement/fit_rotamers.pyt   __init__j   s    	N(   t   __name__t
   __module__t   NoneR   (    (    (    sK   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/refinement/fit_rotamers.pyR   i   s   t
   select_mapc           B   sA   e  Z d  „  Z d „  Z d d „ Z d „  Z d „  Z d „  Z RS(   c         C   sn   t  |  t ƒ  ƒ | j ƒ  | j ƒ  k s. t ‚ | j ƒ  | j ƒ  k sL t ‚ | j ƒ  |  _ | j ƒ  |  _ d  S(   N(   R   R   t   focust   AssertionErrort   allt
   fft_n_realt
   fft_m_real(   R   t	   unit_cellt   target_map_datat   model_map_data(    (    sK   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/refinement/fit_rotamers.pyR   v   s
    c         C   s#   d d l  m } | j ƒ  |  _ d  S(   Niÿÿÿÿ(   t   rotalyze(   t   mmtbx.validationR)   t   residue_evaluatort   rot(   R   R)   (    (    sK   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/refinement/fit_rotamers.pyt   initialize_rotamers}   s    g       @c         C   sC   t  j d |  j d |  j d |  j d | d t j | j ƒ  | ƒ ƒ S(   NR&   R$   R%   R   t
   site_radii(   R   t   grid_indices_around_sitesR&   R$   R%   R   t   doublet   size(   R   R   t   atom_radius(    (    sK   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/refinement/fit_rotamers.pyt   select‚   s    				c         C   sR   |  j  d | ƒ } |  j j  | ƒ } |  j j  | ƒ } t j d | d | ƒ j ƒ  S(   NR   t   xt   y(   R3   R'   R(   R   t   linear_correlationt   coefficient(   R   R   t   residue_iselectiont   sel_mapt   m1t   m2(    (    sK   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/refinement/fit_rotamers.pyt   get_ccŠ   s    c         C   s.   |  j  d | d d ƒ } t j | j  | ƒ ƒ S(   NR   R2   g333333Ó?(   R3   R   t   sum(   R   R   R8   t   mapR9   (    (    sK   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/refinement/fit_rotamers.pyt   get_map_sum�   s    c         C   sþ   t  } |  j |  j |  j g j d  ƒ d k rR |  j j | ƒ \ } } | rR t Sn  x¥ | j ƒ  D]— } | j	 j
 ƒ  j ƒ  d k r_ |  j d t j | j g ƒ ƒ }	 |  j j |	 ƒ }
 |  j j |	 ƒ } t j d |
 d | ƒ j ƒ  } | | k  rö t Sq_ q_ W| S(   Ni    t   ht   dR   R4   R5   (   R@   RA   (   t   Falset   sat   rR,   t   countR   t   evaluate_residuet   Truet   atomst   elementt   stript   lowerR3   R   t   vec3_doublet   xyzR'   R(   R6   R7   (   R   t   residue_groupt   residuet   cc_limitt	   ignore_hdt   resultt
   is_outliert   valuet   atomR9   R:   R;   R   (    (    sK   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/refinement/fit_rotamers.pyt   is_refinement_needed”   s    ' ! (   R   R   R   R-   R3   R<   R?   RV   (    (    (    sK   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/refinement/fit_rotamers.pyR    u   s   				t   refinerc           B   s   e  Z d  „  Z e d „ Z RS(   c         C   sm   | |  _  | |  _ | |  _ | |  _ | |  _ t j j d | ƒ |  _ t j j	 d t
 d t
 d t
 ƒ |  _ d  S(   Nt   max_iterationst-   ignore_line_search_failed_step_at_lower_boundt-   ignore_line_search_failed_step_at_upper_boundt    ignore_line_search_failed_maxfev(   t
   target_mapt   real_space_target_weightt   real_space_gradients_deltat   geometry_restraints_managert   pdb_hierarchyt   scitbxt   lbfgst   termination_parameterst   lbfgs_termination_paramst   exception_handling_parametersRG   t   lbfgs_exception_handling_params(   R   R`   R\   R_   R]   R^   RX   (    (    sK   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/refinement/fit_rotamers.pyR   ¤   s    					c         C   sR  | j  ƒ  |  j j ƒ  k s! t ‚ | j  ƒ  | j t ƒ k sB t ‚ |  j j | ƒ } | rý t j	 ƒ  j
 ƒ  } d | j _ t | j _ d | j j _ t j d | d | d | d |  j d |  j d | d g  d	 d  d
 d  d d  d d  d d  ƒ } | j j | ƒ St j j d | d | d |  j d | d |  j d |  j d |  j d |  j ƒ } | j S(   Ni2   R   R_   t   selection_variablet   density_mapR^   t   work_paramst   home_restraints_listt   work_scatterersR&   t   d_mint   write_pdb_callbackt   logR]   Rd   Rf   (   R1   R`   t
   atoms_sizeR"   RE   RG   R_   R3   R   t   get_master_philt   extractt   coordinate_refinementt   lbfgs_max_iterationsRB   t   compute_final_correlationt   finishing_geometry_minimizationt
   cycles_maxt   run_coordinate_refinementR\   R^   R   R   R   t   real_space_refinement_simpleRb   R]   Rd   Rf   t   sites_cart_variable(   R   t   sites_cart_rselt   rselt   rst
   use_lockitR_   Ri   RR   (    (    sK   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/refinement/fit_rotamers.pyt   refine_restrained·   s@    !!								(   R   R   R   RB   R~   (    (    (    sK   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/refinement/fit_rotamers.pyRW   £   s   	c         C   s=   | j  |  ƒ } d } x! | D] } | | j | ƒ 7} q W| S(   Ni    (   t   fractionalizet   eight_point_interpolation(   t   sites_cart_residueR&   t   mt   sites_frac_residueRR   t   rsf(    (    sK   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/refinement/fit_rotamers.pyt   targetÚ   s
    c         C   s=   | j  |  ƒ } x' | D] } | j | ƒ | k  r t Sq Wt S(   N(   R   R€   RB   RG   (   R�   R&   R‚   t   sigma_cutoffRƒ   R„   (    (    sK   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/refinement/fit_rotamers.pyt   all_sites_above_sigma_cutoffá   s
    t   rotamer_evaluatorc           B   s    e  Z d  „  Z d e d „ Z RS(   c         C   sŸ   t  |  t ƒ  ƒ t |  j |  j |  j ƒ } t |  j |  j |  j ƒ } | |  _ | |  _ | | |  _	 |  j	 |  _
 | |  _ |  j |  _ | |  _ |  j |  _ d  S(   N(   R   R   R…   t   sites_cart_startR&   t   two_mfo_dfc_mapt   mfo_dfc_mapt   t1t   t2t   t_startt   t_bestt   t1_startt   t1_bestt   t2_startt   t2_best(   R   R‰   R&   RŠ   R‹   RŒ   R�   (    (    sK   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/refinement/fit_rotamers.pyR   ì   s    				g        c   
      C   sC  t  | |  j |  j ƒ } t  | |  j |  j ƒ } | | } t } | j ƒ  } | |  j k r?| d k r� |  j d k r� | |  j |  j }	 |	 | k  r� t Sn  | d k rÇ |  j d k rÇ | |  j k s| d k  rý |  j d k  rý t | ƒ t |  j ƒ k  s| d k r?|  j d k  r?t	 } | |  _ | |  _
 | |  _ q?n  | S(   Ng        i    (   R…   R&   RŠ   R‹   RB   R1   R�   R“   t   absRG   R‘   (
   R   R   t   percent_cutofft   verboseRŒ   R�   t   tRR   R1   t   percent(    (    sK   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/refinement/fit_rotamers.pyt	   is_betterü   s$    
*6		(   R   R   R   RB   R™   (    (    (    sK   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/refinement/fit_rotamers.pyRˆ   ë   s   	c         C   sn   |  j  ƒ  } |  j ƒ  } | j ƒ  } | j | ƒ t j | | ƒ } t j | | ƒ j | ƒ j ƒ  } | | f S(   N(   R1   t	   deep_copyt
   iselectiont   extendR   t   boolR3   (   R   R8   R1   t
   selection_t   new_selR|   (    (    sK   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/refinement/fit_rotamers.pyt   include_residue_selection  s    !c         C   sd   t  |  ƒ t  | ƒ k s t ‚ |  } g  } x3 t  | ƒ t  | ƒ k r_ | j | ƒ | | 7} q- W| S(   N(   R”   R"   t   append(   t   startt   stopt   stept   incRR   (    (    sK   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/refinement/fit_rotamers.pyt   generate_range  s    c	         C   sš  | d  k r< t ƒ  j ƒ  j } d | _ d | _ d | _ n  | j ƒ  }	 t | ƒ }
 d } xõt	 | | ƒ D]ä\ } } | r— | d k r— d } d } n | j } | j } | d 7} | d } | d } d  } d  } x®t
 d | d | d	 | j ƒ D]Ž} | |
 k rÌ| rx| d k rxt j ƒ  } x¤ | D]H } | j t d
 | | d d | | d d | | d | d t ƒ ƒ q)Wq+| | d } t j t d
 | | d d | | d d | d | d t ƒ g ƒ } n_ t j ƒ  } xP | D]H } | j t d
 | | d d | | d d | | d | d t ƒ ƒ qßW| j d | ƒ rò | d  k	 rwt t | ƒ t | ƒ ƒ | j k rw| } n  | } qò qò W| d  k	 réxV | D]K } t d
 | | d d | | d d | | d | d t ƒ } | | | <q—Wn  | d  k	 rj xV | D]K } t d
 |	 | d d |	 | d d |	 | d | d t ƒ } | |	 | <qüWqj qj Wx; | |	 g D]- } |  j d | ƒ r_| } | j ƒ  } q_q_W| | f S(   Ni    ih  g      ð?g      Àg      @i   R¢   R£   R¤   t   axis_point_1t   axis_point_2t   pointt   anglet   degR   (   R   R   Rq   t   torsion_searcht   range_startt
   range_stopR¤   Rš   t   lent   zipR¦   R   RL   R¡   R   RG   R™   R”   t   min_angle_between_solutions(   R+   t   cluster_evaluatorst   axes_and_atoms_to_rotatet   rotamer_sites_cartt   rotamer_id_bestt   residue_sites_bestt   paramst
   rotamer_idt   include_ca_hinget   rotamer_sites_cart_t
   n_clusterst	   c_countert   cluster_evaluatort   aat   cur_range_startt   cur_range_stopt   axisRH   t   angle_deg_bestt   angle_deg_goodt	   angle_degt   new_xyzRU   t   point_localt   rsc(    (    sK   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/refinement/fit_rotamers.pyR¬   '  sŒ    						




	

c   5      C   s¾  t  j j j ƒ  } | j ƒ  | j ƒ  k s0 t ‚ | j ƒ  | j ƒ  k sN t ‚ d } d } d } |
 | IJ|
 | IJ| j ƒ  } t d | j ƒ  d | d | ƒ } | j ƒ  t	 j
 j } d } d } d } | j ƒ  } g  } xÏ|  j ƒ  D]Á} x¸| j ƒ  D]ª} x¡| j ƒ  D]“} | j ƒ  } |	 j rAt | ƒ d k rAqn  x]| j ƒ  D]O} | j ƒ  } | | j ƒ d	 k rN| j ƒ  j ƒ  } | j ƒ  j | ƒ } | j ƒ  j d
 | ƒ d } | j ƒ  } | j d | d | d |	 j d | ƒ r�| j d d ƒ d }  t d | d | ƒ \ }! }" | j d | d | ƒ }# d  }$ t  d | d | d | d | ƒ }% | j ƒ  }& t! d |  d | j ƒ  d | j ƒ  d |% j" d |% j# d |# ƒ }' | j$ |' ƒ t% j& d | d | d | d |
 ƒ }( |( d  k	 r't |( ƒ d k r'g  }) x± t' |( ƒ D]£ \ }* }+ |* t |( ƒ d k r_t( j) ƒ  }, xD |+ d D] }- |, j$ | |- ƒ qAWn t( j) | |+ d d g ƒ }, t  d |, d | d | d | ƒ }. |) j$ |. ƒ qWt* j+ d | d | d d  ƒ }/ |/ d  k r9| d 7} d }0 |
 d |  IJt, d  |% d! |) d" |( d# | d$ |$ d% |& d& d  d' d  ƒ \ }& }$ n| d 7} d }0 |	 j- s£|	 j. r?t, d  |% d! |) d" |( d# | d$ |$ d% |& d& d  d' |	 j, ƒ \ }& }$ q?nœ x™ |/ D]‘ \ }1 }2 |0 d 7}0 |	 j. rt, d  |% d! |) d" |( d# |2 d$ |$ d% |& d& |1 j/ d' |	 j, ƒ \ }& }$ qª|% j0 d |2 ƒ rª|1 j/ }$ |2 j ƒ  }& qªqªW| j ƒ  j d
 |& ƒ t( j1 t( j2 | |& j3 ƒ  ƒ ƒ } |	 j4 s•| j5 | |& ƒ } q'| j5 | |& ƒ }3 | j6 |3 j |! ƒ |! |" ƒ }4 |% j0 d |4 ƒ r'| j5 | |4 ƒ } | j ƒ  j d
 |4 ƒ t( j1 t( j2 | |4 j3 ƒ  ƒ ƒ } q'n  t7 |% j8 |% j" ƒ d( k ršt7 |% j9 |% j# ƒ d( k rš|
 | |  |# |% j" |% j# |% j8 |% j9 |$ |0 | f	 IJqšq�qNqNWqWqû Wqè W| j: | ƒ | S()   Ns8                   |--------START--------| |-----FINAL----|sO        residue   map_cc 2mFo-DFc mFo-DFc 2mFo-DFc mFo-DFc rotamer n_rot max_moveds2     %12s%7.4f %8.2f %7.2f %8.2f %7.2f %7s %5d  %8.3fR&   R'   R(   i    i   t   common_amino_acidRÅ   RN   RO   RP   RQ   t   suppress_segidiôÿÿÿR   R8   R   R‰   RŠ   R‹   R   R   R   R   t   mon_lib_srvt   remove_clusters_with_all_hRn   t   atom_selection_bools-   No rotamers for: %s. Use torsion grid search.R+   R²   R³   R´   Rµ   R¶   R¸   R·   g{®Gáz„?(;   t   mmtbxt   monomer_libraryt   serverR!   R"   R#   R&   R    R-   R
   t   pdbt   common_residue_names_get_classR   t   modelst   chainst   residue_groupst
   conformerst   ignore_alt_conformersR¯   t   only_residuet   resnameRH   t   extract_i_seqR3   t   set_xyzRš   RV   t   poor_cc_thresholdt   id_strR    R<   R   Rˆ   R   R�   R’   R¡   R   t   axes_and_atoms_aa_specifict	   enumerateR   RL   R   t   get_rotamer_iteratorR¬   t   use_rotamer_iteratort   torsion_grid_searcht   idR™   t   maxt   sqrtt   dott   real_space_refine_rotamert   set_selectedR~   R”   R‘   R“   t   set_sites_cart(5   R`   t   xray_structureR   R'   R(   t   residual_map_dataRÊ   t   rsr_managert   optimize_hdR·   Rn   t   fmt1t   fmt2t   fmt3R&   t   map_selectort	   get_classt   n_other_residuest   n_amino_acids_ignoredt   n_amino_acids_scoredR‰   RR   t   modelt   chainRN   RÕ   t	   conformerRO   R8   R�   t   max_moved_distt   sites_cart_residue_startR   R{   R|   t   cc_startRµ   t   revR¶   t   rmR³   t   rev_first_atomst   i_aaR¾   t   sites_aat   aa_t   rev_it   rotamer_iteratort
   n_rotamerst   rotamerR´   t   tmpt   sites_cart_refined(    (    sK   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/refinement/fit_rotamers.pyt   residue_iteration{  s.   

	
 														

		
				#g      ð?i   c   	      C   sº   | ro t  j d |  d | d d d d g d d d	 t d
 t d t d t j d t d | ƒ 
} | j } | j } nA |  j ƒ  } | j d | d | d | ƒ } | j	 ƒ  | j
 ƒ  } | | f S(   Nt   fmodelt   map_typet
   kick_sizesg        g333333Ó?g      à?t   number_of_kicksi2   t   real_mapt   real_map_unpaddedt   update_bulk_solvent_and_scalet   symmetry_flagst   average_mapst   exclude_free_r_reflectionst   resolution_factort   use_all_data(   R   t   kick_mapRB   RG   R   t   use_space_group_symmetryt   map_datat   fft_mapt   electron_density_mapt   apply_sigma_scalingR  (	   R  R	  R  t   kickR  t   kmR  R  t   map_obj(    (    sK   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/refinement/fit_rotamers.pyt   get_map_data'  s(    				
c   #      C   sx  | d  k s! t | d ƒ s! t ‚ |  j } t d |  d d d t d | ƒ \ } } t d |  d d ƒ \ } }	 t d |  d d d t d | ƒ \ }
 } t d	 | j ƒ  d
 | d | ƒ } | j ƒ  | j	 ƒ  } | j
 ƒ  } | j ƒ  } | d IJd } d } d } | | IJ| | IJt j j } x
| D]} | j d d !} | d | ƒ d k r%| j | j ƒ } t | | | ƒ } t | | |
 ƒ } | j d | d | j ƒ } d } t | ƒ d k  rÂd } n  t | j ƒ d k  rãd | _ n  | j d k  o
| d k  o
| | j k  } | j d k o@| d k  o@t | ƒ t | j ƒ k } | j d k  o�| d k  o�t | j ƒ d k o�d t | j ƒ t | ƒ k  } | j d k  oÞ| d k  oÞt | j ƒ d k oÞd t | j ƒ t | ƒ k  } t | j ƒ d k  oÿ| d k  } | j | k o/t | j ƒ d k  o/| d k  }  | p;| }! | | j k  s\| | j k  rƒ|! sz| sz| sz|  sz| rƒd } n? | d  k	 rÂ| d  | j d! | j d | ƒ }" |" rÂd } qÂn  | | | j | j | j | j | | | f I| IJt | ƒ d k r'| j | j | j	 ƒ } q'q%q%W| j | ƒ |  j d" | d# t d$ t ƒ | d% |  j ƒ  |  j ƒ  f IJd  S(&   Nt   __call__R  R	  s   2mFo-DFcR  R  t   Fcs   mFo-DFcR&   R'   R(   s	   Validate:s@                   |--------START--------|  |--------FINAL--------|s@        residue    map_cc 2mFo-DFc mFo-DFc  map_cc 2mFo-DFc mFo-DFcs*     %12s %7.4f %8.2f %7.2f %7.4f %8.2f %7.2fi   i   t   nameRÈ   R   R8   t    g       @g        i    i   i   i   g      à?g      Às    <<<t   res_typet   i_seqsRé   t   update_f_calct   update_f_masks   r_work=%6.4f r_free=%6.4f(    R   t   hasattrR"   Ré   R  RB   R    R&   R-   R   Rš   R
   RÐ   RÑ   R   R3   R   R…   R<   R”   R   R   R   R   R   R¯   Rç   Rè   t   update_xray_structureRG   t   r_workt   r_free(#   R  R   t   validate_methodRn   R  Ré   R'   t	   fft_map_1R(   t	   fft_map_2Rê   t	   fft_map_3Rð   R   t   sites_cart_resultR&   Rí   Rî   Rï   Rñ   Rü   t   residue_nameR�   RŒ   R�   R   t   flagt   dmif1t   dmif2t   dmif4t   dmif41t   dmif5t   dmif6t   dmifRS   (    (    sK   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/refinement/fit_rotamers.pyt   validate_changes?  s€    !		



 	 *6OO!0				.c         C   sŠ  | d  k r t j } n  | d  k r6 t ƒ  j ƒ  } n  t j d d d | ƒ t j j	 j	 ƒ  } | j
 r§ t j |  j j ƒ  j ƒ  t ƒ } | j | ƒ } | j | ƒ n  t j j d | d t ƒ }	 t j j d |	 d |  j d | ƒ }
 |
 j ƒ  } | j r|
 j ƒ  } n! t j |
 j j ƒ  j ƒ  t ƒ } | | M} d	 } | | d
 |  j ƒ  |  j ƒ  f IJx$t d | j d ƒ D]} t d |  d | j d t d | j  ƒ \ } } t d |  d | j! ƒ \ } } t d |  d | j" d t d | j  ƒ \ } } | j# d  k	 r0t j$ | ƒ | j# k  } | j% | d
 ƒ } n  | j& d  k	 rlt j$ | ƒ | j& k  } | j% | d
 ƒ } n  t' d | d | d | d | j( j) d |  j* ƒ  j+ ƒ  d d | j( j, ƒ } t( d | d |  j d | d | d | d | d | d | d | d | j( d | ƒ } |  j- d t d  t ƒ | d! I| | |  j ƒ  |  j ƒ  f IJ~ ~ ~ ~ ~ ~ | j. rvt/ d |  d" | d# d  d | ƒ qvqvWd  S($   Nt   texts   Fitting sidechainst   outt   geometryt   normalizationt   restraints_managerRé   R`   s*   Macro-cycle %2d: r_work=%6.4f r_free=%6.4fi    i   R  R	  R  R  R\   R_   R]   R^   i   RX   R   R'   R(   Rê   RÊ   Rë   Rì   R·   Rn   R$  R%  s   1:R   R*  (0   R   t   syst   stdoutR   Rq   R   t   make_sub_headerRÍ   RÎ   RÏ   t   use_dihedral_restraintsR   R�   Ré   t
   scatterersR1   RG   R3   t   remove_dihedrals_in_placet
   restraintst   managerRõ   t   backbone_selectionst!   ignore_water_when_move_sidechainst   solvent_selectionR(  R)  t   ranget   number_of_macro_cyclesR  R\   RB   R  t	   model_mapt   residual_mapt   filter_residual_map_valueR”   Rç   t   filter_2fofc_mapRW   R  t   real_space_refine_target_weightt   f_obsRl   t    real_space_refine_max_iterationsR'  t   validate_changeR8  (   R  R_   R`   RH  Rì   Rn   R·   RÊ   t   selR=  Rõ   RF  R   t   fmtt   macro_cycleR'   R+  R(   R,  Rê   R-  t   map_selRë   R   (    (    sK   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/refinement/fit_rotamers.pyt   run‚  s„      	!				!
#			)	g      Ð?(0   t
   __future__R    t   mmtbx.refinementR   t   cctbx.array_familyR   t   libtbxR   t   mmtbx.command_lineR   t   cctbxR   t   scitbx.lbfgsRa   t	   iotbx.pdbR
   t   mmtbx.monomer_libraryRÍ   t   mmtbx.modelR   R>  t   mmtbx.monomer_library.servert
   iotbx.philt   scitbx.matrixR   t   mmtbx.utilsR   R   t   local_fix_params_strR   R   R   t   objectR   R    RW   R…   R‡   Rˆ   R    R¦   R   RB   R¬   R  R  R8  RW  (    (    (    sK   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/refinement/fit_rotamers.pyt   <module>   sR   %		.7		
*			L	¬F