ó
´™xTc           @   sJ  d  d l  m Z d  d l Z d  d l Z d  d l m Z d  d l m Z d  d l m	 Z	 d  d l
 m Z d  d l m Z d  d l m Z d  d	 l m Z d  d
 l m Z d  d l m Z d  d l m Z d  d l m Z d  d l m Z d  d l m Z d  d l m Z d  d l m  Z  d  d l! Z d  d l" m# Z# m$ Z$ d  d l% m& Z& d „  Z' d „  Z( d „  Z) d „  Z* d „  Z+ d „  Z, d „  Z- d „  Z. d „  Z/ e0 d „ Z1 e2 d „ Z3 d „  Z4 d  „  Z5 d! „  Z6 d" „  Z7 d# „  Z8 d$ „  Z9 e2 d% e: d& „ Z; d' „  Z< d( „  Z= d) „  Z> e2 e0 d* „ Z? d+ „  Z@ d, „  ZA e0 d- d. „ ZB d S(/   iÿÿÿÿ(   t   divisionN(   t   pdb(   t   monomer_library(   t   get_bond_pairs(   t   rotalyze(   t   ramalyze(   t   cbetadev(   t   rna_validate(   t   kin_vec(   t   common_residue_names_get_class(   t   easy_run(   t   matrix(   t   geometry_restraints(   t   pdb_interpretation(   t   rna_sugar_pucker_analysis(   t   residue_analysis(   t   Sorryt   Usage(   t   show_stringc           C   s   t  j j d d ƒ S(   Nt   input_strings  
      kinemage {
        pdb = None
         .type = path
         .optional = True
         .help = '''Enter a PDB file name'''
        cif = None
         .type = path
         .optional = True
         .multiple = True
         .help = '''Enter a CIF file for ligand parameters'''
        out_file = None
         .type = path
         .optional = True
         .help = '''Enter a .kin output name'''
        keep_hydrogens = False
        .type = bool
        .help = '''Keep hydrogens in input file'''
  }
    (   t   iotbxt   philt   parse(    (    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/kinemage/validation.pyt   get_master_phil   s    c         C   s7   t  ƒ  } x' |  j ƒ  D] } | j ƒ  | | j <q W| S(   N(   t   dictt   atomst   pdb_label_columnst   i_seq(   t   pdb_hierarchyt   i_seq_name_hasht   atom(    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/kinemage/validation.pyt   build_name_hash-   s    	c      
   C   sì  t  d | ƒ } d } xÐ|  D]È} t j d | d | ƒ } | | j d d } | | j d d d !j ƒ  }	 | | j d d d	 !}
 | j j ƒ  |
 j ƒ  k	 r¦ q n  | | j d d d !j ƒ  } | | j d
 d d !j ƒ  } | | j d d d !j ƒ  } | d d k s | d d k s | d d k r6q n  d
 | j d } | j | } t	 | ƒ d k r |	 | d d !j ƒ  | d d | j ƒ  d | j ƒ  d | j ƒ  } t
 d | j d | j d | d | ƒ } | | 7} q q W| S(   NR   s   @subgroup {geom devs} dominant
t
   sites_cartt   proxyi    i   i   i   i
   i   i   t   Hg      à?g      @i   t    t   -t   sitest   deltat
   num_sigmast	   angle_key(   R   R   t   anglet   i_seqst   lowert   idt   stript   weightR&   t   abst   add_fanR%   (   t   angle_proxiest   chainR    t	   hierarchyR   t   kin_textt   apt	   restraintt   rest   altloct	   cur_chaint   atom1t   atom2t   atom3t   sigmaR'   R(   t   kin(    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/kinemage/validation.pyt   get_angle_outliers3   s2    	0I		c         C   s›  d d l  m } d d l m } d } |  j d } |  j ƒ  } |  j |  j } d | | f } | d k  ru d } n d } |  j ƒ  }	 |  j }
 | j	 |	 d ƒ } | j	 |	 d	 ƒ } | j	 |	 d
 ƒ } | | j
 | | ƒ j ƒ  } | j d |
 d t ƒ } t | | | | ƒ } | d | | f 7} | | | |	 d | |	 d	 ƒ 7} | | | |	 d	 | | ƒ 7} | j d |
 d d t ƒ } t | | | | ƒ } | d | | f 7} | | | |	 d	 | | ƒ 7} | j d |
 d d t ƒ } t | | | | ƒ } | d | | f 7} | | | |	 d	 | | ƒ 7} | j d |
 d d t ƒ } t | | | | ƒ } | d | | f 7} | | | |	 d	 | | ƒ 7} | S(   s6   
  Represent the angle outlier as a kinemage 'fan'.
  iÿÿÿÿ(   R   (   R   t    i    s   %s %.3f sigmat   bluet   redi   i   R)   t   degs8   @vectorlist {%s} color= %s width= 4 master= {angle dev}
g      è?s8   @vectorlist {%s} color= %s width= 3 master= {angle dev}
g      à?s8   @vectorlist {%s} color= %s width= 2 master= {angle dev}
g      Ð?s8   @vectorlist {%s} color= %s width= 1 master= {angle dev}
(   t   mmtbx.kinemageR   t   scitbxR   t
   atoms_infot   kinemage_keyR&   R=   R    t   colt   crosst	   normalizet$   axis_and_angle_as_r3_rotation_matrixt   Truet   tuple(   t   selfR   R   R4   t   atom0R(   R'   t   angle_key_fullt   colorR%   R&   t   at   bt   ct   normalt   rt   new_c(    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/kinemage/validation.pyt   angle_outlier_as_kinemageO   sL    		!c         C   sÊ  t  d | ƒ } d } x®|  j D]£} t j d | d | ƒ } | | j d d } | | j d d d !j ƒ  }	 | | j d d d	 !}
 | j j ƒ  |
 j ƒ  k	 r© q n  | | j d d d !j ƒ  } | | j d
 d d !j ƒ  } | d d k s | d d k s | d d k s | d d k r+q n  d
 | j d } | j	 | } t
 | ƒ d k r |	 | d d !j ƒ  | d d | j ƒ  d | j ƒ  } t d | j d | d | ƒ } | | 7} q q W| S(   NR   s!   @subgroup {length devs} dominant
R    R!   i    i   i   i   i
   i   R"   t   Dg      à?g      @i   R#   R$   R%   R'   t   bond_key(   R   t   simpleR   t   bondR*   R+   R,   R-   R.   R&   R/   t
   add_springR%   (   t   bond_proxiesR2   R    R3   R   R4   t   bpR6   R7   R8   R9   R:   R;   R=   R'   RZ   R>   (    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/kinemage/validation.pyt   get_bond_outliers{   s0    	  ;	c         C   sW  d d l  m } d d l m } d } |  j ƒ  } |  j |  j } | d k  rX d } n d } |  j ƒ  } | j | d ƒ } | j | d ƒ }	 | j d ƒ }
 | |	 j	 |
 |	 ƒ j
 ƒ  d	 } | | } t | ƒ } | d
 | | | f 7} d | | f } | | | | d | | ƒ 7} d } | } | d k r;d } n  | d k  rPd } n  | d k rs| d t | ƒ 7} n | d k r�| d | 8} n  d } d } |	 | } | d | } | j d | d t ƒ } xa | | k  r/| | |	 |	 } | | } | | | t | ƒ | t | ƒ ƒ 7} | } | d 7} qÏW| | | t | ƒ | | d ƒ 7} | S(   s6   
  Represent the bond outlier as a kinemage spring.
  iÿÿÿÿ(   R   (   R   R@   i    RA   RB   i   gš™™™™™É?sD   @vectorlist {%s %.3f sigma} color= %s width= 3 master= {length dev}
s   %s %.3f sigmai$   g      $@g      $Àg        g      ø?i<   g      ð?R)   RC   (   i   i    i    (   RD   R   RE   R   RG   R&   R=   R    RH   RI   RJ   RM   R/   RK   RL   (   RN   R   R   R4   RZ   R'   RQ   R%   RR   RS   RT   RU   t   currentt   newt   bond_key_longR)   t   devt   it   nt   axist   stepRV   t   next(    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/kinemage/validation.pyt   bond_outlier_as_kinemage–   sX    	!
		

#c         C   s<  d } d | | f } | d k  r+ d } n d } t  j |  d ƒ } t  j |  d ƒ } t  j |  d ƒ }	 | | j |	 | ƒ j ƒ  }
 |
 j d | d	 t ƒ } t | |	 | | ƒ } | d
 | | f 7} | t | |  d | |  d ƒ 7} | t | |  d | | ƒ 7} |
 j d | d d	 t ƒ } t | |	 | | ƒ } | d | | f 7} | t | |  d | | ƒ 7} |
 j d | d d	 t ƒ } t | |	 | | ƒ } | d | | f 7} | t | |  d | | ƒ 7} |
 j d | d d	 t ƒ } t | |	 | | ƒ } | d | | f 7} | t | |  d | | ƒ 7} | S(   NR@   s   %s %.3f sigmai    RA   RB   i   i   R)   RC   s8   @vectorlist {%s} color= %s width= 4 master= {angle dev}
