ó
Ì™xTc           @   s±  d  Z  d d l m Z d d l m 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
 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 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 m Z d d l m Z d d l Z d d l Z d d l  Z  d a! d „  Z" d e# f d „  ƒ  YZ$ d e# f d „  ƒ  YZ% d e# f d „  ƒ  YZ& d S(   sé   
Module for managing and manipulating all properties (and underlying objects)
associated with an atomic (or pseudo-atomic) model, including both basic
attributes stored in a PDB file, scattering information, and geometry
restraints.
iÿÿÿÿ(   t   division(   t   flexN(   t   approx_equal(   t   math(   t   xray(   t   adptbx(   t   pdb(   t   geometry_restraints(   t   Sorryt   user_plus_sys_time(   t   adp_restraints(   t   ias(   t   utils(   t   model_statistics(   t
   group_args(   t   easy_rung        c   	   
   C   sñ   t  j j } t  j j } d  } xÌ |  j ƒ  D]¾ } xµ | j ƒ  D]§ } xž | j ƒ  D]� } x‡ | j ƒ  D]y } | d | j	 ƒ d k rd y | d d d | j
 ƒ } Wn t t f k
 r· n" X| d  k sÐ | | k  rÙ | } n  Pqd qd WqQ Wq> Wq+ W| S(   Nt   namet   common_watert   widthi   t   s(   t   iotbxR   t   common_residue_names_get_classt
   hy36decodet   Nonet   modelst   chainst   residue_groupst   atom_groupst   resnamet   resseqt   RuntimeErrort
   ValueError(	   t   pdb_hierarchyt	   get_classR   t   resultt   modelt   chaint   rgt   agt   i(    (    s9   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/model.pyt   find_common_water_resseq_max#   s       	t   xh_connectivity_tablec           B   s   e  Z d  „  Z RS(   c         C   s�  | j  j d | j ƒ  ƒ j j } | j ƒ  } g  |  _ xS| D]K} | j \ } } d \ } }	 | | j	 ƒ  d k ró | }	 | } | | j
 }
 | |	 j
 } t j | ƒ t j |
 ƒ } | j ƒ  j |
 | ƒ } |  j j | |	 | | j | g ƒ n  | | j	 ƒ  d k r= | }	 | } | | j
 }
 | |	 j
 } t j | ƒ t j |
 ƒ } | j ƒ  j |
 | ƒ } |  j j | |	 | | j | g ƒ q= q= Wd  S(   Nt
   sites_cartt   Ht   D(   NN(   R+   R,   (   R+   R,   (   t   geometryt   pair_proxiesR*   t   bond_proxiest   simplet
   scattererst   tablet   i_seqsR   t   element_symbolt   siteR   t   doublet	   unit_cellt   distancet   appendt   distance_ideal(   t   selfR-   t   xray_structuret   bond_proxies_simpleR1   t   proxyt   i_seqt   j_seqt   i_xt   i_ht   site_xt   site_ht
   const_vectt   distance_model(    (    s9   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/model.pyt   __init__6   s2    	(   t   __name__t
   __module__RG   (    (    (    s9   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/model.pyR)   4   s   t   xh_connectivity_table2c           B   s   e  Z d  „  Z RS(   c         C   s§  | j  j d | j ƒ  ƒ j j } | j ƒ  } i  |  _ x| D]} | j \ } } d \ } }	 | | j	 ƒ  j
 ƒ  d k r‰ | }	 | } n  | | j	 ƒ  j
 ƒ  d k r´ | }	 | } n  | |	 g j d  ƒ d k r= | | j }
 | |	 j } t j | ƒ t j |
 ƒ } | j ƒ  j |
 | ƒ } |  j j |	 g  ƒ j | |	 | | j | g ƒ q= q= WxN| j  j D]@} | j \ } } } | | j	 ƒ  j
 ƒ  | | j	 ƒ  j
 ƒ  | | j	 ƒ  j
 ƒ  g } t j ƒ  } g  } d  } | j d ƒ d k  r_| j d ƒ d k  r_xb | j D]W } | | } | j | j ƒ | j j ƒ  j
 ƒ  } | j | ƒ | d	 k r| } qqWd | k rŸ| j | d ƒ rŸ|  j j | ƒ j | j ƒ qŸq_q_Wd  S(
   NR*   R+   R,   i    i   (   NN(   R+   R,   (   R+   R,   (   R+   R,   (   R-   R.   R*   R/   R0   R1   R2   R3   R   R4   t   uppert   countR5   R   R6   R7   R8   t
   setdefaultR9   R:   t   angle_proxiest	   occupancyt   scattering_typet   stript   all_eq(   R;   R-   R<   R=   R1   R>   R?   R@   RA   RB   RC   RD   RE   RF   t   pt   kt   lt   mt   elst   ot   ht   ihR'   R   t   sct(    (    s9   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/model.pyRG   R   sL    			*
  (   RH   RI   RG   (    (    (    s9   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/model.pyRJ   Q   s   t   managerc           B   s  e  Z d  Z dE dE dE dE dE dE dE dE dE dE dE d „ Z e d „ Z d „  Z d „  Z d „  Z	 d d „ Z
 d „  Z d	 „  Z d
 „  Z d „  Z d „  Z d „  Z d „  Z d d „ Z e d d „ Z dE e e d „ Z d „  Z d „  Z d e d d „ Z d „  Z e d „ Z d „  Z d „  Z d d dE e e e e e e e e d d d  „ Z d! „  Z d" „  Z d# „  Z  dE dE dE e d$ „ Z! d% „  Z" dE e d d& „ Z# d' d( „ Z$ d) d* „ Z% dE dE e dE e d+ „ Z& e d, „ Z' d- „  Z( d. „  Z) d/ „  Z* dE dE dE d0 d1 „ Z+ d2 „  Z, dE d d3 „ Z- dE dE dE e d4 „ Z. d5 d6 d7 e dE d8 „ Z/ dE dE dE d d7 e d9 „ Z0 dE d e d: „ Z1 dE dE dE dE e dE d; „ Z2 d< „  Z3 e e dE d= „ Z4 d dE e e dE d> „ Z5 d? „  Z6 d e e dE d@ „ Z7 dA „  Z8 dE dB „ Z9 dE dE dC „ Z: e; j< dD „ Z= RS(F   s�   
  Wrapper class for storing and manipulating an iotbx.pdb.hierarchy object and
  a cctbx.xray.structure object, plus optional restraints-related objects.
  c         C   s8  | |  _  | |  _ | |  _ | |  _ | |  _ | |  _ |  j j ƒ  |  _ | |  _ |  j j	 ƒ  |  _
 |  j
 j ƒ  | |  _ |
 |  _ | |  _ | d  k	 r² t | ƒ d k r² d  } n  | |  _ |	 |  _ | |  _ t |  _ d  |  _ g  |  _ |  j j ƒ  j t ƒ d k r!t j d |  j ƒ |  _ n  d  |  _ |  j ƒ  d  S(   Ni    t	   hierarchy(   t   logt   processed_pdb_files_srvt   reference_sites_cartt   selection_movingt   restraints_managerR<   t   deep_copy_scattererst   xray_structure_initialt   _pdb_hierarchyt   atomst	   pdb_atomst   reset_i_seqt   refinement_flagst   wilson_bt
   tls_groupsR   t   lent   anomalous_scatterer_groupst   ias_managert   ias_xray_structuret   Falset   use_iast   ias_selectiont   exchangable_hd_groupst   hd_selectionRL   t   TrueR   t   combine_hd_exchangablet   original_xh_lengthst&   sync_pdb_hierarchy_with_xray_structure(   R;   R<   R    R_   R`   Rb   Ro   Ri   Ra   Rn   Rj   Rk   Rm   R^   (    (    s9   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/model.pyRG   ~   s6    																			c         C   s&   | r |  j  j d |  j ƒ n  |  j  S(   s[  
    Accessor for the underlying PDB hierarchy, incorporating optional update of
    properties from the xray_structure attribute.

    :param sync_with_xray_structure: update all properties of the atoms in the
      hierarchy to agree with the xray_structure scatterers.  Will fail if the
      scatterer labels do not match the atom labels.
    R<   (   Re   t   adopt_xray_structureR<   (   R;   t   sync_with_xray_structure(    (    s9   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/model.pyR    ¨   s    	c         C   s9   |  j  j d |  j ƒ |  j  j ƒ  |  _ |  j j ƒ  d  S(   NR<   (   Re   Ry   R<   Rf   Rg   Rh   (   R;   (    (    s9   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/model.pyRx   ¶   s    c         C   s›   d  } |  j d  k	 r— |  j j ƒ  j t ƒ d k r— |  j } |  j rv |  j j t ƒ d k rv |  j j |  j ƒ } n  t d |  j d | ƒ j	 } q— n  | S(   Ni    R-   R<   (
   R   Rb   R<   Rt   RL   Ru   Rr   t   selectR)   R2   (   R;   R"   R<   (    (    s9   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/model.pyR)   »   s    	!	c         C   s›   d  } |  j d  k	 r— |  j j ƒ  j t ƒ d k r— |  j } |  j rv |  j j t ƒ d k rv |  j j |  j ƒ } n  t d |  j d | ƒ j	 } q— n  | S(   Ni    R-   R<   (
   R   Rb   R<   Rt   RL   Ru   Rr   R{   RJ   R2   (   R;   R"   R<   (    (    s9   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/model.pyRJ   Ç   s    	!	gš™™™™™ñ?c         C   s  |  j  d  k r d  S|  j j ƒ  j t ƒ d k r5 d  S|  j d  k sJ t ‚ g  } |  j ƒ  } | d  k rl d  St	 j
 ƒ  |  _ x | D] } | j | d ƒ q‚ Wxy |  j  j j D]h } x_ t | j ƒ  ƒ D]K \ } } | | k rÆ |  j j | j ƒ  | j ƒ | | j ƒ  | _ qÆ qÆ Wq­ Wd  S(   Ni    i   (   Rb   R   R<   Rt   RL   Ru   Rw   t   AssertionErrorR)   R   R6   R9   R-   t   bond_params_tablet	   enumeratet   keyst   valuesR:   (   R;   t   valuet   h_i_seqst   xhctt   xhctit   bpR'   RT   (    (    s9   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/model.pyt   extend_xh_bondsÓ   s"       c         C   s!  |  j  d  k r d  S|  j j ƒ  j t ƒ d k r5 d  S|  j d  k	 sJ t ‚ |  j ƒ  } | d  k rf d  Sg  } x | D] } | j	 | d ƒ qs Wd } xm |  j  j
 j D]\ } xS t | j ƒ  ƒ D]? \ } } | | k r½ |  j | | j ƒ  | _ | d 7} q½ q½ Wq¤ Wd  |  _ |  j d t ƒ d  S(   Ni    i   t   show(   Rb   R   R<   Rt   RL   Ru   Rw   R|   R)   R9   R-   R}   R~   R   R€   R:   t
   idealize_hRp   (   R;   Rƒ   R‚   R„   t   counterR…   R'   RT   (    (    s9   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/model.pyt   restore_xh_bondsã   s&       	c         C   sž   |  j  d  k r t d ƒ ‚ n  t j |  j j ƒ  j ƒ  t ƒ } |  j  j	 j
 d |  j j ƒ  ƒ j j } x1 | D]) } | j \ } } t | | <t | | <qm W| S(   Ns,   Geometry restraints manager must be defined.R*   (   Rb   R   R   R   t   boolR<   R1   t   sizeRu   R-   R.   R*   R/   R0   R3   Rp   (   R;   t	   selectionR=   R>   R?   R@   (    (    s9   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/model.pyt   isolated_atoms_selectionõ   s    !
c         C   s¹   |  j  d k r d S|  j j ƒ  } | j t ƒ d k rµ |  j ƒ  } |  j j ƒ  } xD |  j ƒ  D]6 } | d | d } } t j	 | | ƒ d | | <q_ W|  j j
 d | d | ƒ n  d S(   s©   
    Set the isotropic B-factor for all hydrogens to those of the associated
    heavy atoms (using the total isotropic equivalent) times a scale factor of
    1.2.
    Ni    i   g333333ó?R€   R�   (   Rb   R   R<   Rt   RL   Ru   R)   t   extract_u_iso_or_u_equivR   t   u_as_bt	   set_b_iso(   R;   t   hd_selt   xh_conn_tablet   bfit   tRA   RB   (    (    s9   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/model.pyt   reset_adp_for_hydrogens  s     c         C   s…  t  j ƒ  } |  j j d k	 rV x5 |  j j D]$ } x | D] } | j | ƒ q8 Wq+ Wn  |  j d k ri d S|  j j ƒ  } |  j j	 ƒ  } | j
 t ƒ d k r�|  j ƒ  } |  j j	 ƒ  j ƒ  } |  j ƒ  } x| j ƒ  D]ö }	 |	 d d |	 d d }
 } | | j ƒ  d k st ‚ | |
 j ƒ  d k r¾| | k r¾t  j ƒ  } x† |	 D]m } t | ƒ d k r©x. | D]& } | | k ri| j | | ƒ qiqiWt  j | ƒ | | <qJ| |
 | | <qJWqÖ | |
 | | <qÖ W|  j j d k	 rex€ |  j j D]o } d } x` | D]X } x% | D] } | | s| | } qqWx' | D] } | d k	 r7| | | <q7q7WqWqïWn  |  j j	 ƒ  j | | ƒ n  d S(	   sJ   
    Set hydrogen occupancies to those of the associated heavy atoms.
    Ni    i   R+   R,   t   Ni   (   R+   R,   (   R   t   size_tRi   t   s_occupanciesR   t   extendRb   R<   Rt   R1   RL   Ru   R)   t   extract_occupanciesRJ   R€   R4   R|   R6   Rl   R9   t   mint   set_occupancies(   R;   t"   occupancy_refinement_selections_1dt   occselt   occsel_R’   R1   R“   t   qit   ctt   t_RA   RB   t   occR•   R'   t   rf1RX   t   rf2t   rf_(    (    s9   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/model.pyt   reset_occupancies_for_hydrogens  sL     
c         C   s§   t  |  j ƒ d k r£ |  j j ƒ  } | j ƒ  } xp |  j D]b } | d d | d d } } | | | | k rˆ | | j | | _ q: | | j | | _ q: Wn  d  S(   Ni    i   (   Rl   Rs   R<   R1   R›   R5   (   R;   R1   R¤   t   gR'   t   j(    (    s9   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/model.pyt$   reset_coordinates_for_exchangable_hd=  s    c      	   C   s°   d d  l  } |  j d  k	 r* |  j j } n d d  l } | j j j ƒ  } | j j d |  j	 ƒ  d | d |  j
 d |  j ƒ } g  } x | D] } | j | d ƒ qˆ Wt j | ƒ S(   NiÿÿÿÿR    t   mon_lib_srvRb   R^   i   (   t   mmtbx.hydrogensR_   R   R¬   t   mmtbx.monomer_libraryt   monomer_libraryt   servert	   hydrogenst	   rotatableR    Rb   R^   Rš   R   R˜   (   R;   t   mmtbxR¬   t   rmh_selt   sel_iR   (    (    s9   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/model.pyt   rotatable_hd_selectionH  s    	 c         C   s¹   |  j  j ƒ  j ƒ  } t j | ƒ } |  j  j ƒ  } t j | j | ƒ ƒ } |  j ƒ  } t j | j | ƒ ƒ } t d | j	 t
 ƒ d | d | | d d | j ƒ  d | d | | d ƒ S(   Nt   h_countt	   h_occ_sumt   h_fraction_of_totalg      Y@t
   hrot_countt   hrot_occ_sumt   hrot_fraction_of_total(   R<   R1   R›   R   t   sumRt   R{   R¶   R   RL   Ru   RŒ   (   R;   t   occupanciest   occ_sumRt   R¸   t   sel_rotR»   (    (    s9   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/model.pyt   h_countsX  s    t    c         C   s¬   |  j  ƒ  } |  j d | IJ|  j d | | j f IJ|  j d | | j d | j f IJ|  j d | IJ|  j d | | j f IJ|  j d | | j d | j f IJd  S(   Ns   %sTotal:s   %s  count: %ds2   %s  occupancy sum: %6.2f (%s of total atoms %6.2f)t   %s   %sRotatable:(   RÁ   R^   R·   R¸   R¹   Rº   R»   R¼   (   R;   t   prefixt   hc(    (    s9   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/model.pyt   show_h_countsg  s    

g      ð?c            s  |  j  } |  j j ƒ  } d t t j d d ƒ ƒ } t | d ƒ } | j | j | ƒ j	 d t
 ƒ ƒ | j ƒ  | rƒ d | } n
 d | } t j | ƒ } t j | ƒ t j j d d  d	 | j ƒ j ƒ  }	 t j j ‰  d
 d d g ‰ d „  }
 d „  } ‡  ‡ f d †  } xÓ|	 j ƒ  D]Å} x¼| j ƒ  D]®} x¥| j ƒ  D]—} xŽ| j ƒ  D]€} | | ƒ sjqRn  |
 d | ƒ } xV| j ƒ  D]H} x?| j ƒ  D]1} x(| j ƒ  D]} x| j ƒ  D]} | | ƒ s×q¿n  |
 d | ƒ } | j ƒ  | j ƒ  k r¿| | | ƒ d k  r¿x¬ | j ƒ  D]› } | j ƒ  r | j j ƒ  d } xs | j ƒ  D]b } | j j ƒ  d } | j ƒ  rR| | k rR| | j  | j  ƒ | k r´| j! | j  ƒ q´qRqRWq q Wq¿q¿Wq¬Wq™Wq†WqRWq?Wq,WqW|  j j" | j ƒ  j# ƒ  ƒ | |  _  d  S(   Ns   %si   i@B t   wt
   append_ends(   phenix.reduce -quiet -allalt -NUClear %ss   phenix.reduce -quiet -allalt %st   source_infot   linesR   t   common_amino_acidt   common_rna_dnac         S   sL   t  j ƒ  } x3 |  j ƒ  D]% } | j ƒ  s | j | j ƒ q q W| j ƒ  S(   N(   R   t   vec3_doubleRf   t   element_is_hydrogenR9   t   xyzt   mean(   t   residueR*   t   atom(    (    s9   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/model.pyt   cm_from_residue_non_hd‚  s
    c         S   sE   t  j |  d | d d |  d | d d |  d | d d ƒ S(   Ni    i   i   (   R   t   sqrt(   t   r1t   r2(    (    s9   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/model.pyt   distˆ  s    c            s   ˆ  d |  j  ƒ ˆ k S(   NR   (   R   (   RÑ   (   R!   t	   supported(    s9   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/model.pyt   is_supportedŠ  s    RÑ   gü©ñÒMbP?($   Re   R<   Rt   t   strt   randomt   randintt   opent   writeR{   t   as_pdb_stringRu   t   closeR   t   fully_bufferedt   ost   removeR   R   t   inputR   t   stdout_linest   construct_hierarchyR   R   R   t
   conformerst   residuest   id_strRf   RÎ   R   RQ   RÏ   t   set_xyzt   set_sites_cartt   extract_xyz(   R;   t   nucleart   deviation_thresholdR    Rt   t   fnt   fot   cmdt   rt   phRÓ   R×   RÙ   t   model1t   chain1t
   conformer1t   residue1t   cm1t   model2t   chain2t
   conformer2t   residue2t   cm2t   a1t   n1t   a2t   n2(    (   R!   RØ   s9   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/model.pyt!   rebuild_bad_hydrogens_with_reducer  sX    	#
 
		  Dc         C   s3  |  j  d | ƒ |  j d k r# d S|  j j ƒ  j t ƒ d k r/|  j j ƒ  } | d k	 re | } n  | j t ƒ d k r~ d S| } |  j ƒ  j | t	 ƒ } | j
 ƒ  j |  j ƒ  t	 ƒ } |  j d k	 rá | j |  j t	 ƒ n  |  j j ƒ  j | ƒ } t j ƒ  }	 | j t ƒ d k rd SxD |  j ƒ  D]6 }
 | |
 d r+|	 j t |
 d |
 d ƒ ƒ q+q+W| r—|  j d t j |	 ƒ t j |	 ƒ f IJn  xÇ | t	 f | t f g d D]© } | d j t ƒ d k r´| d } |  j d k	 r|  j j t ƒ d k r| j |  j ƒ } n  |  j d	 | d
 t d | d d t d t d t d t d t ƒ } q´q´W|  j j ƒ  j | ƒ } t t j | j ƒ  | j ƒ  ƒ d ƒ s§t ‚ t j ƒ  }	 xD |  j ƒ  D]6 }
 | |
 d rÀ|	 j t |
 d |
 d ƒ ƒ qÀqÀW| r/|  j d t j |	 ƒ t j |	 ƒ f IJq/n  d S(   sA   
    Perform geometry regularization on hydrogen atoms only.
    Rí   Ni    i   iÿÿÿÿiþÿÿÿsK   X-H deviation from ideal before regularization (bond): mean=%6.3f max=%6.3fi   R�   t   bondt	   nonbondedt   anglet   dihedralt	   chiralityt	   planarityt   parallelitysK   X-H deviation from ideal after  regularization (bond): mean=%6.3f max=%6.3f(   R  Rb   R   R<   Rt   RL   Ru   t   solvent_selectiont   set_selectedRp   t	   deep_copyRr   R*   R{   R   R6   R)   R9   t   absR^   RÐ   t   maxt   geometry_minimizationR   t	   as_doubleR|   (   R;   R�   R‡   Rí   Rt   t   not_hd_selectiont   sol_hdt   mac_hdt   sites_cart_mac_beforet   xhdR•   t   sel_pairt   selt
   min_resultt   sites_cart_mac_after(    (    s9   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/model.pyRˆ   ¥  sd      	  &"#
'	
&c         C   sG  g  } |  j  ƒ  } t j j } x"|  j j ƒ  D]} x| j ƒ  D]ú} xñ| j ƒ  D]ã} d  } d  } xÐ | j	 ƒ  D]Â }	 d |	 j
 | j | j f }
 | d |	 j
 ƒ d k rõ x… |	 j ƒ  D]4 } | j } | | sÙ t ‚ | d  k rº | } qº qº Wqs x= |	 j ƒ  D]/ } | | j st ‚ | d  k r| } qqWqs W| d  k	 rT | d  k	 r|t d d | j ƒ  d | j ƒ  ƒ ‚ n  | j | ƒ x« | D]  } | j ƒ  j ƒ  } d } x3 | D]+ } | j ƒ  j ƒ  d k rµ| d	 7} qµqµW| d k r�|  j Jx' | j ƒ  D] } |  j | j ƒ  IJqWt d
 ƒ ‚ q�q�WqT qT WqA Wq. W| S(   Ns	   %3s%4s%1sR   R   s/   residue_group with mix of water and non-water:
s     %s
s     %si    t   Oi   s6   The above waters in input PDB file do not have O atom.(   R
  R   R   R   Re   R   R   R   R   R   R   R   t   icodeRf   R?   R|   R   t   quoteR9   t   extract_elementRQ   RK   R^   t   format_atom_recordR   (   R;   R"   t   solvent_selR!   R#   R$   R%   t   first_watert   first_otherR&   t
   residue_idRÒ   R?   Rò   t   elementst   o_foundt   et   a(    (    s9   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/model.pyt   extract_water_residue_groupsÚ  sL    	( c         C   sI   xB t  |  j ƒ  ƒ D]. \ } } t j d | d ƒ | _ d | _ q Wd  S(   NR�   i   t    (   R~   R'  R   t   resseq_encodeR   R  (   R;   R'   R%   (    (    s9   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/model.pyt   renumber_water  s    R+   g{®Gáz„?c      	      s  g  } |  j  ‰ | r d } n  ˆ j ƒ  j ‰ ˆ j ƒ  ‰ ˆ j ƒ  ‰ g  ‰ ˆ j ƒ  g ‰ ‡  ‡ ‡ ‡ ‡ ‡ ‡ ‡ f d †  } |  j ƒ  } | j ƒ  xî| D]æ} | j ƒ  d k rÆ t	 d d ƒ ‚ n  | j
 ƒ  ‰  ˆ  j ƒ  } t }	 |  j  j d d ƒ }
 xQ | D]I } | j j ƒ  d k r |
 j d	 | j ƒ j ƒ  } | sIt }	 PqIq q W|	 s› | j ƒ  d
 k rd  } d  } x2 | D]* } | j j ƒ  d k rœ| } qx| } qxW| | g j d  ƒ d k sÇt ‚ | j j ƒ  } t | ƒ d k rõd | } nï t | ƒ d
 k rÞ| d j ƒ  rnt | d ƒ d k r>d | d } qÛt | d ƒ d
 k red | d } qÛt ‚ qä| d j ƒ  rÕt | d ƒ d k r¥d | d } qÛt | d ƒ d
 k rÌd | d } qÛt ‚ qät ‚ n t ‚ | d | d | g d | j ƒ q�| j ƒ  d k r�| d } | j j ƒ  d k s=t ‚ | d | d g  d d g D] } d | | d ^ qVd | ƒ q�q› q› W| r˜ˆ j ƒ  n  |  j d It ˆ ƒ IJt ˆ ƒ d k rÇd  S|  j d  k	 rø|  j j d ˆ d t d | ƒ n  |  j  ƒ  |  j! ƒ  d  S(   NR,   c            sâ  |  j  } | ˆ d k  s t ‚ | ˆ d <ˆ | } t } x¢t | ƒ D]”\ } } |  j ƒ  } | | _ | r¥ g  t | d ƒ D] \ }	 }
 |	 |
 ^ q} | _ t } n5 g  t | d ƒ D] \ }	 }
 |	 |
 ^ qµ | _ t } d | _	 ˆ | _
 d | _ t j ˆ | ƒ | _ d | _ d | _ t j j j ƒ  r;d | _ n  d | j ƒ  | _ ˆ  j d | ƒ t j d | j ƒ  d | j j ƒ  d	 ˆ | j ƒ d
 t j | j ƒ d | j
 ƒ } ˆ j d | d | | d ƒ ˆ j | ƒ qF Wd  S(   Ni    i   gü©ñÒMbP?iÿÿÿÿs   %2sRÒ   t   labelRP   R5   t   uRO   t	   scatterert   insert_at_index(   i   gü©ñÒMbP?i    (   iÿÿÿÿi    i    (   i    i    i    (   iÿÿÿÿiÿÿÿÿiÿÿÿÿiÿÿÿÿiÿÿÿÿiÿÿÿÿ(   iÿÿÿÿiÿÿÿÿiÿÿÿÿiÿÿÿÿiÿÿÿÿiÿÿÿÿ(   R?   R|   Ru   R~   t   detached_copyR   t   zipRÏ   Rp   t   sigxyzR¤   t   sigoccR   R�   t   bt   sigbt   uijR   R]   RÒ   t
   has_siguijt   siguijRQ   t   elementt   append_atomR   R-  Ré   t   b_as_ut   add_scattererR9   (   RÒ   t
   atom_namesR8  R?   RÏ   t   signR'   t	   atom_nameRY   R&  R3  R-  (   R&   t   fract   last_insert_i_seqt   next_to_i_seqsRO   R*   t   u_isost   xs(    s9   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/model.pyt   insert_atoms  sB    	

	/	/							i   s/   Not implemented: cannot add hydrogens to water s&   molecules with alternate conformationst   min_distance_sym_equivg      @R  t	   site_carti   i    s    %s1 s    %s2 RÒ   R<  R8  t   1t   2R(  s   Number of H added:RA  t   sites_individualR™   ("   R<   R7   t   fractionalizeR*   R�   RŒ   R'  t   reverset   atom_groups_sizeR   t   only_atom_groupRf   Rp   t   special_position_settingsR8  RQ   t   site_symmetryRÏ   t   is_point_group_1Ru   R   RL   R|   R   Rl   t   isdigitt   intR   t'   switch_to_neutron_scattering_dictionaryR^   Ri   t   addt#   reprocess_pdb_hierarchy_inefficientRˆ   (   R;   R8  t   neutronRO   R"   RD  t	   water_rgsR%   Rf   t   skipt   spsRÒ   t   sps_rt   o_atomt   h_atomt   h_nameR>  t   n(    (   R&   R?  R@  RA  RO   R*   RB  RC  s9   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/model.pyt   add_hydrogens	  sš    	 	$$
	 	
!  	  			
+ 

c         C   s]  t  j j d |  j ƒ g } | j |  j j ƒ  j ƒ  ƒ |  j j	 d k	 r— |  j j	 } d | j _ d | j _ d | j _ t | _ d |  j j	 j _ n  |  j j d | ƒ \ } } | j d t ƒ j ƒ  } | j j } | j j } |  j j ƒ  } t | ƒ t | ƒ k st ‚ xƒ t | | ƒ D]r \ }	 }
 |	 j j ƒ  |
 j j ƒ  k sOt ‚ |	 j j ƒ  |
 j j ƒ  k sst ‚ t |	 j |
 j d ƒ st ‚ qW| |  _ | |  _ |  j  j! d k	 rÈt" d ƒ ‚ n  |  j j# ƒ  j$ ƒ  j% ƒ  } d	 | k pød
 | k } | j& d t d |  j  j' j( d d d d d | ƒ } t) j* j+ d | d |  j  j, ƒ } | |  _  d S(   sb   
    Re-process PDB from scratch and create restraints.  Not recommended for
    general use.
    t   crystal_symmetryg      ð¿i áõg      ð?t   raw_recordst   show_summarygü©ñÒMbP?s8   Hydrogen building is not compatible with NCS refinement.R+   R,   t   show_energiest   plain_pairs_radiust   params_editst   params_removet   assume_hydrogens_all_missingR-   t   normalizationN(-   R   R   t   format_cryst1_recordR<   Rš   Re   Rß   t
   splitlinesR_   t   pdb_interpretation_paramsR   t   clash_guardt   nonbonded_distance_thresholdt'   max_number_of_distances_below_thresholdt)   max_fraction_of_distances_below_thresholdRu   t#   proceed_with_excessive_length_bondst   process_pdb_filesRp   Rc   t   all_chain_proxiesR    Rg   Rf   Rl   R|   R0  R   RQ   R8  R   RÏ   Rb   t
   ncs_groupsR   t   scattering_type_registryt   type_count_dictR   t   geometry_restraints_managerR-   Rd  R³   t
   restraintsR\   Rh  (   R;   Ra  t   pipt   processed_pdb_filet   pdb_inpt   new_xray_structuret   new_pdb_hierarchyt   new_pdb_atomst   old_pdb_atomsRþ   R   t	   sctr_keyst   has_hdR-   t   new_restraints_manager(    (    s9   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/model.pyRU  v  sL    		$$"			
c         C   s#  t  j j } t d d d d d g ƒ } t j ƒ  } x¿ |  j j ƒ  D]® } x¥ | j ƒ  D]— } xŽ | j	 ƒ  D]€ } xw | j
 ƒ  D]i } | d | j ƒ d k }	 xH | j ƒ  D]: }
 |	 r§ |
 j j ƒ  j ƒ  | k r§ | j |
 j ƒ q§ q§ Wq| Wqi WqV WqC W| rt j |  j j ƒ  j ƒ  | ƒ } n  | S(   Nt   CAt   CBt   CR  R—   R   RË   (   R   R   R   t   setR   R˜   Re   R   R   R   R   R   Rf   R   RQ   RK   R9   R?   R‹   R<   R1   RŒ   (   R;   R‹   R!   t   backbone_namesR"   R#   R$   R%   R&   t   is_common_amino_acidRÒ   (    (    s9   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/model.pyt   backbone_selections¦  s    '$c         C   s   t  j d |  j ƒ S(   NR]   (   R   Rv   Re   (   R;   (    (    s9   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/model.pyt   hd_group_selections·  s    c   	      C   sj  |  j  j ƒ  } |  j j } | d  k	 rfx<|  j ƒ  D]+} | d d | d d } } | | j ƒ  | | j ƒ  g } | j d ƒ d k r¡ | j d ƒ d k s§ t ‚ d  } d  } | | j	 | | j	 k  rÜ | } | } n | } | } | | | | g j t
 ƒ d k r4 t
 | | <t | | <| | | | g j t
 ƒ d k sHt ‚ | | j | | _ q4 q4 Wn  d  S(   Ni    i   R+   R,   (   R<   R1   Ri   t   adp_individual_isoR   R‰  R4   RL   R|   RO   Ru   Rp   t   u_iso(	   R;   R1   t   adp_flt   gselR'   Rª   t   element_symbolst   i_seq_max_qt   i_seq_min_q(    (    s9   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/model.pyt!   reset_adp_of_hd_sites_to_be_equalº  s&     0	#

)iô  i   i    c         C   s÷  | | d k s t  ‚ | | | | | |	 |
 g j t ƒ d k  sF t  ‚ d d l m } d d  l } | j j d | ƒ } t j	 j	 d | d | d | d	 | d
 | d |	 d |
 d | ƒ } x:t
 | ƒ D],} |  j j ƒ  } | j ƒ  } |  j d  k	 r!|  j j t ƒ d k r!| j |  j ƒ } n  | j j d t ƒ } | j d | d |  j j d | d | d | d | d | d | d |  j j ƒ  j ƒ  ƒ 	} |  j d  k	 rÖx= t |  j ƒ D]# \ } } | s¬| | | | <q¬q¬Wn | } |  j j d | ƒ qÃ W| S(   Ni    i   iÿÿÿÿ(   R  t   max_iterationsR  R  R  R  R  R  R	  t   generic_restraintst-   ignore_line_search_failed_step_at_lower_boundR*   Rv  t   geometry_restraints_flagst   lbfgs_termination_paramst   lbfgs_exception_handling_paramst   sites_cart_selectiont   rmsd_bonds_termination_cutofft   rmsd_angles_termination_cutofft   site_labels(   R|   RL   Rp   t   mmtbx.refinementR  t   scitbx.lbfgst   lbfgst   termination_parametersR   t   flagst   xrangeR<   R*   R  Rr   R   Ru   R{   t   exception_handling_parametersRb   R-   R1   t   extract_labelsR~   Rë   (   R;   t   max_number_of_iterationst   number_of_macro_cyclesR�   R  R  R  R  R  R  R	  R“  R™  Rš  R  t   scitbxR–  R•  R'   R*   t   sites_cart_origt   exception_handling_paramst	   minimizedR?   t   ias_s(    (    s9   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/model.pyR  Ñ  sP    		'		c         C   s%   t  j d |  j d |  j d |  j ƒ S(   NRb   R<   Rr   (   R   t   rms_b_iso_or_b_equiv_bondedRb   R<   Rr   (   R;   (    (    s9   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/model.pyR«    s    			c         C   sO   d  } |  j d  k	 rK |  j j d  k	 rK |  j j j d |  j j ƒ  ƒ } n  | S(   NR*   (   R   Rb   Rs  t   extract_ncs_groupsR<   R*   (   R;   R"   (    (    s9   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/model.pyR¬    s    c         C   s+   |  j  d t j |  j j ƒ  j ƒ  t ƒ ƒ S(   NR�   (   R{   R   R‹   R<   R1   RŒ   Ru   (   R;   (    (    s9   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/model.pyR    s    c         C   s‚  |  j  d k	 r5 |  j ƒ  | j d |  j d t ƒ n  |  j d IJd |  _ | s] t |  _ n  t	 j
 d |  j j d |  j d |  j d | d | d | d	 |  j ƒ |  _  |  j j ƒ  j ƒ  } | s³|  j  j |  _ |  j j ƒ  j ƒ  } t j | t ƒ } t j | t ƒ } t j |  j j ƒ  j ƒ  t ƒ |  _ |  j j | ƒ |  j j d
 |  j ƒ |  j d IJ|  j j ƒ  j d |  j ƒ |  j j d
 |  j ƒ |  j d k	 r³|  j j ƒ  |  _ t j |  j j ƒ  j ƒ  t ƒ }	 t j |  j j ƒ  j ƒ  t ƒ }
 g  } |  j j t ƒ } xK t d |  j j t ƒ d ƒ D]* } | j t j | | d g ƒ g ƒ q,W|  j j  d |	 d | d |
 d |
 d | ƒ |  j j! d k	 rÍ|  j j! j" |  j t ƒ |  j j! j" |  j t ƒ n  |  j j# d k	 rû|  j j# j" |  j t ƒ n  |  j j$ d k	 r)|  j j$ j" |  j t ƒ n  |  j j ƒ  j% ƒ  d k } |  j j& d | ƒ |  j j# d k	 r‚|  j j# j" | t ƒ n  |  j j$ d k	 r°|  j j$ j" | t ƒ q°q³n  |  j j ƒ  j ƒ  } g  } xu |  j j ƒ  D]d } | j' j( ƒ  } t) | ƒ d k  rd | } n  x  t) | ƒ d k  r4| d } qW| j | ƒ qÞWd g | } |  j* d |  j d | d | d d d d ƒ d S(   s6   
    Generate interatomic scatterer pseudo-atoms.
    R<   t   update_f_calcs   >>> Adding IAS..........R-   Rg   t   fmodelt   paramst	   file_nameR^   t   others2   Scattering dictionary for combined xray_structure:t   outi   RI  R™   RŠ  t   adp_individual_anisot   size_allt   IS9R�   i   R(  t   IASR{  R<  t   residue_namest   chain_idt   i_seq_starti    N(+   Rn   R   t
   remove_iast   update_xray_structureR<   Ru   R^   t   old_refinement_flagsRq   R   R\   Rb   R-   Rg   R1   RŒ   Ro   R   R‹   Rp   Rr   Rš   t   concatenate_inplaceRt  R‡   Rd   Ri   R  RL   t   rangeR9   R˜   t   inflateRI  R  R³  RŠ  t   extract_scattering_typest   convert_to_anisotropicR+  RQ   Rl   t   _append_pdb_atoms(   R;   R®  t
   ias_paramsR°  t
   build_onlyR´  t   ias_sizet   tailt
   tail_falset   ssitest   sadpt   occupancy_flagst   msR'   R  t   n_sitesR<  t   sct   new_atom_nameR·  (    (    s9   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/model.pyt   add_ias  s’    

	 			
!!&(  		c         C   sÞ   |  j  d IJt |  _ |  j d  k	 r1 d  |  _ n  |  j d  k	 r^ |  j j ƒ  |  _ d  |  _ n  |  j d  k	 rÚ |  j	 j
 d |  j ƒ |  j	 j ƒ  j d |  j  ƒ |  j j d |  j ƒ |  _ |  j j ƒ  |  _ d  |  _ n  d  S(   Ns   >>> Removing IAS...............R�   R²  t   atom_selection(   R^   Rp   Rq   Rn   R   R¼  R  Ri   Rr   R<   t   select_inplaceRt  R‡   Re   R{   Rf   Rg   (   R;   (    (    s9   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/model.pyRº  q  s    	c         C   s	  | d  k r t j } n  |  j j ƒ  } |  j j ƒ  } t j ƒ  } xF|  j j	 j
 ƒ  j j D],} | j } | j \ }	 }
 |  j |	 } |  j |
 } | j j ƒ  d
 k r[ | j j ƒ  d k r[ | |	 } | |
 } | j j ƒ  r‡| j j ƒ  r‡t j | j | j | j | j | ƒ } | j ƒ  d } | j | ƒ | j | j } } | rg| j ƒ  } | j ƒ  } n  | d | | | | f IJq‡q[ q[ W| j ƒ  d k r| d | IJ| d | t j | ƒ f IJ| d | t j | ƒ f IJ| d	 | t j | ƒ f IJn  d  S(   NR+   R,   g     ˆÃ@s   %s%s %s %10.3fi    s   %sRBT values (*10000):s   %s  mean = %.3fs   %s  max  = %.3fs   %s  min  = %.3f(   R+   R,   (   R+   R,   (   R   t   syst   stdoutR<   R1   R7   R   R6   Rb   R-   R.   R/   R0   R3   Rg   R8  RQ   R   t   use_u_anisoR
   t   rigid_bond_pairR5   t   u_start   delta_zR9   R   Ré   RŒ   RÐ   R  Rœ   (   R;   R²  t
   use_id_strRÄ   R1   R7   t	   rbt_arrayR>   R3   R'   Rª   t   atom_it   atom_jt   sc_it   sc_jRS   t	   rbt_valuet   name_it   name_j(    (    s9   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/model.pyt   show_rigid_bond_test‚  s:     	

!$g      à?c         C   s”  |  j  d  k r d  S|  j  |  j g j d  ƒ d k s: t ‚ d } | j |  j ƒ } |  j  j ƒ  | j ƒ  k ss t ‚ | |  j  } d } d | d } xù t |  j ƒ D]è \ }	 }
 |
 r¤ | | } | | d d | | d d | | d d | 7} | d  k	 r| d d | | d d | | d d | f } | |	 } | d | d | d | d | d | d f } | | |	 <n  | d 7} q¤ q¤ W| S(   Ni    i   i   (   R`   R   Ra   RL   R|   R{   RŒ   R~   (   R;   R*   t   gradient_arrayt   sigmat   targett   sites_cart_movingt   deltast   cntrRÇ   R?   R  t   dR&  R3  Rò   (    (    s9   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/model.pyt#   reference_model_restraints_manager2¡  s*     '
63
3g      Ð?c         C   sš  |  j  s d  S|  j  \ } } d } | j t j | ƒ ƒ | j t j | ƒ ƒ } d | d } x5t | | | ƒ D]!\ }	 }
 } | | d d | | d d | | d d | 7} | d  k	 rq | d d | | d d | | d d | f } | |	 } | d | d | d | d | d | d f } | | |	 <| |
 } d | d | d d | d | d d | d | d f } | | |
 <qq qq W| S(   Ni    g      ð¿i   i   (   R`   R{   R   R˜   R0  R   (   R;   R*   Râ  Rã  t   p1t   p2Rä  Ræ  RÇ   t   p1_t   p2_Rè  R&  R3  RÕ   RÖ   (    (    s9   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/model.pyt"   reference_model_restraints_manager¸  s"    	 ."63
3

?c   	      C   sÕ   |  j  d  k r d  S|  j j ƒ  } |  j rh |  j d  k	 rh |  j j t ƒ d k rh | j |  j ƒ } n  |  j	 } |  j
 d  k r‰ d  } n  |  j  j d | d | d | d | d | d | d | d	 |  j j ƒ  ƒ } | S(
   Ni    R*   t   geometry_flagst   external_energy_functiont   custom_nonbonded_functiont   compute_gradientst	   gradientst   disable_asu_cacheRt   (   Rb   R   R<   R*   Rq   Rr   RL   Ru   R{   Rî  R`   t   energies_sitesRt   (	   R;   Rï  Rñ  Rò  Ró  Rô  R*   t   ref_m_rmR"   (    (    s9   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/model.pyt!   restraints_manager_energies_sitesÍ  s&     	 	c         C   s¢   t  j ƒ  } t j j } xƒ |  j D]x } | j ƒ  j j ƒ  } | d | ƒ d k rb | j	 t
 ƒ q" | j j ƒ  d k r� | r� | j	 t
 ƒ q" | j	 t ƒ q" W| S(   NR   R   t   ION(   R   R‹   R   R   R   Rg   t   parentR   RQ   R9   Ru   t   segidRp   (   R;   t   include_ionsR"   R!   R&  R   (    (    s9   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/model.pyR
  æ  s    c         C   sB   |  j  d t ƒ } |  j r+ | |  j B} n  |  j j | ƒ } | S(   NRû  (   R
  Ru   Rq   Rr   R<   R{   (   R;   R  R"   (    (    s9   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/model.pyt   xray_structure_macromoleculeò  s
    	 c         C   sh  |  j  j | d t ƒ} d  } |  j d  k	 rc y |  j j | ƒ } Wqc t k
 r_ |  j } qc Xn  d  } |  j d  k	 rô t | t j	 ƒ r¢ |  j j d | ƒ } n* t | t j
 ƒ rÌ |  j j d | ƒ } n  | j j d |  j j ƒ  j | ƒ ƒ n  t d |  j d | d |  j j | ƒ d | d | d	 |  j d
 |  j d |  j ƒ } |  j j ƒ  | _ | j j ƒ  | S(   Nt
   copy_atomsR�   R*   R_   Rb   R<   R    Ri   Rk   Rm   R^   (   Re   R{   Ru   R   Ri   t	   ExceptionRb   t
   isinstanceR   R‹   R˜   R-   R.   R<   R*   R\   R_   Rk   Rm   R^   Rd   Rc   Rt  (   R;   R�   R|  t   new_refinement_flagsR�  t   new(    (    s9   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/model.pyR{   ø  s:    			c         C   s   |  j  ƒ  j t ƒ S(   N(   R
  RL   Ru   (   R;   (    (    s9   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/model.pyt#   number_of_ordered_solvent_molecules  s    s   Information about rigid groupsc         C   s   t  ƒ  } d  } | d  k	 r* |  j j } n  | d  k	 rE |  j j } n  |  j j d  k rm |  j j d  k rm d  S| d  k	 s t ‚ | d  k r— t j } n  | Jt d | d ƒ } d | d } d | d | d }	 | |	 IJd }
 |  j	 j
 ƒ  j ƒ  } | |
 | t | ƒ f IJ| d IJ| d	 IJd
 }
 |  j	 j ƒ  } |  j	 j ƒ  t j d d } xt | ƒ D]þ \ } } t | t j ƒ r“| j ƒ  } n | } | d } | | j ƒ  d } |  j | } |  j | } | j ƒ  } | j ƒ  } | j ƒ  } | j ƒ  } | |
 | d | | d | | | j | j | j ƒ  | | d | | | j | j | j ƒ  f IJqfW| d d d d IJ| J| j ƒ  t | j ƒ  7a d  S(   Ns   | t   |iP   i   s   |-t   -sN   | Total number of atoms = %-6d  Number of rigid groups = %-3d                |sO   | group: start point:                        end point:                       |sO   |               x      B  atom  residue  <>        x      B  atom  residue    |s=   | %5d: %8.3f %6.2f %5s %3s %5s <> %8.3f %6.2f %5s %3s %5s   |i   i   i    iM   (   R	   R   Ri   t   sites_rigid_bodyt   adp_tlsR|   RÒ  RÓ  Rl   R<   R1   RŒ   R*   R�   R   t   piR~   Rÿ  R   R‹   t
   iselectionRg   Rù  R   R   t   residt   flusht   time_model_showt   elapsed(   R;   t
   rigid_bodyt   tlsR²  t   textt   timert
   selectionst   line_lent   fill_lent
   upper_linet   nextt   natoms_totalt   sitest   b_isosR?   R�   t   i_selectiont   startt   finalt   firstt   lastt   first_agt   first_rgt   last_agt   last_rg(    (    s9   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/model.pyt   show_groups  s\    	   



 
c         C   s   |  j  d |  j ƒ  ƒ } | S(   NR�   (   R{   R
  (   R;   R"   (    (    s9   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/model.pyt   remove_solventN  s    c         C   sŸ  t  ƒ  } | d  k r! t j } n  | d | d d t d | d ƒ d d IJ|  j j ƒ  } |  j j ƒ  j ƒ  } | d k  | @} | j	 | ƒ } t
 j | ƒ } t
 j | ƒ } | d k  j t ƒ }	 |	 d	 | j ƒ  }
 | d
 k j t ƒ } |
 d k r| d IJn  | d k r$| d IJn  t | | ƒ d k rT| d | | |	 f IJn | d | | |	 f IJ| d d d d IJ| j ƒ  t | j ƒ  7a d  S(   Ns   |-R  iP   s   | R  i   g        gš™™™™™¹?g      Y@g       @g      >@sO   | *** WARNING: more than 30 % of atoms with small occupancy (< 0.1)       *** |i    sO   | *** WARNING: there are some atoms with large occupancy (> 2.0) ***          |g{®Gáz„?sM   | occupancies: max = %-6.2f min = %-6.2f number of occupancies < 0.1 = %-6d |iM   (   R	   R   RÒ  RÓ  Rl   R<   Rt   R1   R›   R{   R   Rœ   R  RL   Ru   RŒ   R  R
  R  R  (   R;   R²  R  R  R’   R¤   t   less_than_zerot   occ_mint   occ_maxt   n_zerost   percent_smallt   n_large(    (    s9   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/model.pyt   show_occupancy_statisticsR  s2    	 0
c         C   s7   t  j d |  j d |  j d | d |  j d | d | ƒ S(   NR<   R    t   return_pdb_stringRg   R�   R²  (   R   t   write_pdb_fileR<   Re   Rg   (   R;   R²  R�   R<   R+  (    (    s9   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/model.pyR,  p  s    				R  t   HOHR(  c         C   s  | d  k	 s t ‚ | j ƒ  j ƒ  } | j ƒ  } t | ƒ d k  rO d | } n  x  t | ƒ d k  rq | d } qR W| g | }	 | g | }
 t j d g | ƒ } t d |  j	 ƒ } | d  k sÌ | d k  rÕ d } n  |  j
 d | d |	 d |
 d	 | d
 | d | d | d | ƒ S(   Ni   R(  t   OH2R    i    R{  R<  R·  t   nonbonded_typesR¹  R¸  t
   refine_adpt   refine_occupancies(   R   R|   R1   RŒ   RQ   Rl   R   t
   std_stringR(   Re   t   append_single_atoms(   R;   t   solvent_xray_structureR>  t   residue_nameR¸  R1  R0  t   n_atomsRÎ  R<  R·  R/  R?   (    (    s9   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/model.pyt   add_solventz  s,       		c         C   sm  | d k s t  ‚ |  j j ƒ  j ƒ  } | j ƒ  j ƒ  } |  j j | ƒ |  _ d  } | r± g  } xN t d | j ƒ  j ƒ  d ƒ D]* } | j t j	 | | d g ƒ g ƒ q€ Wn  |  j
 d  k	 rí |  j
 j rí t j | j ƒ  j ƒ  t ƒ } n d  } |  j
 d  k	 r/|  j
 j r/t j | j ƒ  j ƒ  t ƒ } n d  } d  \ } } | d k r³| j ƒ  } |  j
 d  k	 rt|  j
 j s‰| j t ƒ d k rª| } t j | j ƒ  t ƒ } q³d  } n  | d k r%| j ƒ  } |  j
 d  k	 ræ|  j
 j sû| j t ƒ d k r| } t j | j ƒ  t ƒ } q%d  } n  |  j
 d  k	 rh|  j
 j d | d | d | d | d	 | d
 | ƒ n  |  j d | d | d | d |
 d | d |	 d | ƒ |  j d  k	 r?|  j j } | j d  k rÏd  } n t j	 | d ƒ } | j d  k rùd  } n t j	 | d ƒ } | j d  k r#d  } n t j	 | d ƒ } | j d  k rMd  } n t j	 | d ƒ } | d  k r€t j | d ƒ } n  | j d | d | d | d | d | d | j ƒ  d | d | ƒ } t  j! j" d | d |  j j# d |  j j$ ƒ |  _ |  j j# d  k	 r|  j j# j% d | ƒ n  |  j j j& d |  j j' ƒ  ƒ n  |  j( j ƒ  |  j j ƒ  j ƒ  k sit  ‚ d  S(!   Nt	   isotropict   anisotropici   i    RI  t   sites_torsion_anglesRŠ  R³  R™   R´  R{  R<  R·  R¸  t   segidsR¹  t   reset_labelst   n_additional_sitest   model_indicest   conformer_indicest   sym_excl_indicest   donor_acceptor_excl_groupst   site_symmetry_tableR/  t   nonbonded_chargesR-   Rs  Rh  t   numbert
   sites_frac(   R8  R9  (   NN()   R|   R<   R1   RŒ   t   concatenateR   R¾  R9   R   R˜   Ri   t   individual_sitesR‹   Ru   t   torsion_anglest	   use_u_isoRŠ  RL   Rp   RÔ  R³  R¿  RÂ  Rb   R-   R>  R?  R@  RA  RR  t   new_including_isolated_sitesRB  R³   Rw  R\   Rs  Rh  t"   register_additional_isolated_sitest   update_plain_pair_sym_tableRE  Rg   (   R;   R{  R<  R·  R/  R0  R1  RC  R;  R¹  R¸  R<  RË  t   number_of_new_atomsRÊ  R'   RÈ  t   ssites_torst   sadp_isot
   sadp_anisot   nxrs_uit   nxrs_uaR-   R>  R?  R@  RA  (    (    s9   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/model.pyR3  ”  s¦    &+!!!	!	
							
c      	   C   s¤  t  | ƒ t  | ƒ k o/ t  | j ƒ  ƒ k n s: t ‚ | d  k sd t  | ƒ t  | ƒ k sd t ‚ |  j j ƒ  } t j j d | ƒ }	 | j	 ƒ  j
 }
 |  j j ƒ  } | } xit | j ƒ  ƒ D]U\ } } | d 7} | j ƒ  \ } } t j j ƒ  j d t j d d d | | ƒ ƒ j d | | ƒ j d |
 | j ƒ ƒ j d	 | j ƒ j d
 t j | j ƒ ƒ j | ƒ j | ƒ j d t ƒ } | d  k	 rž| | | _ n  t j j  d d d | | ƒ } | j! d | ƒ t j j" d t j# d | ƒ d d ƒ } | j$ d | ƒ |	 j% d | ƒ q¿ W|	 j& ƒ  d k r=| j' d |	 ƒ n  |  j j( ƒ  |  _ |  j j) ƒ  | r x; t* |  j+ j ƒ  |  j ƒ D] \ } } | j, ƒ  | _- q~Wn  d  S(   Nt   idi   t
   new_serialR   i   R�   t   new_namet   new_xyzt   new_occt   new_bt
   new_heterot   altlocRÂ   R   RÒ   R   R  R(  t
   atom_groupt   residue_groupi    R$   (.   Rl   R1   R|   R   Re   t
   only_modelR   R]   R$   R7   t   orthogonalizeRg   RŒ   R~   t   element_and_charge_symbolsRÒ   t
   set_serialt
   hy36encodet   set_nameRê   R5   t   set_occRO   t   set_bR   R�   R‹  t   set_elementt
   set_charget
   set_heteroRu   Rú  R[  R9  R\  R)  t   append_atom_groupt   append_residue_groupt   residue_groups_sizet   append_chainRf   Rh   R0  R<   Ré   R+  (   R;   R{  R<  R·  R¸  R;  R¹  R<  t	   pdb_modelt	   new_chaint   ortht   n_seqR?   R@   RÍ  R8  t   charget   new_atomt   new_atom_groupt   new_residue_groupRÒ   (    (    s9   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/model.pyRÂ  ý  sH     *
"		(c         C   s{  |  j  | } | | _ d | j ƒ  | _ | j j ƒ  | k sD t ‚ | d k r‡ d } | d k  rk d } n  t t | ƒ ƒ | | _ n	 d | _ | | j ƒ  _	 |	 d k	 rá t |	 ƒ d k sÃ t ‚ |	 | j ƒ  j ƒ  j ƒ  _ n  |
 d k	 rt |
 ƒ d k st ‚ |
 | _ n  |  j j ƒ  | } | | _ | j ƒ  } g  |  j j ƒ  D] } | j ^ qI} xK | | k r«| j ƒ  j ƒ  } | j ƒ  } d | d	 | _ | j ƒ  } qaW| j ƒ  | _ | d k	 r÷| j d
 k râ| j } n  | | _ | | _ n  | d k	 r!| | _ t j | ƒ | _ n  t j | g ƒ } | d k rÀ| j d |  j j ƒ  ƒ |  j d k	 rM|  j j  d k	 rM|  j j  j! | t" ƒ |  j j# d k	 r½|  j j# j! | t$ ƒ q½qMn� | d k rM| j% d |  j j ƒ  ƒ |  j d k	 rM|  j j# d k	 rM|  j j# j! | t" ƒ |  j j  d k	 rJ|  j j  j! | t$ ƒ qJqMn  |  j d k	 r‡|  j j& d k	 r‡|  j j& j! | t" ƒ n  |  j d k	 r|  j j' d k	 rt$ } x; |  j j' D]- } x$ | D] } | | k rÈt" } PqÈqÈWq»W| s|  j j' j( | g ƒ qn  |  j) j* j+ d | d | d | ƒ |  j j, ƒ  |  j  j- ƒ  |  j j ƒ  j- ƒ  k sgt ‚ |  j. d t" ƒ | S(   sŒ   
    Convert a single atom (usually water) to a different type, including
    adjustment of the xray structure and geometry restraints.
    s   %2si    t   +R  RÂ   i   i   s   %4di   g      ð?R8  R7   R9  R?   t   nonbonded_typeRp  Rz   N(/   Rg   R   RQ   R8  R|   RÚ   R  Rp  Rù  R   R   Rl   RS  Rú  R<   R1   RP   Ré   R+  t   resseq_as_intR   RO   R¤   R3  R   R:  R‹  R   R˜   t   convert_to_isotropicR7   Ri   RŠ  R  Ru   R³  Rp   RÁ  RI  R™   R9   Rb   R-   t   update_atom_nonbonded_typet    discard_scattering_type_registryRŒ   R    (   R;   R?   RP   R>  R8  Rp  R5  t   initial_occupancyt   initial_b_isoR¸  Rú  R1  R0  RÒ   t   symbolR-  R+  R   t
   all_labelsR%   R   RÐ  t   flaggedt   occgroupRŸ   (    (    s9   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/model.pyt   convert_atom*  s˜    	 			%			*c   	      C   s�   |  j  j ƒ  t j d d } t j | ƒ } | | } | | } | | k } | | k  } | j | | ƒ | j | | ƒ |  j  j d | ƒ d  S(   Ni   i   R€   (   R<   R�   R   R  R   RÐ   R  R‘   (	   R;   t	   scale_maxt	   scale_minR  t   b_isos_meant	   max_b_isot	   min_b_isot   sel_outliers_maxt   sel_outliers_min(    (    s9   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/model.pyt	   scale_adp‰  s    

c   	   	   C   sì   |  j  d  k r d  S|  j j ƒ  } |  j d t ƒ } |  j rf | j |  j ƒ } | j |  j ƒ } n  |  j  } | d  k	 rœ | j | ƒ } | j | ƒ } n. | rÊ | } | j | ƒ } | j | ƒ } n  t	 j
 d | d | d | d | ƒ S(   NRz   R    Rb   t   molprobity_scorest   cdl_restraints(   Rb   R   R<   Rt   R    Ru   Rq   R{   Rr   R   R-   (	   R;   t	   ignore_hdR‰  RŠ  t   general_selectionRt   Ró   t   rmt
   not_hd_sel(    (    s9   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/model.pyt   geometry_statistics”  s(     			c   	   	   C   s‚   |  j  d  k r d  S| d  k r+ |  j } n  t ƒ  } |  j d | d | d | d | ƒ } | j d | d | ƒ t | j ƒ  7a | S(   NR‹  R‰  RŠ  RŒ  t   messageR²  (   Rb   R   R^   R	   R�  R‡   R  R  (	   R;   R‹  R�  R²  R‰  RŠ  RŒ  R  R"   (    (    s9   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/model.pyt   show_geometry_statistics±  s      			c         C   s   t  j d |  ƒ S(   NR#   (   R   t   adp(   R;   (    (    s9   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/model.pyt   adp_statisticsÇ  s    c      	   C   sc   | d  k r |  j } n  t ƒ  } |  j ƒ  } | j d | d | d | d | ƒ t | j ƒ  7a | S(   NR²  RÄ   t   paddedt   pdb_deposition(   R   R^   R	   R“  R‡   R  R  (   R;   RÄ   R”  R•  R²  R  R"   (    (    s9   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/model.pyt   show_adp_statisticsÊ  s     	c            s‰  |  j  d  k	 s t ‚ |  j } | j ƒ  | j ƒ  B} | } |  j d  k	 ry |  j j t ƒ d k ry | j	 |  j t
 ƒ } n  d } |  j  j d  k	 r© |  j  j j t ƒ } n  | d k rñ |  j j d | d | d | j d | d | ƒ } | j ‰  n0 |  j j d | d | d | d | ƒ }	 |	 j ‰  d  ‰ d  ‰ | r`| d k rK| j ‰ q`|	 j ‰ |	 j ‰ n  d t f ‡  ‡ ‡ f d	 †  ƒ  Y}
 |
 ƒ  S(
   Ni    R<   t
   parameterst   use_u_local_onlyt   use_hdRò  R�   R"   c              s   e  Z ‡  ‡ ‡ f d  †  Z RS(   c            s   ˆ  |  _  ˆ |  _ ˆ |  _ d  S(   N(   Rä  t   u_iso_gradientst   u_aniso_gradients(   R;   (   Rä  R›  Rš  (    s9   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/model.pyRG   ú  s    		(   RH   RI   RG   (    (   Rä  R›  Rš  (    s9   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/model.pyR"   ù  s   (   Ri   R   R|   R<   RI  RÔ  Rr   RL   Ru   R  Rp   R³  Rb   t   energies_adp_isoR˜  Rä  t   energies_adp_anisoRó  t   gradients_aniso_start   gradients_isot   object(   R;   t   iso_restraintsRò  R™  t   xrst   sel_R�   t   n_anisoRœ  R�  R"   (    (   Rä  R›  Rš  s9   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/model.pyt   energies_adpØ  s@    	'					"c         C   sW   |  j  j ƒ  j d t ƒ | d  k r4 |  j j } n  |  j  j ƒ  j d | j ƒ  ƒ d  S(   Nt   stateR  (	   R<   R1   t   flags_set_gradsRp   R   Ri   RI  t   flags_set_grad_siteR  (   R;   R�   (    (    s9   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/model.pyt   set_refine_individual_sites   s
    c         C   s¯   |  j  j ƒ  j d t ƒ | d  k r4 |  j j } n  | d  k	 rb |  j  j ƒ  j d | j ƒ  ƒ n  | d  k r} |  j j	 } n  | d  k	 r« |  j  j ƒ  j
 d | j ƒ  ƒ n  d  S(   NR¦  R  (   R<   R1   R§  Rp   R   Ri   RŠ  t   flags_set_grad_u_isoR  R³  t   flags_set_grad_u_aniso(   R;   t   selection_isot   selection_aniso(    (    s9   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/model.pyt   set_refine_individual_adp  s    c         C   sù   |  j  d  k	 rõ t |  j  ƒ d k rõ t } |  j j ƒ  } xµ t |  j  ƒ D]¤ \ } } | j rI | j | j	 ƒ j
 ƒ  } t | ƒ t | j
 ƒ k s— t ‚ | j | j
 ƒ sí | d t | ƒ | d f IJ| d | j	 IJ| | _
 t } qí qI qI W| Sd  S(   Ni    s)   Updating %d atom(s) in anomalous group %di   s     selection string: %s(   Rm   R   Rl   Rp   Re   t   atom_selection_cacheR~   t   update_from_selectionR�   t   selection_stringR  R|   RR   Ru   (   R;   R²  t   modifiedt	   sel_cachet   i_groupt   groupt   isel(    (    s9   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/model.pyt   update_anomalous_groups  s    	!	N(>   RH   RI   t   __doc__R   RG   Rp   R    Rx   R)   RJ   R†   RŠ   RŽ   R–   R¨   R«   R¶   RÁ   RÆ   R  Ru   Rˆ   R'  R*  R_  RU  Rˆ  R‰  R‘  R  R«  R¬  R  RÏ  Rº  Rá  Ré  Rî  R÷  R
  Rü  R{   R  R"  R#  R*  R,  R7  R3  RÂ  R€  Rˆ  R�  R‘  R“  R–  R¥  R©  R®  RÒ  RÓ  R·  (    (    (    s9   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/model.pyR\   y   sÞ   							,			25	*	m	0		,				S	 		#	/		
c-S		
	(('   R¸  t
   __future__R    t   cctbx.array_familyR   R   t   libtbx.test_utilsR   RÒ  t   stdlibt   cctbxR   R   t   mmtbx.restraintsR³   R   R   R   R�  R¦  t   libtbx.utilsR   R	   R
   R   R   R   t	   iotbx.pdbt   libtbxR   R   RÛ   Râ   R  R(   R   R)   RJ   R\   (    (    (    s9   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/model.pyt   <module>   s8   	(