ó
²™xTc           @   s  d  d l  m Z d  d l m Z d  d l Z d  d l 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 d d	 d
 d d d d d d d d d d d d d d d d d d d d d d  d! d" g Z d# d$ d% d& d' d( d) d* d+ d, d- d. g Z d d d d d d" g Z d/ d0 d1 d2 d3 d4 d5 d6 d7 d8 d9 d: d; d< d= d> d? d@ dA dB dC dD dE dF dG dH dI dJ dK g Z dL dM dN dO dP dQ dR dS dT dU dV dW g Z e e ƒ e e ƒ k sÀt ‚ g  Z x; e D]3 Z e e k róe j dX e ƒ qÍe j e ƒ qÍWdY j e ƒ Z dY j g  e D] Z e
 j dY dZ e ƒ ^ q ƒ Z d[ e e f Z e j j d\ e ƒ Z  d] „  Z! d^ „  Z" d_ „  Z# e$ d` „ Z% da „  Z& d d d db „ Z( dc dd de „ Z) e* df „ Z+ dg „  Z, d# dh „ Z- d di „ Z. e  j/ ƒ  d e* e$ dj „ Z0 dk „  Z1 d S(l   iÿÿÿÿ(   t   division(   t   flexN(   t   Sorry(   t   easy_picklet   r_workt   r_freet   pdb_header_r_workt   pdb_header_r_freet   r_work_cutoffst   r_free_cutoffst   completeness_in_ranget   completeness_d_min_inft   completeness_6A_inft   adp_mean_allt   adp_min_allt   adp_max_allt   wilson_bt   solvent_content_via_maskt	   bond_rmsdt   bond_max_deviationt
   angle_rmsdt   angle_max_deviationt   dihedral_rmsdt   dihedral_max_deviationt   planarity_rmsdt   planarity_max_deviationt   chirality_rmsdt   chirality_max_deviationt   rama_favoredt   rama_allowedt   rama_outlierst   rotamer_outlierst
   clashscoret   high_resolutiont   low_resolutiont   adp_min_backbonet   adp_min_sidechaint   adp_min_solventt   adp_max_backbonet   adp_max_sidechaint   adp_max_solventt   adp_mean_backbonet   adp_mean_sidechaint   adp_mean_solventt   unit_cell_volumes   R-works   R-frees   R-work (PDB)s   R-free (PDB)s   R-work (after cutoff)s   R-free (after cutoff)s   Completeness in ranget   Completenesss   Completeness to 6As	   Average Bs	   Minimum Bs	   Maximum Bs   Wilson Bs   Solvent contents   RMSD(bonds)s
   Bonds max.s   RMSD(angles)s   Angles max.s   RMSD(dihedrals)s   Dihedrals max.s   RMSD(planarity)s   Planarity maxs   RMSD(chirality)s   Chirality max.s   Ramachandran favoreds   Ramachandran alloweds   Ramachandran outlierss   Rotamer outlierst
   Clashscores   High resolutions   Low resolutions   Min. backbone ADPs   Min. sidechain ADPs   Min. solvent ADPs   Max. backbone ADPs   Max. sidechain ADPs   Max. solvent ADPs   Mean backbone ADPs   Mean sidechain ADPs   Mean solvent ADPs   Unit cell volumes   *%st    t   _s
    database_file_name = None
    .type = str
    .style = noauto
  keys_to_show = %s
    .type = choice(multi=True)
    .short_caption = Statistics to display
    .caption = %s
    .style = bold hide_label
  number_of_histogram_slots = None
    .type = int
    .help = Number of histogram slots for the final histogram to be used to             draw the POLYGON's rays.  Not used in GUI.
    .input_size = 64
    .style = noauto bold
  max_reject_fraction = 0.1
    .type = float
    .help = Fraction of models allowed to be rejected as outliers.
    .style = bold
  max_models_for_default_filter = 1000
    .type = int
    .style = bold
  filter
    .multiple = True
    .help = Selection keys.
    .short_caption = Filtering options
    .style = noauto
  {
      key = twinned number_of_atoms atom_types_and_count_str angle_rmsd             pdb_header_year high_resolution planarity_max_deviation             low_resolution number_of_reflections             adp_mean_sidechain pdb_header_sigma_cutoff completeness_d_min_inf             dihedral_max_deviation             r_work_cutoffs pdb_header_r_free             bond_rmsd non_bonded_min_distance adp_min_all r_free             number_of_residues_with_altlocs pdb_code resname_classes             unit_cell_volume chirality_max_deviation space_group             anomalous_flag wilson_b pdb_header_tls unit_cell rama_favored             adp_mean_solvent rama_allowed             number_of_npd pdb_header_high_resolution occupancy_mean             overall_scale_b_cart adp_max_all number_of_anisotropic             pdb_header_matthews_coeff pdb_header_solvent_cont             pdb_header_r_work solvent_content_via_mask clashscore             rama_outliers adp_min_solvent adp_max_backbone             adp_mean_backbone rotamer_outliers chirality_rmsd             c_beta_deviations adp_min_backbone angle_max_deviation             rmsd_adp_iso_or_adp_equiv_bonded completeness_6A_inf             adp_min_sidechain dihedral_rmsd pdb_header_low_resolution             completeness_in_range pdb_header_program_name bond_max_deviation             occupancy_min r_work planarity_rmsd adp_mean_all n_refl_cutoffs             r_free_cutoffs adp_max_solvent number_of_Fobs_outliers             occupancy_max test_set_size adp_max_sidechain
      .type = choice(multi=False)
      .optional = True
    value_min = None
      .type = float
      .short_caption = Minimum value
    value_max = None
      .type = float
      .short_caption = Maximum value
    target_value= None
      .type = str
      .short_caption = Target value
  }