g      è?s8   @vectorlist {%s} color= %s width= 3 master= {angle dev}
g      à?s8   @vectorlist {%s} color= %s width= 2 master= {angle dev}
g      Ð?s8   @vectorlist {%s} color= %s width= 1 master= {angle dev}
(   R   RH   RI   RJ   RK   RL   RM   R   (   R%   R&   R'   R(   R4   RP   RQ   RR   RS   RT   RU   RV   RW   (    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/kinemage/validation.pyR0   É   s>    	!c         C   s  d } | d k  r d } n d } t  j |  d ƒ } t  j |  d ƒ } t  j d ƒ } | | j | | ƒ j ƒ  d } | | }	 t |	 ƒ }
 | d | | | f 7} d | | f } | t | |  d | |
 ƒ 7} d	 } | } | d
 k rò d
 } n  | d k  rd } n  | d k r*| d t | ƒ 7} n | d k rG| d | 8} n  d } d } | | } | d | } | j d | d t ƒ } xa | | k  ræ| |	 | | } | | } | t | t |	 ƒ | t | ƒ ƒ 7} | }	 | d 7} q†W| t | t |	 ƒ | |  d ƒ 7} | S(   NR@   i    RA   RB   i   gš™™™™™É?sD   @vectorlist {%s %.3f sigma} color= %s width= 3 master= {length dev}
s   %s %.3f sigmai$   g      $@g      $Àg        g      ø?i<   g      ð?R)   RC   (   i   i    i    (	   R   RH   RI   RJ   RM   R   R/   RK   RL   (   R%   R'   RZ   R4   RQ   RR   RS   RT   RU   Ra   Rb   Rc   R)   Rd   Re   Rf   Rg   Rh   RV   Ri   (    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/kinemage/validation.pyR]   ð   sJ    	!
		

%#c         C   s�   |  d  k r g  S|  t k r  g  S|  t k r0 g  St |  ƒ } t |  ƒ } | d  k rX g  Sg  } x* | j D] } | j | j | j g ƒ qh W| S(   N(   t   Nonet   Falset   never_do_residuest   mon_lib_queryt	   bond_listt   appendt	   atom_id_1t	   atom_id_2(   t   residuet   monomer_lib_entryt   mlt   bondsR\   (    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/kinemage/validation.pyt   get_residue_bonds  s        c         C   s  d } d } d } d } xâ t  |  j ƒ  ƒ D]Î \ } } t j j ƒ  } | j ƒ  }	 | j |	 ƒ | t k r¶ t j	 | d | j
 ƒ  ƒ}
 t j	 | d |
 j ƒ} t j | j d ƒ } n | j
 ƒ  } t j	 | d | ƒj } x | D] } | | d 7} qá Wq+ W| S(   NsF   phenix.probe -4H -quiet -noticks -nogroup -dotmaster -mc -self "ALL" -s   phenix.reduce -quiet -trim -s5   phenix.reduce -oh -his -flip -pen9999 -keep -allalt -R@   t   stdin_liness   
(   t	   enumeratet   modelsR   R3   t   roott   detached_copyt   append_modelRl   R
   t   fully_bufferedt   as_pdb_stringt   stdout_linest   stringt   join(   R3   t   keep_hydrogenst   probet   trimt   buildt   probe_returnRe   t   mRV   t   mdct	   clean_outt	   build_outt	   input_strt	   probe_outt   line(    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/kinemage/validation.pyt   make_probe_dots$  s(    c         C   sx   d } | d 7} x@ |  D]8 } | d  k s8 | | j k r | | j ƒ  d 7} q q Wt | j ƒ  ƒ d k rt d } n  | S(   Ns   @subgroup {CB dev} dominant
sI   @balllist {CB dev Ball} color= gold radius= 0.0020   master= {Cbeta dev}
s   
i   R@   (   Rk   t   chain_idt   as_kinemaget   lent
   splitlines(   t   outliersR�   t	   cbeta_outt   outlier(    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/kinemage/validation.pyt	   cbeta_dev<  s    
	c         C   sa   d d d g } |  d | d d | d <|  d | d d | d <|  d | d d | d <| S(   Ng        i    i   i   (    (   t   p1t   p2t   mid(    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/kinemage/validation.pyt   midpointF  s
    c      	   C   s�  d } t  j d |  ƒ } | j } t j j ƒ  } g  } x! | D] } | j | j ƒ  ƒ q= Wx/| j ƒ  D]!} x| j	 ƒ  D]
}	 t
 |	 j ƒ d k r› qz n  t d |	 j ƒ  d | j ƒ }
 |
 j d  k	 rÎ qz n  |
 j sÝ qz n  y  |	 j d d ƒ j ƒ  d } Wn t k
 rqz n X| | k rz | j | d	 d  k	 rK| j | d	 } n | j | d
 } | j | d	 d  k	 r¢| j | d	 } | d k  r™d } qÎd } n, | j | d
 } | d k  rÈd } n d } | d	 d !j ƒ  | d } | | 7} | t | | d	 | | d
 ƒ 7} t j | d
 ƒ } t j |	 j d d ƒ j ƒ } | | j ƒ  } | | d } | t | | d
 | t | ƒ d ƒ 7} | | d } | t | | d
 | t | ƒ d ƒ 7} t j | d
 ƒ t j | d	 ƒ } | j d d d t ƒ } | | | | } | t | | d
 | t | ƒ d ƒ 7} | j d d d t ƒ } | | | | } | t | | d
 | t | ƒ d ƒ 7} qz qz Wqg W| S(   Ns7   @vectorlist {ext} color= magenta master= {base-P perp}
R   t   common_rna_dnat   residue_atomst   distance_tolerancet   names    C1'i   i    i   g333333@s    2'?s    3'?g333333@gš™™™™™é?gš™™™™™Ù?R)   iZ   RC   i´   (    R   t   rna_puckerst   resultsR   t   master_philt   extractRp   t   id_strt
   conformerst   residuesR	   t   resnameR   R   t!   bond_detection_distance_tolerancet   problemsRk   t   is_rnat   find_atom_byR   t	   Exceptiont   pucker_perp_xyzt   pucker_distR+   R   R   RH   t   xyzRJ   RM   RK   RL   (   R3   R2   t   kin_outt   rvR”   t   paramst   outlier_key_listR–   t	   conformerRs   t   ra1t   keyt   perp_xyzt	   perp_distt   pucker_textRR   RS   RT   Rb   t   r_vecRV   (    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/kinemage/validation.pyt   pperp_outliersM  sj    	 	  			
!&&$&1c         C   se   d } | d 7} g  } xH | j  D]= } | j ƒ  s8 q  n  | j |  j k r  | | j ƒ  7} q  q  W| S(   Ns2   @subgroup {Rama outliers} master= {Rama outliers}
s0   @vectorlist {bad Rama Ca} width= 4 color= green
(   R¡   t
   is_outlierR�   R,   R‘   (   R2   t   pdbIDt   ram_outlierst   ram_outt   outlier_listR–   (    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/kinemage/validation.pyt   rama_outliers†  s    
 c         C   st  d d d d g } d } | d |  j  7} g  } x6 | j D]+ } | j ƒ  sQ q9 n  | j | j ƒ  ƒ q9 Wxä|  j ƒ  D]Ö} xÍ| j ƒ  D]¿} | j ƒ  }	 |	 | k rˆ i  }
 i  } xw | j ƒ  D]i } d | j	 j
 ƒ  | j j
 ƒ  |  j  | j ƒ  | j | f } | |
 | j	 j ƒ  <| j | | j	 j ƒ  <q¿ Wt d | j ƒ } x| D]û } | d	 | k sE| d
 | k rqqEn, | d	 j d ƒ sE| d
 j d ƒ r�qEn  |
 j | d	 ƒ d  k sE|
 j | d
 ƒ d  k sE| j | d	 ƒ d  k sE| j | d
 ƒ d  k rqEn  | t |
 | d	 | | d	 |
 | d
 | | d
 ƒ 7} qEWqˆ qˆ Wqu Wt | j ƒ  ƒ d k rpd } n  | S(   Nt   Nt   Ct   Ot   OXTs#   @subgroup {Rota outliers} dominant
s<   @vectorlist {chain %s} color= gold  master= {Rota outliers}
s   %s %s %s%s  B%.2f %st   codei    i   R"   i   R@   (   R,   R¡   R¼   Rp   t   atom_group_id_strt   residue_groupst   atom_groupsR¤   R   RŸ   R+   R§   t   residRS   R-   R¯   R   t
   startswitht   getRk   R   R’   R“   (   R2   R½   t   rot_outlierst   mc_atomst   rot_outRÀ   R–   t   residue_groupt
   atom_groupt	   check_keyt   key_hasht   xyz_hashR   R¶   Rv   R\   (    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/kinemage/validation.pyt   rotamer_outliers�  sT     	
 &!	c         C   sU   d d d d d d d g } t  } x) | sL |  d k rC |  d }  q$ t } q$ W| |  S(	   Nt   whitet
   yellowtintt	   peachtintt   pinktintt	   lilactintt   bluetintt	   greentinti   (   Rl   RL   (   t   indext   chain_colorst   match(    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/kinemage/validation.pyt   get_chain_color»  s    		
c         C   s   d } | |  7} | S(   NsE   @spherelist {het M} color= gray  radius= 0.5 nobutton master= {hets}
(    (   t   ion_listt   ion_txt(    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/kinemage/validation.pyt   get_ionsË  s    
i    c   @      C   s×  d d d d d d d d d	 d
 d d d d d d d d g } d } d } d }	 d }
 d } d } d } d } d } t  | ƒ } d | } d } d | } d | } d } d } d } | rÉ d }	 d }
 n  d  } d  } i  } i  } i  } i  } i  } i  } i  } i  } i  } i  } i  } i  }  g  }! x |  j ƒ  D]}" i  }# i  }$ i  }% i  }& i  }' i  }( i  }) i  }* x� |" j ƒ  D]� }+ |+ j }, xo |+ j ƒ  D]a }- |# j |- j j ƒ  ƒ d  k rÉg  |# |- j j ƒ  <n  |# |- j j ƒ  j	 |, ƒ |, |$ |- j
 <q�WqsW|" j ƒ  } x|" j ƒ  D]}. xú|. j ƒ  D]ì}/ |/ j ƒ  } i  }0 i  }1 i  }2 |. j }, |, d k rfd }, n  xò|/ j ƒ  D]ä}- |# j |- j j ƒ  ƒ }3 |3 d g k r©d }4 n |, |3 k r¾|, }4 n
 |4 d k d |- j j ƒ  |4 j ƒ  |/ j j ƒ  |  j |" j ƒ  |- j | f }5 |5 |0 |- j j ƒ  <|- j |1 |- j j ƒ  <t |/ j ƒ d k rx|- j d  k rr|- j |% |, <|5 |& |, <n  |- j d! k r|- j |' |, <|5 |( |, <t | ƒ d" k rt | ƒ d" k rt |" j ƒ  ƒ t | d" d# !ƒ d$ k r|y} | j |, ƒ }6 | j |, ƒ }7 |6 d  k r3| j d ƒ }6 | j d ƒ }7 n  |6 d  k rEwsn  | t |6 |7 |5 |- j ƒ 7} Wqyt k
 ruqyXq|qn  |- j d% k rWt | ƒ d" k rut | ƒ d" k rut |" j ƒ  ƒ t | d" d# !ƒ d$ k rry} | j |, ƒ }6 | j |, ƒ }7 |6 d  k r)| j d ƒ }6 | j d ƒ }7 n  |6 d  k r;wsn  | t |6 |7 |5 |- j ƒ 7} Wqot k
 rkqoXqrquqWqst |/ j ƒ d& k r<|- j d' k r¶|- j |) |, <|5 |* |, <qW|- j d( k rÏt | ƒ d" k r©t | ƒ d" k r©t |" j ƒ  ƒ t | d" d# !ƒ d$ k r©y} | j |, ƒ }6 | j |, ƒ }7 |6 d  k r`| j d ƒ }6 | j d ƒ }7 n  |6 d  k rrwsn  | t |6 |7 |5 |- j ƒ 7} Wq¦t k
 r¢q¦Xq©n  |5 | |" j ƒ  <|- j | |" j ƒ  <qW|- j d) k r|5 | |" j ƒ  <|- j | |" j ƒ  <qW|- j d* k rW|5 | |" j ƒ  <|- j |  |" j ƒ  <qWqst |/ j ƒ d+ k rƒ| d, |5 |- j d" |- j d$ |- j d- f 7} qst |/ j ƒ d. k rât |/ j ƒ  ƒ d$ k râ| d, |5 |- j d" |- j d$ |- j d- f 7} qs|/ j j ƒ  d/ k r;|- j d0 k rW| d1 |5 |- j d" |- j d$ |- j d- f 7} qWqs|5 |- j g |2 |- j j ƒ  <qsWt |/ j ƒ d& k r†	yM | t | |" j ƒ  d$ |  |" j ƒ  d$ | |" j ƒ  | |" j ƒ  ƒ 7} Wn t k
 rÐn XyE | t | |" j ƒ  | |" j ƒ  | |" j ƒ  |  |" j ƒ  ƒ 7} Wn t k
 r)	n XyE | t | |" j ƒ  |  |" j ƒ  | |" j ƒ  | |" j ƒ  ƒ 7} Wq†	t k
 r‚	q†	Xn  g  }8 x$ |/ j ƒ  D] }- |8 j	 |- j
 ƒ q™	WxZ|/ j ƒ  D]L}- y | |- j
 }9 Wn t k
 rí	qÀ	n Xx|9 D]}: | j |- j
 ƒ }; |; d  k	 r/
