ó
£™xTc           @   s2  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 Z d  d l Z d d „ Z d	 d
 „ Z d d d e d „ Z d „  Z e d e j d „ Z d „  Z e d „ Z d „  Z d d d „ Z e d „ Z d „  Z d „  Z d „  Z e d k r.e ƒ  d GHn  d S(   iÿÿÿÿ(   t   division(   t   easy_pickle(   t
   group_args(   t   Sorry(   t   defaultdictNg      Ð?c         C   sp   d d l  } |  j } g  t d ƒ D]1 } g  t d ƒ D] } | | | d ^ q5 ^ q" } | j | ƒ } | | S(   s{   
  Convert a MolProbity Ramachandran distribution to a format suitable for
  display using matplotlib (see wxtbx.plots).
  iÿÿÿÿNi´   (   t   numpyt   lookupTablet   ranget   array(   t   n_dim_tablet   scale_factorR   t   zt   it   jt   z_gridt   npz(    (    sD   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/validation/utils.pyt    export_ramachandran_distribution   s    	Ag      à?c         C   sT  d d l  } |  j } |  j } | d k s0 t ‚ d } x |  j d D] } | | 9} qD Wd } | d k r� x" |  j d D] } | | 9} qx Wn  g  t |  j d ƒ D] } g  ^ q£ }	 x… t |  j d ƒ D]p } xg t |  j d ƒ D]R }
 d } x2 t | ƒ D]$ } | | | | |
 | | 7} qü W|	 |
 j | ƒ qã WqÉ W| j |	 ƒ } | | S(   s§   
  Convert a MolProbity rotamer distribution to a format suitable for
  display using matplotlib (see wxtbx.plots).  Will reduce dimensionality to
  2 if necessary.
  iÿÿÿÿNi   i   i    (   R   R   t   nDimt   AssertionErrort   nBinsR   t   appendR   (   R	   R
   R   R   t   n_dimt   x_offsett   nbinst   y_widthR   R   R   t   z_totalt   kR   (    (    sD   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/validation/utils.pyt   export_rotamer_distribution   s(    		&"t   ramac   	      C   sb  d d l  m } d d l m } | d k r5 d } n  | d k rJ d } n  | d k s\ t ‚ | d k sn t ‚ |  d  k	 sŒ | d  k	 sŒ t ‚ | d  k	 r¨ | j | }  n  |  j ƒ  d k rÃ d }  n  |  d  k	 sÕ t ‚ | ƒ  } | d k rý d | |  f } n d | |  j ƒ  f } t j	 t
 j j | | ƒ ƒ } | rZ| d k rMt | ƒ St | ƒ Sn | Sd  S(   Niÿÿÿÿ(   t   ramachandran_eval(   t   find_rotarama_data_dirt   prolines   trans-prolinet   prepros   pre-prolinet   generals   cis-prolinet   glycines   isoleucine or valineR   t   rotat   phet   tyrt   phetyrs   %s8000-%s.pickles   %s500-%s.pickle(   R!   s   cis-prolines   trans-prolineR"   s   isoleucine or valines   pre-prolineN(   R   R#   (   R$   R%   (   t   mmtbx.rotamerR   t   mmtbx.rotamer.rotamer_evalR   t   NoneR   t   aminoAcids_8000t   lowerR   t   loadt   ost   patht   joinR   R   (	   t   residue_typet   pos_typet   dbt   convert_to_numpy_arrayR   R   t   rama_data_dirt   pkl_filet   ndt(    (    sD   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/validation/utils.pyt   get_rotarama_data2   s2     	 			
c         C   sv   |  d d !j  ƒ  } | d k r( d } n  t d |  d d !d |  d d	 |  d
 d !d | d |  d d |  d d !j  ƒ  ƒ S(   Ni   i
   t    t    t   namei    i   t   altloct   resnamei   t   chain_idt   residt   resseqiÿÿÿÿ(   t   stripR   (   t   atom_idR=   (    (    sD   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/validation/utils.pyt   decode_atom_strP   s    	

gš™™™™™é?c         C   s!  |  j  ƒ  d j ƒ  } g  } g  } g  } t | ƒ t | ƒ k sG | r| d IJ| d IJd d l m }	 x© | D]ž }
 |
 j ƒ  } | j | ƒ | j |
 j ƒ d } d  } xS | D]K } |	 | | ƒ } | j	 ƒ  } | | k r´ | | k rÿ | } | } qÿ q´ q´ W| j | ƒ qr Wn  g  } d  S(   Ni    s5   Can't determine sequence->chain mapping autoamticallys!   Running sequence alignements. . .iÿÿÿÿ(   t   pairwise_global_wrapper(
   t   modelst   chainst   lent   mmtbx.alignmentRC   t   as_padded_sequenceR   t   idR)   t   calculate_sequence_identity(   t   pdb_hierarchyt	   sequencest   assume_same_ordert   expected_sequence_identityt   logRE   t	   chain_idst   actual_seqst   expected_seqsRC   t   chaint	   chain_seqt   best_identityt   best_sequencet   sequencet   pgt   identityt
   mismatches(    (    sD   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/validation/utils.pyt   find_sequence_mismatches\   s.    

c         C   s˜   |  d k r� | d k r� | d k r� d | } d t  j d |  ƒ d t  j d t d | d ƒ ƒ d t  j d t d | d ƒ ƒ d } n d	 S| S(
   sÆ   
  Calculate the overall Molprobity score, as described here:
    http://www.ncbi.nlm.nih.gov/pmc/articles/PMC2877634/?tool=pubmed
    http://kinemage.biochem.duke.edu/suppinfo/CASP8/methods.html
  i    g      Y@gÝ$�•CÛ?i   g…ëQ¸Õ?g      Ð?i   g      à?iÿÿÿÿ(   t   mathRO   t   max(   t
   clashscoret   rota_outt   rama_favt	   rama_iffyt   mpscore(    (    sD   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/validation/utils.pyt   molprobity_scorey   s    $
6,c         C   så   t  } xØ |  j ƒ  D]Ê } xÁ | j ƒ  D]³ } | j d k r& d  } xm | j ƒ  D]_ } | d  k rl | j } n  | j d	 k rN | j | k r­ | r£ t d d ƒ ‚ qª t  Sq­ qN qN Wt | j	 ƒ  ƒ d k rÒ t
 } qÙ t  Sq& q& Wq W| S(
   NR9   s     s       R8   s/   Chains with blank chainID may not have multiples    segID valuesi    (   R9   s     (   s       R8   (   t   FalseRD   RE   RI   R)   t   atomst   segidR   RF   R@   t   True(   t	   hierarchyt   strictt
   use_segidst   modelRS   t	   cur_segidt   atom(    (    sD   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/validation/utils.pyt   use_segids_in_place_of_chainidsˆ   s$    	c         C   s   x |  j  ƒ  D]
 } | j SWd  S(   N(   Re   Rf   (   RS   Rm   (    (    sD   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/validation/utils.pyt   get_segid_as_chainidŸ   s    c   !         sl  d d l  m } t t ƒ } g  } i  } |  d  k	 r[ |  j j } |  j ƒ  } |  j j } n* d  | | g k ss t	 ‚ | j
 ƒ  j ƒ  } | j } t d | ƒ ‰  ‡  f d †  }	 xì| D]ä}
 g  } d } t } |
 j ƒ  x= |
 j D]2 } | j ˆ  | d d !j ƒ  ƒ | ˆ  | } qß Wt | ƒ d k r-q³ n  t d | ƒ } | d  k r·t d | d	 t ƒ } t d | ƒ } | d  k r·t d | d	 t ƒ } t d | ƒ } | d  k	 r´t } q´q·n  | d  k	 r³ |	 |
 ƒ r³ | j d
 | d |
 ƒ } ˆ  |
 j d d } | j | d ƒ d  k r&g  | | d <n  | d d !| | d k r`| | d j | d d !ƒ n  | j | | | <| r—| | | d | | | <q—q³ q³ Wx›| j ƒ  D]�} | d d !} | d d !} | d d !} | d d !} | d } d | | d k r| d k rq¨qn  | | j d ƒ d  k	 rCd | | d } nP | d k r�| d | d j d ƒ d  k	 r�d | d | d d } n d } | | j d ƒ d  k	 rÁd | | d } nP | d k r| d | d j d ƒ d  k	 rd | d | d d } n d } | | j d ƒ d  k	 r?d | | d } nP | d k r‰| d | d j d ƒ d  k	 r‰d | d | d d } n d } | | j d ƒ r·d | | d } nP | d k r| d | d j d ƒ d  k	 rd | d | d d } n d } | | j d ƒ r/d | | d } nP | d k ry| d | d j d ƒ d  k	 ryd | d | d d } n d } | | j d ƒ r§d | | d } nP | d k rñ| d | d j d ƒ d  k	 rñd | d | d d } n d } d d d | | | | | | | | | | | f } | j | ƒ q¨W| j ƒ  d } x | D] }  | |  d 7} qPW| S(   Niÿÿÿÿ(   t   geometry_restraintsRK   c            s9   x2 |  j  D]' } ˆ  | d d !} | d k r
 t Sq
 Wt S(   Ni   i   R9   t   A(   R9   Rq   (   t   i_seqsRd   Rg   (   t   proxyR   t   alt(   t   i_seq_name_hash(    sD   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/validation/utils.pyt   is_blank_or_alt_a¶   s
    R8   i    i   Re   t   impropert
   sites_cartRs   i   g      ð¿i   i
   Rq   t   alphas   %.3fR9   s   __?__t   betat   gammat   deltat   epsilont   zetas&   %s:%s:%s:%s:%s:%s:%s:%s:%s:%s:%s:%s:%st   1s   
(   t   cctbxRp   R   t   dictR)   t   all_chain_proxiesRx   t   geometry_restraints_managerRK   R   Re   t   extract_xyzt   dihedral_proxiest   build_name_hashRd   t   sort_i_seqsRr   R   R@   RF   t   match_dihedral_to_namet   get_inverted_atomsRg   t   dihedralt   gett   angle_modelt   keyst   sort(!   t   processed_pdb_filet   geometryRK   Rp   t   bb_dihedralst   formatted_outt   alt_trackerRx   R…   Rv   t   dpRe   t	   debug_keyt   invert_signR   R:   t   inverted_atomst	   restraintt   keyR;   R<   t   chainIDt   resnumt   i_codeRy   Rz   R{   R|   R}   R~   t   evalt   backbone_dihedralst   line(    (   Ru   sD   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/validation/utils.pyt   get_rna_backbone_dihedrals£   sÚ    	
		$
	!!!!!!

c         C   s›   g  } | sS | j  |  d ƒ | j  |  d ƒ | j  |  d ƒ | j  |  d ƒ nD | j  |  d ƒ | j  |  d ƒ | j  |  d ƒ | j  |  d ƒ | S(   Ni   i   i   i    (   R   (   Re   Rw   t   temp(    (    sD   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/validation/utils.pyR‰   &  s    c         C   sô   d  } d d d d g } d d d d g } d d d d g } d d d d g } d d d d g } d d d d g } |  | k r‡ d } ni |  | k rœ d } nT |  | k r± d	 } n? |  | k rÆ d
 } n* |  | k rÛ d } n |  | k rð d } n  | S(   Ns   O3't   Ps   O5's   C5's   C4's   C3'Ry   Rz   R{   R|   R}   R~   (   R)   (   Re   R:   Ry   Rz   R{   R|   R}   R~   (    (    sD   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/validation/utils.pyRˆ   4  s(    						c         C   s7   t  ƒ  } x' |  j ƒ  D] } | j ƒ  | | j <q W| S(   N(   R�   Re   t   pdb_label_columnst   i_seq(   RK   Ru   Rm   (    (    sD   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/validation/utils.pyR†   J  s    	c          C   s{  d d l  m }  y d d  l } Wn t k
 r> t } d GHn Xt } t d d d | ƒ } t d d d | ƒ } t d d	 d
 d d | ƒ } t d d d
 d d | ƒ } t d ƒ } | j d k rÏ | j	 d k sÕ t
 ‚ | j d k ró | j d k sù t
 ‚ | j d k r| j d k st
 ‚ t d d d ƒ } |  | d d d ƒsJt
 ‚ t d d d ƒ } |  | d d d ƒswt
 ‚ d  S(   Niÿÿÿÿ(   t   approx_equals0   Numpy not installed, will skip array conversion.R1   R!   R3   s   pre-prolineR0   t   argR2   R#   R$   s    OD2 ASP A  14Ls    OD2t   ASPR9   Rq   s     14Lt   14g      H@gfffffæ#@g\�Âõ(œU@gffffff@t   epsg{®Gáz„?gš™™™™ùj@g=
×£pý1@g×£p=
J@g×£p=
×@(   t   libtbx.test_utilsR¥   R   t   ImportErrorRd   Rg   R7   RB   R:   R<   R   R;   R=   R>   R?   Rc   (   R¥   R   t
   test_numpyt   z_datat	   atom_infoRb   (    (    sD   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/validation/utils.pyt   exerciseP  s2    					$$$t   __main__t   OK(   t
   __future__R    t   libtbxR   R   t   libtbx.utilsR   t   collectionsR   t   os.pathR-   R\   t   sysR   R   R)   Rd   R7   RB   Rg   t   stdoutR[   Rc   Rn   Ro   R    R‰   Rˆ   R†   R¯   t   __name__(    (    (    sD   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/validation/utils.pyt   <module>   s4   				‚			