ó
­™xTc           @   s|  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 m Z d  d l	 Z	 d  d l
 m Z d Z d f  d „  ƒ  YZ d	 f  d
 „  ƒ  YZ d „  Z d „  Z e e d „ Z d „  Z e d „ Z d „  Z e d „ Z e d „ Z e j d d „ Z d „  Z e d „ Z e d „ Z d e d „ Z e d „ Z d „  Z  d e d „ Z! d „  Z" e# d k rxe" ƒ  n  d S(    iÿÿÿÿ(   t   divisionN(   t   flex(   t   Sorry(   t   easy_runs´   
  use_afitt = False
    .type = bool
  ligand_file_name = None
    .type = str
  ligand_names = None
    .type = str
  ff = 'mmff94s'
    .type = str
  scale = 10
    .type = str
t   covalent_objectc           B   s   e  Z d  „  Z RS(   c         C   sp   d  |  _ d  |  _ d  |  _ d  |  _ d  |  _ g  |  _ g  |  _ g  |  _ d  |  _	 g  |  _
 g  |  _ g  |  _ d  S(   N(   t   Nonet   n_atomst   resnamet   res_idt   ligand_res_idt   charget   partial_chargest   atom_elementst   bondst   nbondst   sites_cart_ptrst   formal_chargest   res_bond(   t   self(    (    sM   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/geometry_restraints/afitt.pyt   __init__   s    											(   t   __name__t
   __module__R   (    (    (    sM   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/geometry_restraints/afitt.pyR      s   t   afitt_objectc           B   s_   e  Z d  d d „ Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d	 „  Z	 d
 „  Z
 RS(   t   mmff94si
   c         C   s¼   g  |  _  | |  _ g  |  _ g  |  _ g  |  _ g  |  _ g  |  _ g  |  _ g  |  _ g  |  _	 d |  _
 | |  _ | |  _ | |  _ | |  _ g  |  _ g  |  _ |  j | ƒ } |  j | | ƒ d  S(   Ni    (   R   R   t   res_idsR
   R   R   R   R   R   R   t   total_model_atomst   fft   scalet   ligand_patht   pdb_hierarchyt   covalent_datat   occupanciest   read_cif_filet   process_cif_object(   R   R   t   ligand_namesR   R   R   t
   cif_object(    (    sM   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/geometry_restraints/afitt.pyR   '   s&    																	c   	   	   C   s  d } x4 d d d g D]# } | d | t  |  | ƒ f 7} q W|  j rñ |  j j ƒ  } x» t |  j |  j ƒ D] \ } } | d | 7} xb t | ƒ D]T \ } } | d | d 7} x3 | D]+ } | d	 | | | j ƒ  d d
 !f 7} q· Wq’ Wqk Wn" x |  j D] } | d | 7} qû W| S(   Ns   Afitt objectR   R   R   s   
  %-15s : %ss   
    %ss   
      Entity %si   s   
       %5d : %siÿÿÿÿ(   t   getattrR   R   t   atomst   zipR   t	   enumeratet   quote(	   R   t   outlt   attrR%   R   t   ptrst   jt   groupt   i(    (    sM   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/geometry_restraints/afitt.pyt   __repr__C   s    !	"4c         C   s2   d d l  m } | j d | d t ƒ j ƒ  } | S(   Niÿÿÿÿ(   t   cift	   file_patht   strict(   t   iotbxR0   t   readert   Falset   model(   R   R   R0   R#   (    (    sM   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/geometry_restraints/afitt.pyR    T   s    c      	   C   s  d } d g t  | ƒ } xý | j ƒ  D]ï } xæ | j ƒ  D]Ø }	 |	 j | k rT q9 n  xº |	 j ƒ  D]¬ }
 |
 j | k r| qa n  xŽ |
 j ƒ  D]€ } | j | k r¤ q‰ n  xb | j ƒ  D]T } xK | D]C } | j	 j
 ƒ  | j
 ƒ  k rå q¾ n  | j | ƒ } | j | | <q¾ Wq± Wq‰ Wqa Wq9 Wq& W| S(   Nt   helloi    (   t   lent   modelst   chainst   idt
   conformerst   altloct   residuest   resseqR%   t   namet   stript   indext   i_seq(   R   t   atom_idsR   t   chain_idR=   R?   t   phraseR   R6   t   chaint	   conformert   residuet   atomt   atom_idt   loc(    (    sM   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/geometry_restraints/afitt.pyt   get_sites_cart_pointersY   s&        %c         C   sÛ  g  } g  } x¹ | j  ƒ  D]« } x¢ | j ƒ  D]” } x‹ | j ƒ  D]} } xt | j ƒ  D]f } | j | k rR | j | j | j g }	 | j |	 ƒ | j g  | j	 ƒ  D] }
 |
 j
 ^ qŸ ƒ qR qR Wq? Wq, Wq Wg  } xÃ t t | ƒ d ƒ D]« } x¢ t | d t | ƒ ƒ D]‡ } | | } | | } t t t | ƒ t | ƒ @ƒ ƒ t | ƒ k rt t t | ƒ t | ƒ @ƒ ƒ t | ƒ k r| j | ƒ PqqWqå Wg  } x: t t | ƒ ƒ D]& } | | k r­| j | | ƒ q­q­W| S(   Ni   (   R9   R:   R<   R>   R   R;   R=   R?   t   appendR%   RC   t   rangeR8   t   listt   set(   R   R   R   t   idsR%   R6   RG   RH   RI   t   id_listRJ   t   id_to_removeR.   R,   t   atoms_it   atoms_jt   filtered_idsR;   (    (    sM   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/geometry_restraints/afitt.pyt   get_res_idsk   s0    <	 

..c         C   st   xm | D]e } x\ | j  ƒ  D]N } | j | k r d t ƒ  k r\ | | j k re | j } qe qh | j } q q Wq W| S(   Nt   occ(   R%   RC   t   localsRY   (   R   R+   R   t   ptrRJ   RY   (    (    sM   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/geometry_restraints/afitt.pyt   get_occupanciesŽ   s    c   '      C   sç  xàt  |  j ƒ D]Ï\ } } |  j j g  ƒ g  } xªt  |  j | ƒ D]•\ } } | |  j | | } g  |  j j ƒ  D] } | j | k rw | ^ qw } g  }	 xd |  j | | D]Q }
 xH | D]@ } | j	 j
 |
 | j ƒ } | d  k r½ |	 j | |
 g ƒ q½ q½ Wq° Wt |	 ƒ d k  s't d | ƒ ‚ t |	 ƒ d k rS|  j d j d  ƒ qF n  t ƒ  } |	 d d j ƒ  } | j | _ | j ƒ  j ƒ  j | j | j ƒ  j g | _ | | _ | | _ g  | j ƒ  D] } | j ^ qÈ| _ d d l m } d d  l } | j j ƒ  } t | d d  ƒ } | d  k	 r>| d | j ƒ } n | j d | j ƒ } | j } g  | d D] } | ^ qg} g  | j ƒ  D] } | j j ƒ  ^ q†} g  | D] } | | k r¨| ^ q¨} g  | d	 D] } t | ƒ ^ qÑ} g  | d
 D] } | ^ qô} t  | | | ƒ } g  | D]  } | d | k r| d ^ q| _! g  | D]  } | d | k rO| d ^ qO| _" | j# d ƒ rìg  | d D] } t | ƒ ^ q’} t  | | ƒ } g  | D]  } | d | k rÀ| d ^ qÀ| _$ n  g  | d D] } | ^ q÷} g  | d D] } | ^ q} i d d 6d d 6d d 6d d 6d d 6d d 6} g  | d D] } | | ^ qa} t  | | | ƒ }  g  | D] } | | k r�| ^ q�}! xh |  D]` }" |" d | k rµ|" d | k rµ| j% j |! j& |" d ƒ |! j& |" d ƒ |" d f ƒ qµqµW|  j | | j& |	 d d ƒ }# |! j& |	 d d j j ƒ  ƒ }$ |# |  j' | |$ d g | _( x× | D]Ï }% t) }& xy |  D]q }" |" d |% k rÉ|" d |	 d d j j ƒ  k sú|" d |% k r’|" d |	 d d j j ƒ  k r’t* }& q’q’W|& t* k st d |% | j | j ƒ  j j ƒ  | | d j ƒ  f ƒ ‚ qWt+ | j! ƒ | _, t | j% ƒ | _- t | j" ƒ | _' | j' t | j ƒ  ƒ k s©t ‚ | j' t | j ƒ k sÇt ‚ |  j d j | ƒ qF Wq Wd  S(   Ni   sW   Ligand %s has more than one covalent bond to the model. This is unsupported at present.i    iÿÿÿÿ(   t   monomer_libraryt   get_comp_comp_idt   comp_ids   _chem_comp_atom.atom_ids   _chem_comp_atom.partial_charges   _chem_comp_atom.type_symboli   s   _chem_comp_atom.charges   _chem_comp_bond.atom_id_1s   _chem_comp_bond.atom_id_2t   singlet   doublei   t   triplei   t   aromatict   covalt   delocs   _chem_comp_bond.typesU   Atom (%s) in residue (%s %s), which is covalently bound to ligand (%s %s), is missing(.   R'   R   R   RN   R   R   R   R%   RC   t   bond_params_tablet   lookupR   R8   t   AssertionErrorR   t   parentR;   R=   R?   R   t   ligand_resnameR	   t   mmtbxR]   t   mmtbx.monomer_library.servert   serverR$   t   get_comp_comp_id_directR#   R@   RA   t   floatR&   R   R   t   has_keyR   R   RB   R   R   R5   t   Truet   sumR
   R   ('   R   t   geometryt	   resname_iR   t	   lig_atomst
   instance_it   instanceRJ   t   nonlig_atomst   bondt   lig_atm_iseqt   bond_tt   cov_objt   cov_resR]   Rk   t   mon_lib_srvt   get_funct   mlR#   R.   RD   t   model_atom_idst   missing_atomsR   R   t   chem_comp_atomsR   t   bond_atom_1t   bond_atom_2t	   bond_dictt	   bond_typeR   t   atom_ids_filtt   bt
   lig_atom_it
   cov_atom_it   missing_atomt   miss_atm_bound_to_cov_atm(    (    sM   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/geometry_restraints/afitt.pyt   check_covalent™   s˜     
			%	(%#00#3&
!% >" 11!c         C   sv  x`|  j  D]U} xS t | d d ƒ D]= \ } } | | k r% |  j j t | d d | ƒ ƒ q% q% Wd | } | j | ƒ s� t d | ƒ ‚ y5 |  j j g  | | d D] } t | ƒ ^ qª ƒ Wn/ t	 k
 rõ |  j j d g |  j d ƒ n X|  j
 j g  | | d	 D] } | ^ qƒ g  | | d
 D] } | ^ q0} g  | | d D] } | j | ƒ ^ qQ} g  | | d D] } | j | ƒ ^ q{}	 i d d 6d d 6d d 6d d 6d d 6d d 6}
 g  | | d D] } |
 | ^ qÕ} |  j j t | |	 | ƒ ƒ |  j j t |  j d ƒ ƒ |  j j t |  j d ƒ ƒ |  j | | ƒ } |  j j | ƒ g  } xL |  j d D]= } | j |  j | | d | d d | d d | d ƒƒ qwW|  j j | ƒ g  } x' | D] } | j |  j | | ƒ ƒ qÕW|  j j | ƒ | | j d ƒ rO|  j j g  | | d D] } t | ƒ ^ q3ƒ q
 |  j j g  ƒ q
 W| j ƒ  |  _ d  S(   Nt	   comp_lists   _chem_comp.ids   _chem_comp.number_atoms_alls   comp_%ss   Residue %s not in cif file!s   _chem_comp_atom.partial_chargei    iÿÿÿÿs   _chem_comp_atom.type_symbols   _chem_comp_atom.atom_ids   _chem_comp_bond.atom_id_1s   _chem_comp_bond.atom_id_2i   R`   i   Ra   i   Rb   i   Rc   Rd   Re   s   _chem_comp_bond.typeRE   R=   R?   s   _chem_comp_atom.charge(   R   R'   R   RN   t   intRp   Rh   R   Ro   t	   ExceptionR   RB   R   R&   R
   Rr   R   R8   RX   R   RM   R   R\   R   R   t
   atoms_sizeR   (   R   R#   R   t   resR.   R;   t
   comp_rnameRD   R„   R…   R†   R‡   R   t   this_res_sites_cart_ptrst   residue_instancet   this_occupanciesR+   (    (    sM   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/geometry_restraints/afitt.pyR!     sV    !	 
	,"	"!**&
%

	+c         C   s  | } | } |  j  | | } |  j | } t | ƒ t | ƒ k s_ t d |  j | | f ƒ ‚ t j ƒ  } t |  j ƒ d k s— |  j | | d  k rQ| j d |  j	 | ƒ | j d |  j | |  j
 | | d d |  j | f ƒ xR t | | ƒ D]A \ }	 }
 | j d |	 | |
 d | |
 d | |
 d f ƒ qù W| j d |  j | ƒ x; |  j | D], } | j d	 | d | d | d f ƒ qdW|  j | rAt g  |  j | D] } | d k r²| ^ q²ƒ } | j d
 | ƒ |  j | rAxJ t |  j | ƒ D]2 \ } } | d k r| j d | | f ƒ qqWqAn  | j d ƒ n¶|  j | | } | j d |  j	 | | j	 ƒ | j d |  j | |  j
 | | d d |  j | | j f ƒ xR t | | ƒ D]A \ }	 }
 | j d |	 | |
 d | |
 d | |
 d f ƒ qÒWxX t | j | j  ƒ D]A \ }	 }
 | j d |	 | |
 d | |
 d | |
 d f ƒ q-W| j d |  j | | j d ƒ x; |  j | D], } | j d	 | d | d | d f ƒ q£WxM | j D]B } | j d	 | d |  j	 | | d |  j	 | | d f ƒ qÝW| j d	 | j d | j d | j d f ƒ |  j | sh| j r½d } |  j | r´| t g  |  j | D] } | d k r�| ^ q�ƒ 7} n  | j rò| t g  | j D] } | d k rÍ| ^ qÍƒ 7} n  | j d
 | ƒ |  j | r]xJ t |  j | ƒ D]2 \ } } | d k r$| j d | | f ƒ q$q$Wn  | j r½xQ t | j ƒ D]= \ } } | d k rv| j d | |  j	 | | f ƒ qvqvWq½n  | j d | j	 ƒ x3 t | j	 ƒ D]" } | j d | |  j	 | ƒ qáW| j ƒ  S(   Nsa   No. of atoms in residue %s, instance %d does not equal to            number of atom seq pointers.i    s   %d
s3   residue_type %s chain %s number %d total_charge %d
i   s!   %s   %20.16f   %20.16f   %20.16f
i   s   bond_table_nbonds %d
s	   %d %d %d
s   formal_charges %d
s   %d %d
s   fixed_atoms 0
s   fixed_atoms %d
(   R   R   R8   Rh   R   t   StringIOR   R   t   writeR   R   R
   R&   R   R   R   R'   R   RO   t   getvalue(   R   t
   sites_cartRt   Rv   t   r_it   i_iR   t   elementst   fRJ   R[   Ry   t   cht   n_non_zero_chargesR.   t   fchargeR|   (    (    sM   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/geometry_restraints/afitt.pyt   make_afitt_inputC  sŒ    ,	1-*2 $	
-"-	*		

9	5 !	/ (   R   R   R   R/   R    RM   RX   R\   RŽ   R!   R£   (    (    (    sM   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/geometry_restraints/afitt.pyR   &   s   				#		r	8c          C   s²   d }  t  j d |  ƒ } t j ƒ  } | j d | ƒ d } | j ƒ  j d ƒ d k rY | St j j d t	 ƒ r® t j j d ƒ } t j
 j | | ƒ } t j
 j | ƒ r® | Sn  d  S(   Ns   buster_helper_mmff helpt   commandt   outt   buster_helper_mmfft   OpenEyeiÿÿÿÿt   OE_EXE(   R   t   fully_bufferedR˜   t   show_stderrRš   t   findt   ost   environt   getR5   t   patht   joint   existsR   (   t   cmdt   eroR¥   t   exet   oe_dir(    (    sM   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/geometry_restraints/afitt.pyt   get_afitt_commandŸ  s    c         C   s    t  ƒ  } | d  k r$ t d ƒ ‚ n  d | | f } t j d | d |  ƒ } t j ƒ  } | j d | ƒ d | j ƒ  j ƒ  k rœ | j	 ƒ  d GHt
 j ƒ  n  | S(   Ns<   AFITT command not found. Add to path or correctly set OE_DIRs	   %s -ff %sR¤   t   stdin_linesR¥   t	   ENERGYTAGs3   AFITT energy call exited with errors printed above.(   R¶   R   R   R   R©   R˜   t   show_stdoutRš   t   splitRª   t   syst   exit(   t   afitt_inputR   R´   R²   R³   R¥   (    (    sM   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/geometry_restraints/afitt.pyt
   call_afitt¯  s    		
c	      	   C   sÍ  | }	 | }
 | j  |	 |
 } t j ƒ  } xš |  j ƒ  j ƒ  D]† } | j d ƒ rj t | j ƒ  d ƒ } q< | j d ƒ r< | j t | j ƒ  d ƒ t | j ƒ  d ƒ t | j ƒ  d ƒ f ƒ q< q< W| rd | j	 |	 t
 | j |	 |
 d ƒ | j |	 |
 d | f GHn  g  } | j |	 |
 d  k	 rC| j |	 |
 j  } n  | j d  k	 rÉ| j ƒ  t | ƒ t | ƒ k szt ‚ | j d k rœd d	 l m } d
 } d
 } x† t | | ƒ D]u \ } } | | j | d
 d | j | d d | j | d d 7} | | d
 d | d d | d d 7} qµW| | ƒ } | | ƒ } | | } | rÃd | j	 |	 t
 | j |	 |
 d ƒ | j |	 |
 d | f GHqÃn' | j d k r´d  } n t | j ƒ } t } | rNd GHd | | f GHxh t | | ƒ D]T \ } } d | j | d
 | j | d | j | d | d
 | d | d f GHqóWn  | rÉg  } xB | D]: } | d
 | | d | | d | f } | j | ƒ qaW| | |	 |
 f <| | | |	 |
 f <qÉn  d  S(   NR¸   i   t   GRADIENTTAGi   i   s   AFITT_ENERGY %s_%d_%s: %10.4f
t   gnormiÿÿÿÿ(   t   sqrti    s   GRNORM_RATIO %s_%d_%s: %10.4f
t   noafitts   

GRADIENTS BEFORE AFTER AFITT
s   NORMS: %10.4f         %10.4f
s*   (%10.4f %10.4f %10.4f) (%4.4f %4.4f %4.4f)(   R   R   t   vec3_doubleRš   t
   splitlinest
   startswithRo   Rº   RN   R   R�   R   R   R   t	   gradientst   sizeR8   Rh   R   t   mathRÁ   R&   R5   (   t   afitt_outputRs   t   afitt_oRt   Rv   t   afitt_allgradientst   afitt_alltargetst   verboset   phenix_gnormsRœ   R�   R+   t   afitt_gradientst   linet   afitt_energyt   cov_ptrsRÁ   t   phenix_normt
   afitt_normt   afitt_gradientR[   t   gr_scalet   print_gradientst   scaled_gradientst   scaled_gradient(    (    sM   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/geometry_restraints/afitt.pyt   process_afitt_output¿  sv    	!
(?.

	*"c         C   s(  | j  d  k	 r$x| D]} | d } | d } | | } | | } |  j | | }	 g  }
 |  j | | d  k	 r‰ |  j | | j }
 n  x‚ t |	 |
 | ƒ D]m \ } } | d | j  | d } | d | j  | d } | d | j  | d } | | | f | j  | <q� W| j | 7_ q Wn  | S(   Ni    i   i   (   RÆ   R   R   R   R&   t   residual_sum(   RÊ   Rs   RË   RÌ   t   keyRœ   R�   RÆ   t   targetR+   RÒ   RC   t   gradientt   gxt   gyt   gz(    (    sM   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/geometry_restraints/afitt.pyt   apply_target_gradients  s"    



 c         C   s  t  |  | | | ƒ } | d  k	 r1 | j | ƒ n  g  } x× t | j ƒ D]Æ \ } }	 x· t | j | ƒ D]¢ \ }
 } | j | | |
 ƒ } t | | ƒ } xB | j ƒ  j	 ƒ  D]. } | j
 d ƒ rª t | j ƒ  d ƒ } qª qª W| j |	 t | d ƒ | d j ƒ  | g ƒ qg WqG W| S(   NR¸   i   i   (   R   R   RŽ   R'   R   R   R£   R¾   Rš   RÄ   RÅ   Ro   Rº   RN   R�   RA   (   t   cif_fileR"   R   R   R›   Rs   RÊ   t   energiesRt   R   Rv   Rw   R½   t   linesRÐ   t   energy(    (    sM   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/geometry_restraints/afitt.pyt   get_afitt_energy@  s&    	 		5c         C   ss   |  j  d  k r% t d |  j  ƒ ‚ n  |  j d  k rJ t d |  j ƒ ‚ n  |  j d k ro t d |  j ƒ ‚ n  d  S(	   Ns4   Ligand name(s) not specified
	 afitt.ligand_names=%ssE   Ligand restraints file name not specified
	 afitt.ligand_file_name=%st   mmff94R   t   pm3t   am1s!   Invalid force field
	 afitt.ff=%s(   Rè   s   mmff94sRé   Rê   (   R"   R   R   t   ligand_file_nameR   (   t   params(    (    sM   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/geometry_restraints/afitt.pyt   validate_afitt_params^  s    c   
      C   s¦   | r | } n | | B} g  } x/ |  j  j D]! } x | D] } | | 7} q; Wq. Wx | D] }	 t | |	 <qZ W| r¢ |  j  GHd t t d  | ƒ ƒ GHt | ƒ GHn  | S(   Ns"   
Number of atoms in selection : %d(   R   R   R5   R8   t   filterR   RP   (
   t   restraints_managerR›   t   hd_selectiont	   ignore_hdRÍ   t   general_selectiont   ligand_i_seqst   ligandR-   RC   (    (    sM   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/geometry_restraints/afitt.pyt   get_non_afitt_selectionj  s    
c         C   s°   | r | } n | | B} | | @} g  } x/ |  j  j D]! } x | D] } | | 7} qF Wq9 Wx | D] }	 t | |	 <qe W| | @}
 | r¬ |  j  GHd t t d  | ƒ ƒ GHn  |
 S(   Ns"   
Number of atoms in selection : %d(   R   R   Rq   R8   Rî   R   (   Rï   R›   Rð   Rñ   RÍ   Rò   Ró   Rô   R-   RC   t   rc(    (    sM   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/geometry_restraints/afitt.pyt   get_afitt_selection€  s    

s   REMARK   3  c      
   C   s�   | d | IJx^ |  j  D]S } | j d ƒ d k r9 q n  | d | | j ƒ  t t |  | ƒ ƒ j ƒ  f IJq W| d | IJd  S(   Ns   %sAFITT PARAMETERSt   __i    s
   %s  %s: %ss   %s(   t   __dict__R«   t   uppert   strR$   (   Rì   R¥   t   remarkR*   (    (    sM   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/geometry_restraints/afitt.pyt   write_pdb_header—  s     
	#c         C   s   d |  S(   Ns   (%9.3f %9.3f %9.3f)(    (   t   g(    (    sM   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/geometry_restraints/afitt.pyt   _show_gradient¡  s    c         C   s2  |  j  d k  r | r n  |  St | | | t ƒ } | j | ƒ } t | d d  ƒ } | d  k rˆ | j d | j | ƒ d t d t ƒ }	 n3 t | _ | j d | j | ƒ d t ƒ }	 | | _ |	 j	 }
 |	 j
 } t | | | t ƒ } | j | ƒ } t | d d  ƒ } | d  k r9| j d | j | ƒ d t d t ƒ }	 n3 t | _ | j d | j | ƒ d t ƒ }	 | | _ |	 j	 } |	 j
 } | r¶d GHd GHxR t | ƒ D]D \ } } d } | r¼d } n  d	 | d
 t |  j
 | ƒ | f GHq›Wd GHxR t | ƒ D]D \ } } d } | rd } n  d	 | d
 t |  j | ƒ | f GHqõWd GHx3 t | ƒ D]% \ } } d | d
 t | ƒ f GHqOWd GHx6 t | ƒ D]% \ } } d | d
 t | ƒ f GHqŠWn  |  j	 | 8_	 d } | rÝd d GHn  xt |  j ƒ D]
\ } } | r@d | t | ƒ t | | ƒ d f } | t |  j
 | ƒ 7} n  | | ré|  j
 | d | | d |  j
 | d
 | | d
 |  j
 | d | | d f |  j
 | <| rÜ| d | t | | ƒ t |  j
 | ƒ f 7} n  | d
 7} n  | rí| GHqíqíW| r.d G|  j	 GH|  j GHd G|  j GHd G|  j  GHd G| GHd G|
 GHd GHd GHd GHx/ t | ƒ D]! \ } } d | t | ƒ f GHq[Wd GHx/ t | ƒ D]! \ } } d | t | ƒ f GHq’Wd GHx2 t |  j ƒ D]! \ } } d | t | ƒ f GHqÌWd GHx5 t |  j
 ƒ D]! \ } } d | t | ƒ f GHqWn  |  S(    Ng�íµ ÷Æ°>t   normalizationR›   t   compute_gradientsRÆ   s   phenix + afittt    t   *s	   %3d %s %si   s   protein-ligand complexs   protein onlys   %3d %ss   ligand onlyi    s   %-40s %-40s %-40s %-40ss   phenix protein+ligands   phenix+afitts   phenix ligand onlys   phenix+afitt finals	   %5d %s %si   s
    %3d %s %ss!   total (phenix+afitt) residual_sumt   complex_residual_sumt   afitt_residual_sumt   ligand_residual_sumt   protein_residual_sums   

t
   unadjusted(   s   phenix protein+ligands   phenix+afitts   phenix ligand onlys   phenix+afitt final(   R  Rõ   R5   t   selectR$   R   t   energies_sitesRq   R   RÛ   RÆ   R÷   R'   Rÿ   t   complex_gradientsRû   R  (   t   resultRï   R›   Rð   RÊ   RÍ   Rò   t   rmt   old_normalisationt   esR  t   protein_gradientsR  t   ligand_gradientsR.   t   st   lst   ligand_iRþ   R)   (    (    sM   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/geometry_restraints/afitt.pyt   adjust_energy_and_gradients¤  sÊ     															 	' 	'   	'
'	 		c         C   sø  d d l  m } t | | | t ƒ } | j | ƒ } t | d d  ƒ }	 |	 d  k r| | j d | j | ƒ d t d t ƒ }
 n3 t | _	 | j d | j | ƒ d t ƒ }
 |	 | _	 |
 j
 } i  } d } x? t t | ƒ ƒ D]+ } | | r× | | | | <| d 7} q× q× Wg  } xå t | j ƒ D]Ô \ } } | j g  ƒ x¸ t | j | ƒ D]£ \ } } d } | j | | } x` | D]X } | | d } | | d } | | d } | | d | d | d 7} | d 7} qsW| | ƒ } | | j | ƒ qIWqW| S(	   Niÿÿÿÿ(   RÁ   R   R›   R  i    i   i   (   RÈ   RÁ   R÷   R5   R	  R$   R   R
  Rq   R   RÆ   RO   R8   R'   R   RN   R   R   (   Rs   Rï   R›   Rð   RÊ   RÍ   RÁ   Rò   R  R  R  R  t   ligand_gradients_and_sitesR.   t   sitet   gnormsRt   R   Rv   Rw   RÀ   R+   R[   t   l1t   l2t   l3(    (    sM   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/geometry_restraints/afitt.pyt   adjusted_phenix_g_norm"  sN    							
 i   c   '      C   sò  d d l  m } d d  l } d d  l } d d  l } | j j ƒ  }	 | j j ƒ  }
 | j j d |	 d |
 d |  d d  d t
 ƒ } | j j d |  ƒ } | j ƒ  } | j ƒ  j ƒ  | j ƒ  } | j ƒ  } | j d t d	 d
 ƒ } t | | | d | ƒ} | j | ƒ | rd GHn  | j d | d t
 ƒ } | r@d | j GHn  | r]d | j | d GHn  | j | _ t j | j ƒ | _ i  } i  } x„ t | j ƒ D]s \ } } xd t | j  | ƒ D]O \ } } | j! | | | ƒ } t" | | j# ƒ } t$ | | | | | | | ƒ qºWqšW| r'd | d! GHn  | ry| | j% d d k ry| j% d d j& | ƒ } d | d" | d GHqyn  t' | | | | ƒ } | j | j | _( | | _ t) | | | j ƒ  | j* ƒ  | ƒ } | j | _ | rïd | j GHn  | rd | j | d GHn  | j | d } d | GH| r4d GHn  d } | | } g  } g  }  g  }! xñ| d | g D]ß}" | rd |" GHn  i  } i  } | d |" | d | d g }# |# | | <| j d | d t
 ƒ } | rád | j GHn  |  j+ | j ƒ | j | _ t j | j ƒ | _ x„ t | j ƒ D]s \ } } xd t | j  | ƒ D]O \ } } | j! | | | ƒ } t" | | j# ƒ } t$ | | | | | | | ƒ qBWq"W| r¯d | d# GHn  |! j+ | d$ ƒ t' | | | | ƒ } | j | j | _( | | _ t) | | | | j* ƒ  | ƒ } | j | _ | r0d | j GHn  | j }$ | j+ |$ ƒ qgW| rpd |  d |  d d | GHn  | r–d |! d |! d d | GHn  | d | d d | }% d |% GH|% | }& t, |& ƒ d k såt- d |& ƒ ‚ d  |& GHd S(%   Niÿÿÿÿ(   R]   R~   t   ener_libt	   file_namet   raw_recordst   force_symmetryt   show_energiest   plain_pairs_radiusg      @R   s   Analytical GradientR›   R  s     phenix target:   %10.16fs     phenix gradient: %10.16fi    s     afitt target:    %10.16fs     afitt gradients: %10.16fs     final target:    %10.16fs     final gradient:  %10.16fs	   -> %10.9fs   