|; d" d# !j ƒ  }; n  | j |: ƒ }< |< d  k	 r`
|< d" d# !j ƒ  }< n  |; d  k sõ	|< d  k r~
qõ	n  |0 j |; ƒ d  k sõ	|0 j |< ƒ d  k r®
qõ	n  |0 |; |0 |< }= |= |! k rÒ
qõ	n  |$ j |: ƒ }> |> |, k rÿ
|> d k rÿ
qõ	n  t |/ j ƒ d. k s)t |/ j ƒ d2 k r|; j d3 ƒ se|< j d3 ƒ se|; j d4 ƒ se|< j d4 ƒ rÂ| ry= | t |2 |; d" |2 |; d$ |2 |< d" |2 |< d$ ƒ 7} Wq¿t k
 r»q¿Xqqy= | t |2 |; d" |2 |; d$ |2 |< d" |2 |< d$ ƒ 7} Wqt k
 rqXqõ	t |/ j ƒ d k s@t |/ j ƒ d& k rõ	|; | k rÒ|< | k rÒyc |; d k rv|< d k rvnD |; d k r‘|< d k r‘n) | t |0 |; |1 |; |0 |< |1 |< ƒ 7} Wqøt k
 rÎqøXn&|; j d3 ƒ s|< j d3 ƒ s|; j d4 ƒ s|< j d4 ƒ r·| rø|; | k s,|< | k rpy- |	 t |0 |; |1 |; |0 |< |1 |< ƒ 7}	 Wq±t k
 rlq±Xq´y- |
 t |0 |; |1 |; |0 |< |1 |< ƒ 7}
 Wq´t k
 r°q´XqønA y- | t |0 |; |1 |; |0 |< |1 |< ƒ 7} Wn t k
 r÷n X|! j	 |= ƒ qõ	qõ	WqÀ	Wq$WqW|' } |( } |% } |& } | } |* } |) } q0Wd  }? t | ƒ d$ k rmt | ƒ }? n  t | j ƒ  ƒ d$ k r’| | 7} n  t |	 j ƒ  ƒ d$ k r·| |	 7} n  t | j ƒ  ƒ d$ k rÜ| | 7} n  t | j ƒ  ƒ d$ k r| | 7} n  t |
 j ƒ  ƒ d$ k r&| |
 7} n  t | j ƒ  ƒ d$ k rK| | 7} n  t | j ƒ  ƒ d$ k rp| | 7} n  t | j ƒ  ƒ d$ k r•| | 7} n  |? d  k	 r®| |? 7} n  t | j ƒ  ƒ d$ k rÓ| | 7} n  | S(5   NRÂ   t   CARÃ   RÄ   RÅ   t   Pt   OP1t   OP2t   OP3s   O5's   C5's   C4's   O4's   C1's   C3's   O3's   C2's   O2'R@   s0   @vectorlist {mc} color= %s  master= {mainchain}
s2   @vectorlist {sc} color= cyan  master= {sidechain}
s2   @vectorlist {Calphas} color= %s master= {Calphas}
s?   @vectorlist {Virtual BB} color= %s  off   master= {Virtual BB}
sD   @balllist {water O} color= peachtint  radius= 0.15  master= {water}
s.   @vectorlist {het} color= pink  master= {hets}
sF   @vectorlist {ht H} color= gray  nobutton master= {hets} master= {H's}
sJ   @vectorlist {mc H} color= gray nobutton master= {mainchain} master= {H's}
sJ   @vectorlist {sc H} color= gray nobutton master= {sidechain} master= {H's}
R#   s   %s%s%s %s%s  B%.2f %st   common_amino_acids    C  s    CA i    i   i   s    N  Rœ   s    O3's    P  s    C1's    C4't   common_elements   {%s} %.3f %.3f %.3f
i   t   othert   hohs    O  s   {%s} P %.3f %.3f %.3f
t   common_small_moleculeR"   RY   (   Rà   Rk   RÈ   RÉ   R8   R   RÌ   RŸ   R-   Rp   R   RÊ   R¥   R¦   R+   R§   R,   RS   R¯   R	   R’   t   intt   resseq_as_intR   R¬   RË   Rã   R“   (@   R2   t	   bond_hashR   R½   RÝ   t   show_hydrogenRÎ   t
   mc_veclistt
   sc_veclistt   mc_h_veclistt   sc_h_veclistt   ca_tracet
   virtual_bbt
   water_listRá   R°   RQ   t   hetst   het_ht
   prev_residt	   cur_residt
   prev_C_xyzt
   prev_C_keyt   prev_CA_xyzt   prev_CA_keyt   prev_O3_xyzt   prev_O3_keyt
   p_hash_keyt
   p_hash_xyzt   c1_hash_keyt   c1_hash_xyzt   c4_hash_keyt   c4_hash_xyzt   drawn_bondsRÐ   t   altloc_hasht   iseq_altloct	   cur_C_xyzt	   cur_C_keyt
   cur_CA_xyzt
   cur_CA_keyt
   cur_O3_xyzt
   cur_O3_keyRÑ   R8   R   R´   Rs   RÓ   RÔ   t   het_hasht   cur_altlocst
   cur_altlocR¶   t   prev_keyt   prev_xyzt
   cur_i_seqst	   cur_bondsR\   t   atom_1t   atom_2t	   drawn_keyt   altloc_2t   ion_kin(    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/kinemage/validation.pyt   get_kin_lotsÐ  sX   


						
		

$) $) $) 






 

 
c          C   s
   d }  |  S(   Ns½   
@kinemage 1
@onewidth
@1viewid {Overview}
@master {mainchain} indent
@master {Calphas} indent
@master {sidechain} indent
@master {H's} indent
@pointmaster 'H' {H's}
@master {water} indent
(    (   t   header(    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/kinemage/validation.pyt   get_default_header  s    c          C   s
   d }  |  S(   Ns�  
@master {mainchain} off
@master {sidechain} off
@master {H's} off
@master {water} off
@master {Rota outliers} on
@master {Rama outliers} on
@master {Calphas} on
@master {Virtual BB} on
@master {vdw contact} off
@master {small overlap} off
@master {H-bonds} off
@master {length dev} on
@master {angle dev} on
@master {length dev} on
@master {Cbeta dev} on
@master {base-P perp} on
@master {hets} on
(    (   t   footer(    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/kinemage/validation.pyt
   get_footer  s    c   
      C   sì   g  } d } d } xs |  j  ƒ  D]e } x\ | j ƒ  D]N } xE | j ƒ  D]7 } | j } | | k rE | d k rE | j | ƒ qE qE Wq2 Wq Wx] t | ƒ D]O \ } }	 | d |	 j ƒ  |	 j ƒ  f 7} | d k rÚ | d 7} q• | d 7} q• W| S(   NR@   s   @pointmaster 'a' {alta} ons   @pointmaster '%s' {alt%s} i    s   on
s   off
(   Rz   t   chainsR¥   R8   Rp   Ry   R+   (
   R3   t   altidst   altid_controlst   txtt   modelR2   R´   R8   Re   t   altid(    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/kinemage/validation.pyt   get_altid_controls3  s     	c         C   sˆ  | d  k r d } n  | j j } t d | ƒ } | j j } | j ƒ  } t j j d t ƒ } | j	 }	 | j
 d | d | ƒ }
 |
 j } i  } x“ | j D]ˆ } | | j d d d !| | j d	 d d !k r— | j | j d ƒ d  k rý g  | | j d <n  | | j d j | j d	 ƒ q— q— Wt ƒ  } t d
 | ƒ } | d k rT| | 7} n  | d | 7} g  } t d | d t ƒ } t d | d t ƒ } t d | d t ƒ } d } xw| j ƒ  D]i} x`| j ƒ  D]R} | j | k r| d | | j f 7} | j | j ƒ n  | t d | d | d | d | d | ƒ 7} | j ƒ  r„| t d | d | d | ƒ 7} | t d | d | d | ƒ 7} n  | t d |	 d | d | d
 | ƒ 7} | t d | d | d | d
 | ƒ 7} | j ƒ  rü| t d | j d | j ƒ 7} n  | t  d
 | d | ƒ 7} | d	 7} qÍWqºW| t! d
 | d | ƒ 7} | t" ƒ  7} t# |  d ƒ } x | D] } | j$ | ƒ qcW| j% ƒ  |  S(   Nt   PDBR   t   defaultt   flagsR    i    i	   i   i   R3   R@   s   @group {%s} dominant animate
t   outliers_onlys+   @subgroup {%s} dominant master= {chain %s}
R2   Rð   R   R½   RÝ   RÍ   R¾   R1   R^   R�   R”   Rƒ   t   w(&   Rk   t   all_chain_proxiesR   R   R    t   geometry_restraints_managerR   R,  RL   R1   t   pair_proxiesR^   R[   R*   RÌ   Rp   R   R)  R   R   R   Rz   R#  R,   R  t
   is_proteinRÕ   RÁ   R?   R`   R—   R¡   R»   R�   R"  t   filet   writet   close(   t   ft   processed_pdb_fileR½   Rƒ   R3   R   R    t   geometryR,  R1   R1  R^   t   quick_bond_hashR_   R°   R%  t   initiated_chainsRÍ   t   cbt   ramat   counterR'  R2   t   outfileRŽ   (    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/kinemage/validation.pyt   make_multikinH  s†    				&		

