ó
±™xTc           @   sã  d  d l  m Z d  d l Z d  d l Z d  d l m Z d  d l Z d  d l Z d  d l	 m
 Z
 d Z e Z e rŒ d d GHe GHd d GHn  e j e ƒ Z e d d	 d
 d g ƒ Z e d	 d g ƒ Z e d
 d d g ƒ Z d „  Z d „  Z d „  Z d „  Z e d „ Z e d „ Z e d „ Z d „  Z d „  Z e d „ Z d „  Z d „  Z d „  Z  d „  Z! d „  Z" e# d d „ Z$ d „  Z% d  e d! „ Z& d" „  Z' d# „  Z( d$ „  Z) e* d% k rße j+ d Z, e j+ d 3e) e, ƒ n  d S(&   iÿÿÿÿ(   t   divisionN(   t   phil(   t   Sorrys8  

altloc_remediate
  .caption = None
{
  input
  {
    pdb_file_name = None
      .type = path
      .short_caption = model
      .help = PDB filename
      .style = bold file_type:pdb
    residue_selection = None
      .type = str
      .multiple = True
      .short_caption = Use this selection to
      .help = The
  }
  control
  {
    correct_alt_loc = True
      .type = bool
    spread_alt_loc = False
      .type = bool
    use_geometry_as_spread_criteria = True
      .type = bool
    block_alt_loc = False
      .type = bool
  }
  output
  {
    file_name = None
      .type = path
      .short_caption = Output file
      .help = Defaults to current directory
      .style = bold new_file file_type:pdb
    display = False
      .type = bool
      .short_caption = Display the residues only, no remediation
  }
}
t   -iP   t   CAt   Ct   Nt   Ot   Ht   HAc         C   st  t  | ƒ d k r | S|  j ƒ  | d } |  j ƒ  | d } t  | j ƒ  ƒ t  | j ƒ  ƒ k rf | Sg  } xB | j ƒ  D]4 } | j j ƒ  | k ry | j | j j ƒ  ƒ qy qy Wt  | ƒ d k rÇ | Sg  } xB | j ƒ  D]4 } | j j ƒ  | k rÚ | j | j j ƒ  ƒ qÚ qÚ Wt  | ƒ d k r(| S| d d k rL| d d k rLg  S| d d k rp| d d k rpg  Sd  S(   Ni   i    i   R   t   D(   t   lent   atom_groupst   atomst   elementt   stript   append(   t   residue_groupt   removet   ag1t   ag2t	   isotopes1t   atomt	   isotopes2(    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/command_line/altloc_remediate.pyt   check_for_exchange_hd>   s,     $       c   	      C   sÆ  x¿|  j  ƒ  D]±} g  } x¨ t | j ƒ  ƒ D]” \ } } | j j ƒ  sM q, n  g  } x< | j ƒ  D]. } | j j ƒ  d k r� q` n  | j | ƒ q` Wt | ƒ t | j ƒ  ƒ k r, | j | ƒ q, q, W| rÜ t	 | | ƒ } n  | r xÙ t | j ƒ  ƒ D]Â \ } } | j j ƒ  s| } n  | | k rõ g  } x* | j ƒ  D] } | j | j
 j ƒ  ƒ q8WxL | j ƒ  D]> } | j
 j ƒ  | k r–| j | j ƒ  ƒ n  | j | ƒ qeW| j | ƒ qõ qõ Wq q W|  S(   NR   R
   (   R   R
   (   t   residue_groupst	   enumerateR   t   altlocR   R   R   R   R   R   t   namet   append_atomt   detached_copyt   remove_atomt   remove_atom_group(	   t	   hierarchyR   R   t   atom_group_it
   atom_groupt	   hydrogensR   t   blankt   blank_atom_names(    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/command_line/altloc_remediate.pyt   adjust_hydrogen_alt_locsP   s8       	 c         C   s/  x(|  j  ƒ  D]} d  } t ƒ  } t } t } t } xá t | j ƒ  ƒ D]Í \ } } | j j ƒ  sn | } qG n  | d  k r~ Pn  x* | j ƒ  D] }	 | j	 |	 j
 j ƒ  ƒ q‹ W| j t ƒ rG | j t ƒ râ | j t ƒ râ t } n. | j t ƒ r