Finite Diff. Gradientgñhãˆµøä>s   e = %fi   i   s     phenix finite diff.: %10.16fs     afitt finite diff.: %10.16fg-Cëâ6?s,   TEST FAILS: (analytical - numerical)= %10.9fs-   TEST PASSES: (analytical - numerical)= %10.9f(   i    i    (   i    i    (   i    i    (   i    i    (.   Rk   R]   Rl   t(   mmtbx.monomer_library.pdb_interpretationt	   iotbx.pdbRm   R  t   pdb_interpretationt   processR   Rq   t   pdbt   inputt   construct_hierarchyR%   t   reset_i_seqt   extract_xray_structureR›   t   geometry_restraints_managerR5   R   RŽ   R
  RÝ   RÆ   RÛ   R  t   copyt   deepcopyR  R'   R   R   R£   R¾   R   RÚ   R   RB   Râ   R  R  Rð   RN   t   absRh   ('   t   pdb_fileRã   R"   RJ   R   RÍ   R]   Rk   R3   R~   R  t   processed_pdb_filet   pdb_inpR   t   xrsR›   t   grmRÊ   Rs   RË   RÌ   Rt   R   Rv   Rw   R½   Rå   R.   t   ana_gradientt   et   site_cart_ot   tst   phtst   aftst   e_t	   site_cartt   tt   num_gradientt   gradient_diff(    (    sM   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/geometry_restraints/afitt.pyt   finite_difference_testY  s   				 		   			 					  	 
 
		  			 			 	    	
	c         C   sþ   |  j  j |  _ t j |  j  j ƒ |  _ i  } i  } x“ t | j ƒ D]‚ \ } } xs t | j	 | ƒ D]^ \ } }	 | j
 | | | ƒ }
 t |
 | j ƒ } t | |  j  | | | | | d t d | ƒqc WqC Wt | |  j  | | ƒ |  _  |  j  j |  j |  _ |  S(   NRÍ   RÎ   (   Rs   RÛ   R  R-  R.  RÆ   R  R'   R   R   R£   R¾   R   RÚ   R5   Râ   R  (   R  RÊ   R›   RÎ   RË   RÌ   Rt   R   Rv   Rw   R½   Rå   (    (    sM   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/geometry_restraints/afitt.pyt   applyî  s2     			c         C   s]   |  j  } | j j } | j d d ƒ } | j G| j GH| j d d ƒ } | GHd sY t ‚ d  S(   Ni    i   i
   (   Rï   Rs   Rf   Rg   t   distance_idealt   weightRh   (   R6   R  Rf   Ry   (    (    sM   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/geometry_restraints/afitt.pyt	   bond_test  s    	R   c         C   sˆ  d d  l  } t j j |  ƒ s. t d |  ƒ ‚ t j j | ƒ sP t d | ƒ ‚ | j j d |  ƒ } | j ƒ  } | j ƒ  j	 ƒ  | j
 ƒ  } | j ƒ  }	 d  }
 | r3d d l m } d d  l } d d  l } | j j ƒ  } | j j ƒ  } | j j d | d | d |  d d  d t ƒ } | j d	 t d
 d ƒ }
 n  t | | | | |	 |
 ƒ } x3 | D]+ } d | d | d | d | d f GHqUWd  S(   Niÿÿÿÿs   File %s does not exist.R  (   R]   R~   R  R  R   R!  R"  g      @s   %s_%d_%s AFITT_ENERGY: %10.4fi    i   i   i   (   R$  R¬   R¯   t   isfileRh   R'  R(  R)  R%   R*  R+  R›   R   Rk   R]   Rl   R#  Rm   R  R%  R&  Rq   R,  R5   Rç   (   R0  Rã   R"   R   t   covalentR3   R2  R   R3  R›   R4  R]   Rk   R~   R  R1  Rä   Ræ   (    (    sM   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/geometry_restraints/afitt.pyt   run  s@    ""			c          C   sÓ   d d  l  }  |  j ƒ  } | j d d d ƒ| j d d d d d ƒ| j d	 d d
 ƒ| j d d d d d ƒ| j d d d d d d d ƒ| j ƒ  } | j j d ƒ } t | j | j | | j	 | j
 ƒ d  S(   NiÿÿÿÿR0  t   helps   pdb fileRã   s   cif filet   defaulti    R"   s)   3-letter ligand names separated by commass   -ffs(   afitt theory: mmff94, mmff94s pm3 or am1R   s	   -covalentt   destRF  t   actiont
   store_trues.   calculate covalent energy (only for debugging)t   ,(   t   argparset   ArgumentParsert   add_argumentt
   parse_argsR"   Rº   RG  R0  Rã   R   RF  (   RN  t   parsert   argsR"   (    (    sM   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/geometry_restraints/afitt.pyt   run2:  s    t   __main__($   t
   __future__R    R¬   R»   R-  t   cctbx.array_familyR   t   libtbx.utilsR   R˜   t   libtbxR   t   master_phil_strR   R   R¶   R¾   R5   R   RÚ   Râ   Rç   Rí   Rõ   R÷   t   stdoutRý   Rÿ   R  R  R@  RA  RD  RG  RT  R   (    (    (    sM   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/geometry_restraints/afitt.pyt   <module>   s>   ÿ z		T	*	
	~6�		$	