"



c           C   s   d S(   Ns+  
phenix.kinemage file.pdb [params.eff] [options ...]

Options:

  pdb=input_file        input PDB file
  cif=cif_file          input custom definitions (ligands, etc.)
  keep_hydrogens=False  keep input hydrogen files (otherwise regenerate)

Example:

  phenix.kinemage pdb=1ubq.pdb cif=ligands.cif
(    (    (    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/kinemage/validation.pyt   usage�  s    c         C   s"  t  |  ƒ d k s6 d |  k s6 d |  k s6 d |  k rH t t ƒ  ƒ ‚ n  d  } t ƒ  } d d  l } | j j d |  d | d d ƒ } | j d | d ƒ } | j	 ƒ  } | j
 j d  k rî t  | d	 ƒ d k sÔ t ‚ | d	 d } | j } n | j
 j } | rVt j j | ƒ rVt j | ƒ }	 t j j |	 j ƒ  j d ƒ d ƒ j d ƒ d } n t d ƒ ‚ |	 d  k	 stt ‚ d  }
 d  } t  | j
 j ƒ d k rßt  | d
 ƒ d k rëg  }
 x% | d
 D] } |
 j | j ƒ q¿Wqën | j
 j }
 t j j ƒ  } t j j ƒ  } |
 d  k r¢xQ |
 D]I } y t j j d | ƒ } Wqt k
 rdt d t | ƒ ƒ ‚ qXqW| d  k r¢x' | | g D] } | j d | ƒ q‚Wq¢n  t j  d | d | d |	 d t! d t! ƒ } | j
 j" d  k	 rí| j
 j" } n
 | d } t# d | d | d | d | j
 j$ ƒ } | S(   Ni    s   --helps   --hs   -hiÿÿÿÿt   argsR¢   t   input_typesR   t   cift   sourcesR   i   R#   t   .s   PDB file does not existt	   file_names   Unknown file format: %st
   cif_objectt   mon_lib_srvt   ener_libt   pdb_inpt   for_dihedral_referencet6   substitute_non_crystallographic_unit_cell_if_necessarys   .kinR6  R7  R½   Rƒ   (   s   pdbs   cif(%   R’   R   R@  Rk   R   t   iotbx.utilst   utilst   process_command_line_inputst   fetchR£   t   kinemageR   t   AssertionErrorRF  t   ost   patht   existst   inputt   basenamet   source_infot   splitR   RC  Rp   R   t   serverRI  t   read_cifR¬   R   t   process_cif_objectR   t   processRL   t   out_fileR?  Rƒ   (   RA  R½   R¢   R   t   input_objectst	   work_philt   work_paramst   file_objRF  t   pdb_iot   cif_fileRG  RC  RH  RI  t   srvR7  R>  (    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/kinemage/validation.pyt   runž  sl    6		5		
R*  c         C   s  |  j  d  k	 s t ‚ t d | ƒ } | j ƒ  j ƒ  } t j j d t ƒ } | j	 }	 | j
 d | d | ƒ }
 |
 j } i  } x“ | j D]ˆ } | | j d d d !| | j d d d !k r… | j | j d ƒ d  k rë g  | | j d <n  | | j d j | j d ƒ q… q… Wt ƒ  } t d	 | ƒ } | d
 k rB| | 7} n  | d | 7} g  } d } x| j ƒ  D]q} xh| j ƒ  D]Z} | j | k r»| d | | j f 7} | j | j ƒ n  | t d | d | d | d | d | ƒ 7} | j ƒ  rWd  |  j |  j g k st ‚ | t d | d | d |  j ƒ 7} | t d | d | d |  j ƒ 7} n  | |  j  j d | j ƒ 7} | j ƒ  r³|  j d  k	 s”t ‚ | |  j j d | j ƒ 7} n  | t d	 | d | ƒ 7} | d 7} q|WqiW| t d	 | d | ƒ 7} | t ƒ  7} | S(   NR   R+  R,  R    i    i	   i   i   R3   R@   s   @group {%s} dominant animate
s+   @subgroup {%s} dominant master= {chain %s}
R2   Rð   R   R½   RÝ   RÍ   R¾   R�   Rƒ   (    t
   restraintsRk   RR  R   R   t   extract_xyzR   R,  RL   R1   R1  R^   R[   R*   RÌ   Rp   R   R)  Rz   R#  R,   R  R2  R   R   RÕ   RÁ   R‘   R   R»   R�   R"  (   t   resultR   R8  t
   probe_fileRƒ   R½   R   R    R,  R1   R1  R^   R9  R_   R°   R%  R:  R=  R'  R2   (    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/kinemage/validation.pyt$   export_molprobity_result_as_kinemageÚ  sj    			&	


(C   t
   __future__R    RS  R�   R   R   t   mmtbxR   t   mmtbx.chemical_componentsR   t   mmtbx.validation.rotalyzeR   t   mmtbx.validation.ramalyzeR   t   mmtbx.validation.cbetadevR   t   mmtbx.validationR   RD   R   t	   iotbx.pdbR	   t   libtbxR
   RE   R   t   cctbxR   t   mmtbx.monomer_libraryR   R   t   iotbx.pdb.rna_dna_detectionR   t
   iotbx.philt   libtbx.utilsR   R   t   libtbx.str_utilsR   R   R   R?   RX   R`   Rj   R0   R]   Rw   Rl   R�   Rk   R—   R›   R»   RÁ   RÕ   Rà   Rã   RL   R  R   R"  R)  R?  R@  Rf  Rk  (    (    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/kinemage/validation.pyt   <module>   s\   				,		3	'	(	
		9	
	+		ÿ @			G		A