| j t ƒ r
t } n t } PqG qG Wg  }
 d  } | r‡x`t | j ƒ  ƒ D]C \ } } | j j ƒ  sp| } | j ƒ  }
 q=n  | d  k r=Pq=q=Wn| r
xz t | j ƒ  ƒ D]c \ } } | j j ƒ  rÁq n  x? | j ƒ  D]1 }	 |	 j
 j ƒ  t k rÎ|
 j |	 ƒ | } qÎqÎWq Wn  | r�xz t | j ƒ  ƒ D]c \ } } | j j ƒ  rDq#n  x? | j ƒ  D]1 }	 |	 j
 j ƒ  t k rQ|
 j |	 ƒ | } qQqQWq#Wn  |
 r xf |
 D]^ }	 xH t | j ƒ  ƒ D]4 \ } } | j j ƒ  sÔq³n  | j |	 j ƒ  ƒ q³W| j |	 ƒ qšWt | j ƒ  ƒ d k r'| j | ƒ q'q q W|  S(   Ni    (   R   t   Nonet   sett   FalseR   R   R   R   R   t   addR   t   intersectiont	   mainchaint   partial1t   partial2t   TrueR   R   R   R   R   R    (   R!   R   R%   R   t   move_blank_to_alt_locst   move_CO_to_alt_locst   move_NH_to_alt_locsR"   R#   R   t   moving_atomst   moving_group(    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/command_line/altloc_remediate.pyt   all_mainchain_alt_lock   sr    	 		    c         C   s   t  |  ƒ }  t |  ƒ }  |  S(   N(   R6   R'   (   R!   (    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/command_line/altloc_remediate.pyt   general_corrections¨   s    c         C   sï  t  ƒ  } t  ƒ  } g  } g  } xç |  j ƒ  D]Ù } | j j ƒ  | k r_ | j | j j ƒ  ƒ n  | j ƒ  j j ƒ  r� | j | j j ƒ  ƒ n  | j j ƒ  d
 k r¨ q+ n  | j j ƒ  | k rÖ | j | j j ƒ  ƒ n  | j ƒ  j j ƒ  r+ | j | j j ƒ  ƒ q+ q+ Wx |  j	 ƒ  D] } PqW| s*d  St | ƒ t | ƒ k rFd S| j t ƒ t k r©| j t ƒ ršd Gt GHd G| j t ƒ GHd G| j t ƒ GHqßd sßt ‚ n6 | j t ƒ t k rÂd S| j t ƒ t k rÛd Sd	 Sd sët ‚ d  S(   NR   R
   t   alls   mainchain onlyR,   t
   differencei    t   partials   sidechain only(   R   R
   (   R)   R   R   R   R   t   parentR   R+   R   R   R(   R   R,   R-   R9   t   AssertionErrorR.   R/   (   R   t   verboset   altloc_listt   altloc_list_ht
   atom_namest   atom_names_hR   R#   (    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/command_line/altloc_remediate.pyt   get_alt_loc_type­   sB    		   	c         C   sú   i  } xí |  j  ƒ  D]ß } | r. d | j GHn  xÁ | j ƒ  D]³ } | rV d | j GHn  | j | j i  ƒ g  } x| | j ƒ  D]n } | r  d | j | j f GHn  t | j ƒ  ƒ d k r| | | j j | j | j f t | j ƒ  ƒ ƒ q| q| Wq; Wq W| S(   Ns   model: "%s"s   chain: "%s"s'     residue_group: resseq="%s" icode="%s"i   (	   t   modelst   idt   chainst
   setdefaultR   t   resseqt   icodeR   R   (   R!   R=   t   altlocst   modelt   chaint   threeR   (    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/command_line/altloc_remediate.pyt   get_alt_locsÏ   s"       "c   
      c   sX  t  |  ƒ } xE|  j ƒ  D]7} | r4 d | j GHn  x| j ƒ  D]} | r\ d | j GHn  g  } xç |  j ƒ  D]Ù } | r“ d | j | j f GHn  | j | j ƒ  j k r¯ Pn  | j | ƒ t	 | ƒ d k rØ | d =n  t	 | ƒ d k  rð qo n  | j
 | j i  ƒ } | d j | d j f } | j
 | d  ƒ }	 |	 d k rCqo n  | Vqo WqA Wq Wd  S(	   Ns   model: "%s"s   chain: "%s"s'     residue_group: resseq="%s" icode="%s"i   i    i   i   (   i   i   (   RM   RC   RD   RE   R   RG   RH   R;   R   R   t   getR(   (
   R!   R=   RI   RJ   RK   RL   R   t
   chain_dictt   keyt	   is_altloc(    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/command_line/altloc_remediate.pyt   generate_threesà   s4         
 
 c         C   sQ   d d l  m } d } x. t d ƒ D]  } | |  | | | d 7} q# W| | ƒ S(   Niÿÿÿÿ(   t   sqrti    i   i   (   t   mathRS   t   range(   t   xt   yRS   t   dt   i(    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/command_line/altloc_remediate.pyt   get_distanceö   s
    c         C   s–   i  } g  } x= |  d j  ƒ  D]+ } | j j ƒ  d k r | j | ƒ q q Wt | ƒ d k rˆ t | d j | d j ƒ } | | d <n
 d  | d <| S(   Ni   t   CBi   i    t   c_beta_dist(   R   R   R   R   R   RZ   t   xyzR(   (   RL   t   rct   cbsR   RX   (    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/command_line/altloc_remediate.pyt   get_geometry_flagsý   s     
c   
      C   sJ  x t  |  ƒ D]} g  } x! | D] } | j t | ƒ ƒ q  W| d d k rS q n  g  } x( | d j ƒ  D] } | j | j ƒ qj Wx˜ t d d d ƒ D]„ } t | | j ƒ  ƒ d k r— | | j ƒ  d j ƒ  } | | j | ƒ x4 t	 | | j ƒ  ƒ D] \ }	 } | |	 | _ qû Wq— q— Wq W|  j
 ƒ  j ƒ  | rF|  j ƒ  n  |  S(   Ni   s   sidechain onlyi    i   i   (   s   sidechain only(   RR   R   RB   R   R   RU   R   R   t   append_atom_groupR   R   t   reset_serialt   show(
   R!   R=   RL   t   typesR   t   spread_altlocsR#   t   jt   cloneRY   (    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/command_line/altloc_remediate.pyt   expand_altloc	  s&     # c         C   sY   g  } xL |  j  ƒ  D]> } | j g  ƒ x( | j ƒ  D] } | d j | j ƒ q3 Wq W| S(   Niÿÿÿÿ(   R   R   R   R   (   R!   R^   R   R#   (    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/command_line/altloc_remediate.pyt   get_altloc_data  s    c         C   sŸ   d G|  j  GHg  } x† |  j ƒ  D]x } d | j GHxc t | j ƒ  ƒ D]O \ } } d | | j ƒ  f GH| j j ƒ  | k rD | j | j j ƒ  ƒ qD qD Wq Wd  S(   NR   s     altloc "%s"s
       %2d %s(	   RG   R   R   R   R   t   format_atom_recordR   R   R   (   R   R@   R#   RY   R   (    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/command_line/altloc_remediate.pyt   print_residue_group$  s     c         C   s%   x |  j  ƒ  D] } t | ƒ q Wd  S(   N(   R   Rk   (   R!   R   (    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/command_line/altloc_remediate.pyt   display_model/  s    c         C   s=   x6 |  j  ƒ  D]( } | j j ƒ  | j j ƒ  k r t Sq Wt S(   N(   R   R   R   R0   R*   (   R#   R   t   tmp(    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/command_line/altloc_remediate.pyt   atom_name_in_atom_group3  s     c         C   s¼   d  } x¯ |  j ƒ  D]¡ } | j j ƒ  s4 | } q n  | s@ t ‚ | j | j k sX t ‚ xL | j ƒ  D]> } t | | ƒ s– | j ƒ  } | j	 | ƒ n  | j
 | ƒ qe W|  j | ƒ q Wd  S(   N(   R(   R   R   R   R<   t   resnameR   Rn   R   R   R   R    (   R   t   space_atom_groupR#   R   Rm   (    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/command_line/altloc_remediate.pyt   merge_altloc_into_space8  s    i   c         C   s  d „  } t  } | r t } n  | |  | ƒ sB d GHd s> t ‚ d  St |  j ƒ  ƒ d k rg t |  ƒ n  t |  j ƒ  ƒ d k s… t ‚ |  j ƒ  d j } i  } xI | D]A } g  | | <t j j	 j
 ƒ  }	 | |	 _ | |	 _ |  j |	 ƒ q¥ W| rü d G| GHn  xx |  j ƒ  D]j }
 xa |
 j ƒ  D]S } | j j ƒ  | k rx% | D] } | | j | j ƒ  ƒ q>W|
 j | ƒ qqWq	Wxœ t | ƒ D]Ž } | j ƒ  sœq„n  x3 |  j ƒ  D] }
 |
 j | k r©Pq©q©Wd sÒt ‚ x= | | D]1 } | rd | | j ƒ  f GHn  |
 j | ƒ qÝWq„Wd  S(   Nc         S   s`   xY |  j  ƒ  D]K } | j j ƒ  s( q n  x- | j ƒ  D] } | j j ƒ  | k r5 t Sq5 Wq Wt S(   N(   R   R   R   R   R   R*   R0   (   R   R   R#   R   (    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/command_line/altloc_remediate.pyt   _check_atom_groups_okL  s      s   not spreading toi    i   t   duplicatings   adding to "%s" <- %s(   R/   R.   R<   R   R   Rq   Ro   t   iotbxt   pdbR!   R#   R   Ra   R   R   R   R   R   R   t   sortedt   quoteR   (   R   Re   t   pre_peptideR=   Rr   R   Ro   t   spread_atomst   sat   agR#   R   t   new_atom(    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/command_line/altloc_remediate.pyt   spread_to_c_alphaG  sL    		
		   c         C   sÆ   |  j  ƒ  d } g  } x6 |  j  ƒ  D]( } | | k r; q# n  | j | j ƒ q# Wxc | j ƒ  D]U } x? |  j  ƒ  D]1 } | | k r‡ qo n  | j ƒ  } | j | ƒ qo W| j | ƒ q\ W|  j | ƒ d  S(   Ni    (   R   R   R   R   R   R   R   R    (   R   t   blank_atom_groupRI   R#   R   t   d_atom(    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/command_line/altloc_remediate.pyt   spread_to_residuev  s      gš™™™™™É?c   	      C   s�  xct  |  ƒ D]U} g  } x! | D] } | j t | ƒ ƒ q  Wg  } x( | d j ƒ  D] } | j | j ƒ qT Wt | ƒ } | d  d  d g k r¤ t | d | ƒ nK | d  d  d g k rï | d | k rï t | d ƒ t | d | ƒ qï n  | d d d  g k rt | d | d t	 ƒq | d d d  g k r | d | k rbt | d | d t	 ƒqbq q W|  j
 ƒ  j ƒ  | r‰|  j ƒ  n  |  S(   Ni   i   R8   i    s   sidechain onlyR\   Rx   (   RR   R   RB   R   R   R`   R(   R}   R€   R*   R   Rb   Rc   (	   R!   t   max_c_beta_deviationR=   RL   Rd   R   Re   R#   t   geometry_flags(    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/command_line/altloc_remediate.pyt   correct_altloc„  s.    ! c         C   s  x|  j  ƒ  D]ú } d  } t | j ƒ  ƒ d k r7 q n  x- | j ƒ  D] } | j j ƒ  sD | } PqD qD W| r xl | j ƒ  D]^ } xH t | j ƒ  ƒ D]4 \ } } | j j ƒ  s´ q“ n  | j | j	 ƒ  ƒ q“ W| j
 | ƒ qz Wt | j ƒ  ƒ d k r| j | ƒ qq q W|  j ƒ  j ƒ  |  S(   Ni   i    (   R   R(   R   R   R   R   R   R   R   R   R   R    Rb   (   R!   R   R5   R#   R   R"   (    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/command_line/altloc_remediate.pyt   block_alt_locž  s&      c         C   s¬   x¥ |  j  ƒ  D]— } | j j ƒ  s( q n  d  } x/ | j ƒ  D]! } | j d k r; | j } q; q; WxA | j ƒ  D]3 } | j d k rm | r” | | _ q  d | _ qm qm Wq Wd  S(   Ni   g      à?(   R   R   R   R(   R   t   occ(   R!   R#   R…   R   (    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/command_line/altloc_remediate.pyt   correct_occupancies²  s     c         C   sï  t  j j j d t d d ƒ } g  } g  } g  } x¢ t D]š } t j j | ƒ r® t	 j
 j | ƒ rt | j | ƒ q7 n  y t j d | ƒ } Wn t k
 r� qÑ X| j | ƒ q7 | j | ƒ | j | j | ƒ ƒ q7 Wt j d | ƒ } | j ƒ  } t | d t ƒ st d ƒ ‚ n  | j j }	 | j j }
 | j j } |
 j rY|
 j rYt d ƒ ‚ n  x@ t | ƒ D]2 \ } } | d k rf|	 j rf| | |	 _ qfqfW|	 j d  k rºt d	 ƒ ‚ n  | j s“|	 j | _ t j j | j ƒ } t j j  | j ƒ | _ | j j! d
 ƒ d | _ |
 j" r0| j d 7_ n  |
 j rK| j d 7_ n  |
 j rf| j d 7_ n  | j d 7_ t j j# | | j ƒ | _ n  | j j! d
 ƒ d } d | GHd GH| j$ d | ƒ j% ƒ  d GHt& d | d ƒ } | j' | j$ d | ƒ j( ƒ  ƒ | j) ƒ  t	 j
 j |	 j ƒ } | j* ƒ  } | j+ rFt, | ƒ d  St- | ƒ } |
 j" rjt. | ƒ } n  |
 j r‚t/ | ƒ } n  |
 j ršt | ƒ } n  t0 | ƒ d | j GHt& | j d ƒ } | j' | j1 d | j2 ƒ  ƒ ƒ | j) ƒ  d  S(   Nt   master_philt
   home_scopet   altloc_remediatet	   file_namet   sourcess1   Must have a "altloc_remediate" scope in phil filesg   Block residue altlocs are not consider "correct".
  To block residues set control.correct_alt_loc=Falsei    s   Must supply a protein PDB filet   .t   _spreadt   _correctt   _blocks   .pdbs*   
  Writing effective parameters to %s.eff
s   #phil __ON__t   python_objects   #phil __OFF__
s   %s.efft   wbs     Writing output to %st   crystal_symmetry(3   t   libtbxR   t   command_linet   argument_interpreterR‡   t   argst   ost   patht   isfileRt   Ru   t   is_pdb_fileR   t   parset   RuntimeErrort   processt   fetcht   extractt   getattrR*   R   R‰   t   inputt   controlt   outputR„   t   correct_alt_locR   t   pdb_file_nameR(   RŠ   t   dirnamet   basenamet   splitt   spread_alt_loct   joint   formatRc   t   filet   writet   as_strt   closet   construct_hierarchyt   displayRl   R7   Rh   Rƒ   R†   t   as_pdb_stringR’   (   t   rargsR•   t   philst	   phil_argst   pdbst   argt	   file_philt   working_philt   working_paramst   in_scopeR¢   R£   RY   Ru   RX   t   preamblet   ft   pdb_inpR!   (    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/command_line/altloc_remediate.pyt   runÀ  s�    						
	
			
t   __main__(-   t
   __future__R    R—   t   sysR“   R   t   libtbx.phil.command_linet	   iotbx.pdbRt   t   libtbx.utilsR   t   master_phil_stringt   master_paramsR*   R›   R‡   R)   R-   R.   R/   R   R'   R6   R7   RB   RM   RR   RZ   R`   Rh   Ri   Rk   Rl   Rn   Rq   R0   R}   R€   Rƒ   R„   R†   R¿   t   __name__t   argvR–   (    (    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/command_line/altloc_remediate.pyt   <module>   sR   +				=	"							,				[