s   
polygon {
  %s
}c         C   s/   i  } x" |  D] } | j  | | | ƒ q W| S(   N(   t
   setdefault(   t   select_keyst   database_dictt   resultt   key(    (    sD   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/polygon/__init__.pyt   select_database_dict_by_keys‚   s    c         C   s  t  j ƒ  } xK |  D]C } t } y t | ƒ } Wn t k
 rH t } n X| j | ƒ q W| j t ƒ d k r~ t d ƒ ‚ n  d } x! |  D] } | | j d ƒ 7} q‹ W| d k rç t  j	 ƒ  } xT |  D] } | j t	 | ƒ ƒ qÇ Wn0 t  j
 ƒ  } x! |  D] } | j t | ƒ ƒ qú W| S(   Ni    s   Non-numerical values.t   .(   R   t   boolt   Truet   floatt	   Exceptiont   Falset   appendt   countt   RuntimeErrort   intt   double(   t   valuest   is_digit_selectiont   kvt   flagt   tmpt   pointst
   new_values(    (    sD   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/polygon/__init__.pyt   convert_to_numericˆ   s*     
c         C   s>   i  } x1 |  j  ƒ  D]# } | j | |  | j | ƒ ƒ q W| S(   N(   t   keysR1   t   select(   R3   t	   selectionR4   R5   (    (    sD   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/polygon/__init__.pyt   select_dictŸ   s    !c         C   sA   |  | } t  d | ƒ } t j | d | ƒ} t d |  d | ƒ S(   NRB   t   reverseR3   RL   (   RI   R   t   sort_permutationRM   (   R3   R5   RN   RB   RH   RL   (    (    sD   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/polygon/__init__.pyt   order_by_value¥   s    
c         C   s^   t  j |  | d j ƒ  t ƒ } x( | D]  } |  | } | | d k M} q' Wt d |  d | ƒ S(   Ni    t   noneR3   RL   (   R   R8   t   sizeR9   RM   (   R3   RJ   RL   R5   RB   (    (    sD   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/polygon/__init__.pyt   leave_all_available_entries«   s
     
