ó
¢™xTc           @   sc  d  d l  m 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 e f d	 „  ƒ  YZ d
 e f d „  ƒ  YZ d e f d „  ƒ  YZ d d d „ Z d „  Z d „  Z d d d „ Z d e f d „  ƒ  YZ d „  Z d „  Z d „  Z d „  Z d e j f d „  ƒ  YZ d e j e f d „  ƒ  YZ e d „ Z  d S(   iÿÿÿÿ(   t   division(   t   residuet
   validation(   t   graphics(   t
   data_plots(   t   format_value(   t   SorryNt   rotamerc           B   s{   e  Z d  Z d d d d d g Z e j e Z e d „  ƒ Z d „  Z d „  Z	 d	 „  Z
 e d
 d „ Z d „  Z d „  Z RS(   sL   
  Result class for protein sidechain rotamer analysis (phenix.rotalyze).
  t   scoret
   evaluationt   rotamer_namet
   chi_anglest
   incompletec           C   s   d d S(   Ns   %-20s %8s %6s   %-20st   Residuet   Rotamert   Scores
   Chi angles(   R   R   R   s
   Chi angles(    (    (    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/validation/rotalyze.pyt   header   s    c         C   sF   t  |  j ƒ d k  r. t d |  j ƒ  ƒ ‚ n  |  j d |  j d f S(   Ni   s,   Less than 2 chi angles for this residue (%s)i    i   (   t   lenR   t
   ValueErrort   id_str(   t   self(    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/validation/rotalyze.pyt   get_chi1_chi2   s    c         C   s&   d |  j  ƒ  |  j |  j |  j ƒ  f S(   Ns   %-20s %8s %6.2f   %-20s(   R   R
   R   t   format_chi_angles(   R   (    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/validation/rotalyze.pyt	   as_string"   s    c         C   s-   d |  j  |  j |  j |  j |  j j ƒ  f S(   Ns   %s%4s%1s %s(   t   chain_idt   resseqt   icodet   altloct   resnamet   strip(   R   (    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/validation/rotalyze.pyt
   id_str_old'   s    t   ,c         C   s^   g  } xH |  j  D]= } | s( | d  k	 r | j t d | d d ƒj ƒ  ƒ q q W| j | ƒ S(   Ns   %.1ft   replace_none_witht    (   R   t   Nonet   appendR   R   t   join(   R   t   padt   sept	   formattedt   chi(    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/validation/rotalyze.pyR   +   s    c      	   C   sk   t  d |  j ƒ } t  d |  j ƒ } t |  j ƒ } d |  j ƒ  | | |  j d t d d ƒ |  j |  j	 f S(   Ns   %.2fs   %.1fs   %s:%s:%s:%s:%s:%sR%   R&   t   :(
   R   t	   occupancyR   t   listR   R   R   t   TrueR	   R
   (   R   t   s_occt   s_scoret   chis(    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/validation/rotalyze.pyt
   format_old4   s    c         C   s0   |  j  d |  j |  j f |  j g t |  j ƒ S(   Ns   %s %s(   R   R   t   residR   R+   R   (   R   (    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/validation/rotalyze.pyt   as_table_row_phenix=   s    (   t   __name__t
   __module__t   __doc__t   __rotamer_attr__R   t	   __slots__t   staticmethodR   R   R   R   t   FalseR   R0   R2   (    (    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/validation/rotalyze.pyR   
   s   							t   rotamer_ensemblec           B   s2   e  Z d  Z e j Z d „  Z d „  Z d „  Z RS(   s=   Container for validation results for an ensemble of residues.c         C   sr   |  j  | d ƒ g  | D] } | j ^ q |  _ g  | D] } | j ^ q7 |  _ g  | D] } | j ^ qV |  _ d  S(   Ni    (   t   _copy_constructorR   R
   R   (   R   t   all_resultst   r(    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/validation/rotalyze.pyt   __init__D   s    c         C   sU   g  } x< t  |  j ƒ D]+ } |  j j | ƒ } | j | | f ƒ q Wt | d „  ƒ S(   Nc         S   s   t  | d |  d ƒ S(   Ni   (   t   cmp(   t   at   b(    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/validation/rotalyze.pyt   <lambda>O   s    (   t   setR
   t   countR#   t   sorted(   R   t   rotamerst   rot_idt	   n_rotamer(    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/validation/rotalyze.pyt   rotamer_frequenciesJ   s
    c         C   sR   |  j  ƒ  } g  | D] \ } } d | | f ^ q } d |  j ƒ  d j | ƒ f S(   Ns   %s (%d)s   %-20s %ss   , (   RI   R   R$   (   R   RF   t   ridt   n_rott   rot_out(    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/validation/rotalyze.pyR   Q   s    )(   R3   R4   R5   R   R7   R>   RI   R   (    (    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/validation/rotalyze.pyR:   A   s
   			t   rotalyzec           B   sø   e  Z e j d  d d d d g Z d Z d Z e d 7Z d d	 d
 d d d d g Z d d d d d d d g Z d g d Z d „  Z	 d e
 e
 e j e
 d „ Z d „  Z e j d d „ Z d „  Z d „  Z d „  Z d „  Z d! d d „ Z d  „  Z RS("   t	   n_allowedt	   n_favoredt   out_percentt   outlier_thresholdt   data_versions"   Analyze protein sidechain rotamerss-   residue:occupancy:score%:chi1:chi2:chi3:chi4:s   evaluation:rotamert   ChainR   R   t   Chi1t   Chi2t   Chi3t   Chi4s   %ss   %.2fs   %.1fix   i   c         C   s   t  S(   N(   R   (   R   (    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/validation/rotalyze.pyt   get_result_class`   s    t   500c   %   	   C   s/  t  j |  ƒ d |  _ d |  _ d d l m } d d l m } d d l m	 }	 d d l
 m }
 | |  _ |  j d k rƒ d |  _ n+ |  j d	 k rž d
 |  _ n t d | ƒ ‚ | | ƒ } | j d | ƒ } | j	 ƒ  } |
 j d | ƒ } i  } x| j ƒ  D]} x| j ƒ  D]ô} | r1|
 j d | ƒ } n	 | j } xÇ| j ƒ  D]¹} t | ƒ } x¤| j ƒ  D]–} t | ƒ } | j } t | ƒ } i | d 6| j d 6| j d 6| j d 6| d 6| d 6| d 6} | j | j ƒ } t d | ƒ } y | j  | | ƒ } WnW t! k
 r]| rft" | d <t# | �  } | d | j$ ƒ  IJ|  j% j& | ƒ qfqfn X| d  k	 rfd  | k r|qfn  | j( ƒ  j) ƒ  } | d k r£d } n  | j* | | ƒ } | d  k	 rü|  j+ d 7_+ | d | d <| j, | j) ƒ  | d t- ƒ}  |  }! | j. | j) ƒ  |! ƒ }! |  j/ | ƒ }" |" | d <|" d  k rWt" | d! <|" | d" <n= t- | d! <| j0 | |  ƒ | d" <| d" d# k r”d$ | d" <n  x# t1 |  ƒ d% k  r¹|  j& d  ƒ q—W|  | d& <t# | �  } | j2 ƒ  sã| rù|  j% j& | ƒ qùqüqfqfWqGWqWqý W|  j3 ƒ  \ }# }$ |$ d' |  _4 d  S((   Ni    iÿÿÿÿ(   t   SidechainAngles(   t   rotamer_eval(   t	   RotamerID(   t   utilsRY   g{®Gáz„?t   8000gú~j¼t“h?s6   data_version given to RotamerEval not recognized (%s).RR   t	   hierarchyt   chainR   R   R   R   R   t   xyzR*   t
   atom_groupR   s"   %s is missing some sidechain atomst   mset   meti   id   R   t   symmetryR	   t   OUTLIERt   outlierR
   R!   t   UNCLASSIFIEDi   R   g      Y@(5   R   R>   RN   RO   t   mmtbx.rotamer.sidechain_anglesRZ   t   mmtbx.rotamerR[   t   mmtbx.rotamer.rotamer_evalR\   t   mmtbx.validationR]   RR   RQ   R   t   RotamerEvalt   use_segids_in_place_of_chainidst   modelst   chainst   get_segid_as_chainidt   idt   residue_groupst   construct_complete_sidechaint   atom_groupst
   get_centerR   t   get_occupancyR   R   R   t   gett   get_residue_keyt   measureChiAnglest   AttributeErrorR,   R   R   t   resultsR#   R"   t   lowerR   t   evaluatet   n_totalt	   wrap_chisR9   t   wrap_symt   evaluateScoret   identifyR   t
   is_outliert   get_outliers_count_and_fractionRP   (%   R   t   pdb_hierarchyRR   t   outliers_onlyt   show_errorst   outt   quietRZ   R[   R\   R]   t   sidechain_anglest   rotamer_evaluatort
   rotamer_idt
   use_segidst   current_rotamerst   modelR`   R   t   rgt   all_dictRb   t   coordsR   R*   t   kwargst	   atom_dictt   res_keyR/   t   resultt   cur_rest   valueR€   t   sym_chisR	   t	   out_countRP   (    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/validation/rotalyze.pyR>   b   s¬    			  						




		


	
)c         C   sX   | d k r |  j  d 7_  d S| |  j k rA |  j d 7_ d S|  j d 7_ d Sd  S(   Ng{®Gáz”?i   t   Favoredt   AllowedRf   (   RO   RQ   RN   t
   n_outliers(   R   R™   (    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/validation/rotalyze.pyR‚   Á   s    R!   c         C   s%   | | d |  j  |  j ƒ  f IJd  S(   Ns#   SUMMARY: %.2f%% outliers (Goal: %s)(   RP   t   get_outliers_goal(   R   R‰   t   prefix(    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/validation/rotalyze.pyt   show_summaryÌ   s    
c         C   s   |  j  d k r d Sd Sd  S(   NRY   s   < 1%s   < 0.3%(   RR   (   R   (    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/validation/rotalyze.pyRŸ   Ð   s     c         C   s   d S(   Ns   > 98%(    (   R   (    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/validation/rotalyze.pyt   get_favored_goalÔ   s    c         C   s   d S(   NR!   (    (   R   (    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/validation/rotalyze.pyt	   coot_todo×   s    c   	      C   s¼   | d k s t  ‚ g  } g  } x‘ t |  j ƒ D]€ \ } } | j | k r. | d k sa | j ƒ  r® | j ƒ  \ } } | j | | | j ƒ  | j ƒ  f ƒ | j | j ƒ q® q. q. W| | f S(   Nt   Allt   Outlier(   R¤   R¥   (	   t   AssertionErrort	   enumerateR|   R   R„   R   R#   t	   simple_idRa   (	   R   t   residue_namet
   point_typet   pointsR“   t   iR   t   chi1t   chi2(    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/validation/rotalyze.pyt   get_plot_dataÚ   s    %s&   MolProbity - Sidechain Chi1/Chi2 plotsc         C   s>   d d  l  } | j j j d | d | d |  ƒ } | j ƒ  d  S(   Niÿÿÿÿt   parentt   titleR   (   t   wxtbx.plots.molprobityt   plotst
   molprobityt   rotalyze_framet   Show(   R   R°   R±   t   wxtbxt   frame(    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/validation/rotalyze.pyt   display_wx_plotsæ   s    c         C   sX   g  } xK |  j  D]@ } | j ƒ  r | j | j | j | j | j | j f ƒ q q W| S(   N(   R|   R„   R#   R   R1   R   R   Ra   (   R   t   dataR—   (    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/validation/rotalyze.pyt   as_coot_dataí   s    N(   R3   R4   R   R7   t   program_descriptiont   output_headert   gui_list_headerst   gui_formatst   wx_column_widthsRX   R9   t   syst   stdoutR>   R‚   R¡   RŸ   R¢   R£   R¯   R"   R¹   R»   (    (    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/validation/rotalyze.pyRM   V   s.   
	Z					gú~j¼t“h?c         C   sÚ   | j  |  j ƒ } |  j } y: | j |  | | ƒ }	 | j |  j j ƒ  j ƒ  |	 ƒ }
 Wn t k
 ri d SX| j	 | j ƒ  |	 d t
 ƒ} | j | j ƒ  | ƒ } |
 d  k r° d S|
 | k  rÉ d |	 |
 f S| |	 |
 f Sd  S(   NRe   Rf   (   NNN(   NNN(   Rx   R   R   Rz   R~   R}   R   t	   ExceptionR"   R€   R9   Rƒ   (   Rb   R‹   RŒ   R�   R’   RQ   t
   sites_cartR•   R   R/   R™   R€   R
   (    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/validation/rotalyze.pyt   evaluate_rotamerõ   s     	c         C   s¹   g  } d } |  d k r) | j  |  ƒ | Sxg t |  ƒ D]Y \ } } | d k r^ | j  | ƒ q6 | d k s‚ | d k r6 | d k r6 | | 7} q6 q6 Wt | ƒ d k rµ | j  | ƒ n  | S(   NR!   Rh   Rf   t   Cg_exot   Cg_endot   tt   pt   mt   -t   ?t   0t   9i    (   s   UNCLASSIFIEDs   OUTLIERRÆ   RÇ   (   RÈ   RÉ   RÊ   (   RË   RÌ   (   R#   R§   R   (   R   t   split_rotamert   multiR¬   t   c(    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/validation/rotalyze.pyt   split_rotamer_names  s    $c         C   sÕ   |  j  } | d k r d } n  d  } xª |  j ƒ  D]œ } | j ƒ  | j } | d d !} | d  k r | | k rÍ | d } qÍ q1 | | k r1 | | d k r´ t d | j ƒ  ƒ ‚ n  | | d k sÍ t ‚ q1 q1 W| S(   NR!   t    i   i   sÚ   Incompatible identifiers for one or more atoms in a residue:
%s
This is usually caused by atoms with a different segid from the rest of the
residue.  You can use phenix.pdbtools or phenix.pdb_editor to reset the
segid.(   R   R"   t   atomst   pdb_label_columnst   segidR   t   format_atom_recordR¦   (   Rb   R   t   keyt   atomt	   cur_labelt
   cur_altloc(    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/validation/rotalyze.pyRy     s     		RY   c         C   s  t  } | d k r d } n! | d k r0 d } n t d ƒ ‚ xÉ |  j ƒ  D]» } | j | j ƒ }	 y: | j | |	 ƒ }
 | j | j j ƒ  j	 ƒ  |
 | ƒ } Wn$ t
 k
 rÁ d  } d  } | | f SX| d  k rÞ t  } | | f S| | k  rú t } | | f S| | f SqI Wd  S(   NRY   g{®Gáz„?R^   gú~j¼t“h?s1   data_version given to RotamerEval not recognized.(   R9   R   Ru   Rx   R   Rz   R~   R   R}   R   RÃ   R"   R,   (   t   residue_groupt   saR=   R’   RR   RÄ   R„   RQ   t   agR•   R/   R™   (    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/validation/rotalyze.pyt   evaluate_residue5  s,     	 	(

t   residue_evaluatorc           B   s&   e  Z d  d „ Z d „  Z d „  Z RS(   RY   c         C   sT   d d l  m } d d l m } | t ƒ |  _ | |  _ | j d |  j ƒ |  _ d  S(   Niÿÿÿÿ(   RZ   (   R[   RR   (	   Ri   RZ   Rj   R[   R9   RÝ   RR   Rm   R=   (   R   RR   RZ   R[   (    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/validation/rotalyze.pyR>   T  s
    	c         C   s:   t  | ƒ } t d | d |  j d |  j d | d |  j ƒ S(   NRÜ   RÝ   R=   R’   RR   (   Rt   Rß   RÝ   R=   RR   (   R   RÜ   R’   (    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/validation/rotalyze.pyRß   \  s    		c         O   s   |  j  | | Ž  S(   N(   Rß   (   R   t   argst   kwds(    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/validation/rotalyze.pyt   __call__e  s    (   R3   R4   R>   Rß   Rã   (    (    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/validation/rotalyze.pyRà   S  s   		c         C   s1   x* |  j  ƒ  D] } | j d k r | j Sq Wd  S(   Ns    CA (   RÔ   t   nameRa   R"   (   R   RÙ   (    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/validation/rotalyze.pyRv   h  s    c         C   s%   x |  D] } | j  ƒ  s t Sq Wt S(   N(   t   element_is_hydrogenR,   R9   (   RÔ   RÙ   (    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/validation/rotalyze.pyt   has_heavy_atomsn  s    c         C   sI  |  d  k	 rEi  } i  } x|  j ƒ  D]} t | j ƒ  ƒ sC q% n  xÂ | j ƒ  D]´ } | j | j ƒ d  k r÷ | j | j j d d d ƒ ƒ d  k r± | | j j d d d ƒ =q÷ | j | j j d d d ƒ ƒ d  k r÷ | | j j d d d ƒ =q÷ n  | | | j <qP Wi  } | j | ƒ | | | j <q% Wt	 | ƒ d k rE| Sn  i  S(   Nt   Ht   Di   i    (
   R"   Ru   Ræ   RÔ   Rx   Rä   t   replacet   updateR   R   (   RÜ   t   complete_dictR•   RÞ   RÙ   t
   clone_dict(    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/validation/rotalyze.pyRt   t  s&    ''c         C   s�   d } x> |  j  ƒ  D]0 } | j | k r | j d k  r | j } q q W| d k ry t g  |  j  ƒ  D] } | j ^ qc ƒ S| Sd  S(   Ng        i   (   RÔ   t   occt   max(   Rb   t   max_partial_occRÙ   (    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/validation/rotalyze.pyRw   ‹  s    &t   rotamer_plot_mixinc           B   s   e  Z d d „ Z RS(   i<   i´   i,  c         C   si   |  j  j ƒ  } | j d ƒ | j d d d g ƒ | j d ƒ | j t | ƒ ƒ | j t d d ƒd  S(   NRT   i<   i´   i,  RU   t   colors   0.75(	   t   plott   get_axest
   set_xlabelt
   set_xtickst
   set_ylabelt
   set_yticksR+   t   gridR,   (   R   t   y_markst   axes(    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/validation/rotalyze.pyt
   set_labels˜  s    (   i<   i´   i,  (   R3   R4   Rû   (    (    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/validation/rotalyze.pyRð   —  s   t   rotamer_plotc           B   s   e  Z d  „  Z RS(   c         O   s-   t  j j |  | | Ž t j |  | | Ž d  S(   N(   R   t   simple_matplotlib_plotR>   Rð   (   R   Rá   Râ   (    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/validation/rotalyze.pyR>   ¡  s    (   R3   R4   R>   (    (    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/validation/rotalyze.pyRü      s   c   	      C   sy   t  d |  d | d d ƒ \ } } t ƒ  } d | } | j d | d d d	 g d
 | d | d | d d ƒ | j | ƒ d  S(   Nt   rotalyze_dataR©   Rª   R¤   s   Chi1-Chi2 plot for %st   statst   contoursgB•š=Ð
¬?g|
€ñÂ?R±   R«   Ra   t   colormapt   Blues(   t   get_residue_rotamer_dataRü   t	   draw_plott
   save_image(	   Rþ   t   rotarama_dataR©   t	   file_namet   show_labelsR«   R“   RÉ   R±   (    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/validation/rotalyze.pyt   draw_rotamer_plot¥  s    	
	(!   t
   __future__R    Rl   R   R   R   t   iotbxR   t   libtbx.str_utilsR   t   libtbx.utilsR   RÁ   R   R:   RM   R"   RÅ   RÒ   Ry   Rß   t   objectRà   Rv   Ræ   Rt   Rw   t   rotarama_plot_mixinRð   Rý   Rü   R,   R	  (    (    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/validation/rotalyze.pyt   <module>   s.   7¥								