c   
      C   sœ  |  | } | d  k	 r‘ | | g j d  ƒ d k s7 t ‚ t j | j ƒ  t ƒ } x7t | ƒ D]. \ } } | j | ƒ d k r\ t | | <q\ q\ Wnø | | g j d  ƒ d k  s² t ‚ | | g j d  ƒ d k râ | | k  sâ t ‚ n  t	 d | ƒ }	 t j |	 j ƒ  t ƒ } | d  k	 rIt
 |	 t j ƒ r6t | ƒ } n  | |	 | k M} n  | d  k	 r‰t
 |	 t j ƒ rvt | ƒ } n  | |	 | k  M} n  t d |  d | ƒ S(   Ni   i    RB   R3   RL   (   t   NoneR>   t   AssertionErrorR   R8   RR   R<   t	   enumerateR9   RI   t
   isinstanceR@   RM   (
   R3   R5   t	   value_mint	   value_maxt   target_valueRB   RL   t   it   vRH   (    (    sD   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/polygon/__init__.pyt   filter_database²   s*    
! !   g-Cëâ6?i   c         C   s�  |  | } t  d | ƒ } | j ƒ  } | d k r5 d  SxSt rŠ|  | } t  d | ƒ } t j | j ƒ  t ƒ } t j d | d | ƒ }	 |	 j ƒ  }
 x� t |	 j ƒ  ƒ D]{ \ } } |	 j ƒ  |	 j	 ƒ  | d } | | } t
 d |
 | ƒ }
 | | | k  r| | |
 k | | k @M} n  | }
 q¦ W| j t ƒ | j t ƒ } } | d k rTPn  | | t | | ƒ k rrPn  t d |  d | ƒ }  q8 W|  S(   NRB   i    t   datat   n_slotsi   R3   RL   (   RI   RR   R9   R   R8   t	   histogramt   data_minRV   t   slotst
   slot_widtht   maxR>   R<   R@   RM   (   R3   R5   t   max_reject_fractiont   edge_tolerance_smallR_   RB   RH   RR   RL   R`   t   lR[   t   st   rt   leavet   remove(    (    sD   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/polygon/__init__.pyt   filter_histogram_of_key_valueÈ   s4    
 	


  c         C   sœ  g  } t  j d |  d | ƒ } | j ƒ  } xl t | j ƒ  ƒ D]X \ } } | j ƒ  | j ƒ  | d } | j | | | g ƒ d | | | f GH| } q= W| r˜d GHg  }	 x¯ t | ƒ D]¡ \ } }
 t  j ƒ  } x_ d d d g D]N } | | d k rß | | t | ƒ k  rß | j t	 | | | d ƒ ƒ qß qß W|	 j |
 d |
 d t  j
 | ƒ f ƒ q· Wx9 |	 D]. }
 d |
 d |
 d t d	 |
 d ƒ f GHqcWn  | S(
   NR^   R_   i   s   %8.4f %8.4f %ds   ... smooth histogramiÿÿÿÿi    i   s   %.0f(   R   R`   Ra   RV   Rb   Rc   R=   RA   t   lenR:   t   meanR@   (   R^   R_   t   smootht   tripletsR`   Rg   R[   Rh   Ri   t   triplets_smootht   tRB   t   j(    (    sD   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/polygon/__init__.pyt   show_histogramç   s(    
&&+/c         C   s   t  j d |  d | ƒ } | S(   NR^   R_   (   R   R`   (   R^   R_   R`   (    (    sD   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/polygon/__init__.pyt   convert_to_histogramý   s    c         C   s   t  d |  d | ƒ }  t j ƒ  } x% |  | D] } | j t | ƒ ƒ q, Wt j | | ƒ } t j | ƒ } | | k j ƒ  } | j ƒ  d k s• t	 ‚ | | j ƒ  d }	 t
 d |	 | d ƒ }
 t | j ƒ  d |	 | d ƒ } d GHd Gt |
 |	 ƒ GHd Gt | |	 ƒ GHt t |
 |	 ƒ t | |	 ƒ ƒ } |	 | |	 | }
 } | d k r¿|
 d k rwd	 } d
 Gd GHd G| GHqÑ|
 | k o˜t | ƒ d k n rÑ|
 d	 8}
 d
 G|
 GHd Gd GHqÑn d
 G| GHd G| GHt j | j ƒ  t ƒ } x! t |
 | ƒ D] } t | | <qùWt d |  d | ƒ S(   NR3   R5   i    i   i   s   apply_default_filter:s"     found data points dmin->higher =s"     found data points dmin->lower  =id   s!     used data points dmin->higher =s!     used data points dmin->lower  =RL   (   RP   R   RA   R=   R:   t   abst   mint
   iselectionRR   RU   Rd   Rm   R8   R<   t   xrangeR9   RM   (   R3   t   d_mint   max_models_for_default_filterR5   RB   R\   t   difft   min_valt	   i_min_selt   i_mint   i_lt   i_rt   immRL   R[   (    (    sD   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/polygon/__init__.pyt   apply_default_filter  s>     !#	&
			 c         C   s[   |  d  k r0 t j j d d d t j j ƒ }  n  t j j |  ƒ sH t ‚ t j	 |  ƒ } | S(   Nt   relative_paths%   chem_data/polygon_data/all_mvd.picklet   test(
   RT   t   libtbxt   envt   find_in_repositoriest   ost   patht   isfileRU   R   t   load(   t	   file_nameR3   (    (    sD   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/polygon/__init__.pyt   load_db$  s    c         C   s   t  d |  j j ƒ } t d | d |  j j ƒ } |  j j } | d  k	 r£ t | ƒ d k rm | d j d  k s t | ƒ d k r£ t	 d | d | d |  j j
 ƒ } nD xA | D]9 } t d | d | j d	 | j d
 | j d | j ƒ } qª Wt d |  j j d | ƒ } x5 |  j j D]' } t d | d | d |  j j ƒ } qWg  }	 | r†xS|  j j D], }
 t d | |
 ƒ } |	 j |
 | g ƒ qSWn| rœx|  j j D]ü }
 t d | |
 ƒ } d |
 | j ƒ  f Gd | j ƒ  j ƒ  GH|  j j } | d  k rR| j ƒ  d } | d k  rRx= t d d d ƒ D]& } | j ƒ  | } | d k r"Pq"q"WqRn  | d k rmt d ƒ ‚ n  t d | d | ƒ } |	 j |
 | g ƒ q™Wn  |	 S(   NR�   R3   RJ   i   i    Rz   R{   R5   RX   RY   RZ   R2   Re   RB   s   %s data_points=%ds"   min/max/mean= %12.4f %12.4f %12.4fi2   i   i   i
   iÿÿÿÿs   Not enough data selected.R^   R_   (   RŽ   t   polygont   database_file_nameRS   t   keys_to_showt   filterRT   Rm   R5   Rƒ   R{   R]   RX   RY   RZ   R6   Rl   Re   RI   R=   RR   t   min_max_meant   as_tuplet   number_of_histogram_slotst   rangeR   Rt   (   t   paramsRz   t   show_histogramst   extract_gui_dataR3   R4   t   filtersR’   t   key_to_showt
   histogramst   selected_keyR^   R_   t   scalet   h(    (    sD   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/polygon/__init__.pyR�   -  s^    7				 c         C   s{  |  d k r5 t g  | j ƒ  D] } | d f ^ q ƒ Sy t ƒ  } Wn t k
 rX } i  SXt j g  | d D] } t | ƒ ^ qj ƒ } t j | ƒ } | j	 | ƒ } d „  } | | |  ƒ }	 t j
 | j ƒ  t ƒ }
 |	 } xB | d k r| | } | |  d k  rPn  t |
 | <| d 8} qÜ W|	 } xH | | j ƒ  k  rn| | } | |  d k rWPn  t |
 | <| d 7} q'Wi  } xÿ | j ƒ  D]ñ } | | } | | k r®d | | <q‚n  | | j	 | ƒ j	 |
 ƒ } t j ƒ  } x9 | D]1 } y | j t | ƒ ƒ WqÝt k
 rqÝXqÝW| j ƒ  d k s*t ‚ | j	 t j | ƒ ƒ } | | | ƒ } d d | | j ƒ  } | | | <q‚W| S(   s…   
  For a given set of statistics, determine their percentile ranking compared
  to other crystal structures at similar resolution.
  R!   c         S   sb   d } t  |  ƒ d } xE | | k r] | | | d } | |  | k rP | } q | d } q W| S(   Ni    i   i   (   Rm   (   RB   t   valueR[   Rs   t   k(    (    sD   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/polygon/__init__.pyt   find_value_in_listn  s    	i    gš™™™™™¹?i   id   N(   RT   t   dictRJ   RŽ   R;   R   RA   R:   RO   RK   R8   RR   R<   R9   R=   t
   ValueErrorRU   (   Rz   t   statsRh   t   dbt   et   xt	   d_min_mvdt   sel_permR¢   t   indext
   sel_aroundt	   index_tmpt   d_min_othert   percentilest	   stat_namet   statRB   t   fvaluesR    t   fvalues_sortedt
   stat_indext	   stat_perc(    (    sD   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/polygon/__init__.pyt   get_statistics_percentiles`  sZ    ),	






(2   t
   __future__R    t   scitbx.array_familyR   t
   iotbx.philt   iotbxt   mmtbx.polygont   mmtbxR†   R‰   t   ret   libtbx.utilsR   R   R‘   t   other_numerical_keyst   default_keyst   key_captionst   other_captionsRm   RU   t	   _selectedt   key_nameR=   t   joint   key_params_strt   txtt   subt   captions_strt   polygon_params_strt   philt   parset   master_paramsR6   RI   RM   R<   RP   RS   RT   R]   Rl   R9   Rt   Ru   Rƒ   RŽ   t   extractR�   R¶   (    (    (    sD   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/polygon/__init__.pyt   <module>   s„   $															1C						"	2