ó
™™xTc           @   s@  d  d l  m Z d  d l m Z d  d l m Z d  d l m Z d Z d  d l	 m
 Z
 d  d l	 m Z d Z d	 Z d
 Z d Z d Z d Z d „  Z d „  Z d d d d d d g Z d d% d „  ƒ  YZ d „  Z d „  Z e d „ Z d „  Z d „  Z d „  Z d „  Z e d „ Z d  „  Z d! „  Z  e d" „ Z! d# „  Z" d$ S(&   iÿÿÿÿ(   t   division(   t   digits(   t   geometry_restraints(   t   Sorrys>  
data_link_BETA1-4
loop_
_chem_link_bond.link_id
_chem_link_bond.atom_1_comp_id
_chem_link_bond.atom_id_1
_chem_link_bond.atom_2_comp_id
_chem_link_bond.atom_id_2
_chem_link_bond.type
_chem_link_bond.value_dist
_chem_link_bond.value_dist_esd
 BETA1-4  1  O4  2  C1  single  1.439  0.020

loop_
_chem_link_angle.link_id
_chem_link_angle.atom_1_comp_id
_chem_link_angle.atom_id_1
_chem_link_angle.atom_2_comp_id
_chem_link_angle.atom_id_2
_chem_link_angle.atom_3_comp_id
_chem_link_angle.atom_id_3
_chem_link_angle.value_angle
_chem_link_angle.value_angle_esd
 BETA1-4  1  C4  1  O4  2  C1  108.700  3.000
 BETA1-4  1  O4  2  C1  2  O5  112.300  3.000
 BETA1-4  1  O4  2  C1  2  C2  109.470  3.000
 BETA1-4  1  O4  2  C1  2  H1  109.470  3.000

loop_
_chem_link_chir.link_id
_chem_link_chir.atom_centre_comp_id
_chem_link_chir.atom_id_centre
_chem_link_chir.atom_1_comp_id
_chem_link_chir.atom_id_1
_chem_link_chir.atom_2_comp_id
_chem_link_chir.atom_id_2
_chem_link_chir.atom_3_comp_id
_chem_link_chir.atom_id_3
_chem_link_chir.volume_sign
 BETA1-4  2  C1  1  O4  2  O5  2  C2  positiv

(   t   linking_utils(   t   glyco_chiral_valuess   2 C1s   2 O5s   1 O4s   1 C4s   2 H1s   2 C2c         C   s   t  j j |  d  ƒ S(   N(   R   t   volumest   gett   None(   t   code(    (    sO   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/monomer_library/glyco_utils.pyt   get_chiral_sign=   s    c         C   s?   t  |  ƒ } | d  k r' d s; t ‚ n | d k  r7 d Sd Sd  S(   Ni    t   ALPHAt   BETA(   R
   R   t   AssertionError(   R	   t   cs(    (    sO   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/monomer_library/glyco_utils.pyt   get_alpha_beta@   s      t   anomeric_carbont   ring_oxygent   ring_carbont   link_oxygent   link_carbont   anomeric_hydrogent   glyco_link_classc           B   sY   e  Z d d d d d d  „ Z d „  Z d „  Z e d „ Z d „  Z d „  Z	 d „  Z
 RS(   c         C   sC   | |  _  | |  _ | |  _ | |  _ | |  _ | |  _ d  |  _ d  S(   N(   R   R   R   R   R   R   R   t   anomeric_carbon_linking(   t   selfR   R   R   R   R   R   (    (    sO   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/monomer_library/glyco_utils.pyt   __init__Q   s    						c         C   sŽ   d } x� t  D]y } y' | d | t |  | ƒ j ƒ  f 7} Wn t k
 r[ | d | 7} n X| d k r| | d |  j 7} n  | d 7} q W| S(   Ns   
Glycosidic atoms
s     %-20s : %ss     %-20s : ???R   s    linking : %ss   
(   t
   atom_typest   getattrt   quotet	   ExceptionR   (   R   t   outlt   attr(    (    sO   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/monomer_library/glyco_utils.pyt   __repr__a   s     ' c         C   sD   |  j  d  k s< |  j d  k s< |  j d  k s< |  j d  k r@ t St S(   N(   R   R   R   R   R   t   Falset   True(   R   (    (    sO   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/monomer_library/glyco_utils.pyt
   is_correctk   s    c         C   sx   g  } xk |  j  |  j |  j |  j g D]K } | d  k r; d  S| rZ | j t | d ƒ ƒ q% | j t | d ƒ ƒ q% W| S(   Nt   namet   i_seq(   R   R   R   R   R   t   appendR   (   R   t   return_namest   i_seqst   atom(    (    sO   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/monomer_library/glyco_utils.pyt   get_chiral_i_seqsu   s    	 c         C   sÆ   t  |  j j ƒ  j ƒ } |  j j j ƒ  d t k rQ | |  j j j ƒ  d 7} n | d |  j j j ƒ  7} |  j j j ƒ  d t k r¨ | d |  j j j ƒ  d 7} n | d |  j j j ƒ  7} | S(   Niÿÿÿÿs    %s s   -%ss   - %s (   R   R   t   parentt   resnameR$   t   stripR   R   (   R   t   isomer(    (    sO   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/monomer_library/glyco_utils.pyt
   get_isomerƒ   s    !c         C   s‡   g  } g  } xX t  D]P } t |  | d  ƒ } | d  k r= q n  | j | j ƒ | j | j ƒ  j ƒ q W| GH| GHd | d | d f S(   Ns   %s_%si    i   (   R   R   R   R&   R$   R+   R,   (   R   t   namest   resnamesR   R)   (    (    sO   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/monomer_library/glyco_utils.pyt   get_code�   s     c         C   så  d d  l  } |  GH|  j ƒ  } | GH|  j ƒ  } | GHd | | f } | } | GH| j j j ƒ  } | j j j d d0 ƒ } | j | d |  j j	 j
 ƒ  d |  j j	 j
 ƒ  d d d f ƒ | j | ƒ | j j j d d1 ƒ } x:d |  j d |  j d |  j g d d g d |  j d |  j d |  j g d d g d |  j d |  j d |  j g d d g d |  j d |  j d |  j g d d g g D]– \ \ } } } }	 }
 } } } | d  k s}|	 d  k s}| d  k rÈq}n  | j | | | j	 j
 ƒ  | |	 j	 j
 ƒ  |
 | j	 j
 ƒ  d | d | f	 ƒ q}W| j | ƒ | j j j d d2 ƒ } t |  j j ƒ  j ƒ } | d) k rid* } n d+ } |  j d, t ƒ } | j | d | d) j
 ƒ  d | d- j
 ƒ  d | d. j
 ƒ  d | d/ j
 ƒ  | f
 ƒ | j | ƒ | S(3   Niÿÿÿÿs   %s-%st   headers   _chem_link_bond.link_ids   _chem_link_bond.atom_1_comp_ids   _chem_link_bond.atom_id_1s   _chem_link_bond.atom_2_comp_ids   _chem_link_bond.atom_id_2s   _chem_link_bond.types   _chem_link_bond.value_dists   _chem_link_bond.value_dist_esdt   1t   2t   singles   1.439s   0.020s   _chem_link_angle.link_ids   _chem_link_angle.atom_1_comp_ids   _chem_link_angle.atom_id_1s   _chem_link_angle.atom_2_comp_ids   _chem_link_angle.atom_id_2s   _chem_link_angle.atom_3_comp_ids   _chem_link_angle.atom_id_3s   _chem_link_angle.value_angles    _chem_link_angle.value_angle_esdgÍÌÌÌÌ,[@g      @g33333\@g®Gáz^[@s   %0.1fs   _chem_link_chir.link_ids#   _chem_link_chir.atom_centre_comp_ids   _chem_link_chir.atom_id_centres   _chem_link_chir.atom_1_comp_ids   _chem_link_chir.atom_id_1s   _chem_link_chir.atom_2_comp_ids   _chem_link_chir.atom_id_2s   _chem_link_chir.atom_3_comp_ids   _chem_link_chir.atom_id_3s   _chem_link_chir.volume_signi    t   positivt   negativR'   i   i   i   (   s   _chem_link_bond.link_ids   _chem_link_bond.atom_1_comp_ids   _chem_link_bond.atom_id_1s   _chem_link_bond.atom_2_comp_ids   _chem_link_bond.atom_id_2s   _chem_link_bond.types   _chem_link_bond.value_dists   _chem_link_bond.value_dist_esd(	   s   _chem_link_angle.link_ids   _chem_link_angle.atom_1_comp_ids   _chem_link_angle.atom_id_1s   _chem_link_angle.atom_2_comp_ids   _chem_link_angle.atom_id_2s   _chem_link_angle.atom_3_comp_ids   _chem_link_angle.atom_id_3s   _chem_link_angle.value_angles    _chem_link_angle.value_angle_esd(
   s   _chem_link_chir.link_ids#   _chem_link_chir.atom_centre_comp_ids   _chem_link_chir.atom_id_centres   _chem_link_chir.atom_1_comp_ids   _chem_link_chir.atom_id_1s   _chem_link_chir.atom_2_comp_ids   _chem_link_chir.atom_id_2s   _chem_link_chir.atom_3_comp_ids   _chem_link_chir.atom_id_3s   _chem_link_chir.volume_sign(   t	   iotbx.cifR/   R2   t   cift   modelt   blockt   loopt   add_rowR   R$   R-   R   t   add_loopR   R   R   R   R   R
   R+   R,   R*   R"   (   R   t   iotbxR.   R	   t	   cif_blockR=   t   id1t   a1t   id2t   a2t   id3t   a3t   anglet   esdt   valueR0   (    (    sO   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/monomer_library/glyco_utils.pyt   as_cifœ   s¦           		
        	'''L$ 	         			
N(   t   __name__t
   __module__R   R   R    R#   R!   R*   R/   R2   RK   (    (    (    sO   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/monomer_library/glyco_utils.pyR   P   s   
	
	
		c         C   sA   d } x4 t  d ƒ D]& } | |  j | | j | d 7} q W| S(   Ni    i   i   (   t   ranget   xyz(   RC   RE   t   d2t   i(    (    sO   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/monomer_library/glyco_utils.pyt   get_distance2ø   s    $c         c   s<   x |  j  ƒ  D] } | Vq Wx | j  ƒ  D] } | Vq) Wd  S(   N(   t   atoms(   t   atom_group1t   atom_group2R)   (    (    sO   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/monomer_library/glyco_utils.pyt   generate_atoms_from_atom_groupsþ   s     	 c   	      C   sò   xë t  t |  | ƒ ƒ D]Ô \ } } | j j ƒ  d k r= q n  g  } g  } xU | j | j g  ƒ D]> } | j j ƒ  d k r_ | j | ƒ | j | j ƒ  ƒ q_ q_ Wt | ƒ d k r | d j	 ƒ  | d j	 ƒ  k rÝ | t
 f S| t f Sq q Wd  S(   Nt   Ct   Oi   i    i   (   RW   (   RX   (   t	   enumerateRV   t   elementR-   R   R%   R&   R+   t   lent   id_strR"   R!   R   (	   RT   RU   t   bondst   verboseRQ   R)   t   oxygenst   residuest   ba(    (    sO   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/monomer_library/glyco_utils.pyt   get_anomeric_carbon  s      
c   	      C   s|  g  } xH t  t |  | ƒ ƒ D]1 \ } } | j j ƒ  d k r | j | ƒ q q W| sg d sc t ‚ d  SxÎ | D]‹ } g  } xf t  t |  | ƒ ƒ D]O \ } } | j j ƒ  d
 k r� t | | ƒ } | d k  rß | j | ƒ qß q� q� Wt	 | ƒ d k rn Pqn qn Wd } x" | D] } | d | j
 ƒ  7} q
Wt d | ƒ ‚ | d j ƒ  j ƒ  | d	 j ƒ  j ƒ  k rn| t f S| t f Sd  S(   Nt   C1i    RX   g      @i   t    s   
		%ss–   
        Trying to find the anomeric carbons but could not find
        a suitable candidate.
%s
        Check carbohydrate geometry.
                i   (   RX   (   RY   RV   R$   R-   R&   R   R   RZ   RR   R[   R   R   R+   R\   R"   R!   (	   RT   RU   t   c1sRQ   R)   t   c1R_   RP   R   (    (    sO   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/monomer_library/glyco_utils.pyt   get_C1_carbon   s6     ,

c         C   sg   x` | j  |  j g  ƒ D]I } | j j ƒ  d k r7 q n  | j ƒ  j ƒ  |  j ƒ  j ƒ  k r | Sq Wd  S(   NRX   (   RX   (   R   R%   RZ   R-   R+   R\   (   R   R]   Ra   (    (    sO   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/monomer_library/glyco_utils.pyt   get_ring_oxygenP  s
     $c         C   sg   x` | j  |  j g  ƒ D]I } | j j ƒ  d k r7 q n  | j ƒ  j ƒ  |  j ƒ  j ƒ  k r | Sq Wd  S(   NRW   (   RW   (   R   R%   RZ   R-   R+   R\   (   R   R]   Ra   (    (    sO   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/monomer_library/glyco_utils.pyt   get_ring_carbonV  s
     $c         C   sg   x` | j  |  j g  ƒ D]I } | j j ƒ  d k r7 q n  | j ƒ  j ƒ  |  j ƒ  j ƒ  k r | Sq Wd  S(   Nt   H(   Rj   (   R   R%   RZ   R-   R+   R\   (   R   R]   Ra   (    (    sO   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/monomer_library/glyco_utils.pyt   get_anomeric_hydrogen\  s
     $c         C   s    | r% |  j  ƒ  GH| j |  j ƒ GHn  xt | j |  j g  ƒ D]] } | rU | j  ƒ  GHn  | j j ƒ  d k rp q; n  | j ƒ  j ƒ  |  j ƒ  j ƒ  k r; | Sq; Wd  S(   NRX   (   RX   (   R   R   R%   RZ   R-   R+   R\   (   R   R]   R^   Ra   (    (    sO   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/monomer_library/glyco_utils.pyt   get_link_oxygenb  s      $c         C   s÷   d  } x6 | j ƒ  D]( } | j ƒ  |  j ƒ  k r | } Pq q W| d  k r‡ x9 | j ƒ  D]( } | j ƒ  |  j ƒ  k rX | } PqX qX Wn  | d  k r¢ d s¢ t ‚ n  xN | j ƒ  D]@ } | j j ƒ  d k rÐ q¯ n  t | |  ƒ } | d k  r¯ | Sq¯ Wd  S(   Ni    RX   g      @(   R   RS   R   R   RZ   R-   RR   (   R   RT   RU   t
   link_groupR)   RP   (    (    sO   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/monomer_library/glyco_utils.pyt   get_link_oxygen_on_distancel  s&      c         C   s   xx | j  | j g  ƒ D]a } | j j ƒ  d k r7 q n  | j |  j k rO q n  | j ƒ  j ƒ  |  j ƒ  j ƒ  k r | Sq Wd  S(   NRW   (   RW   (   R   R%   RZ   R-   R+   R\   (   R   R   R]   Ra   (    (    sO   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/monomer_library/glyco_utils.pyt   get_link_carbon  s      $c         C   sÓ  t  j |  | d ƒ } t |  | | d | ƒ} | d  k rK t |  | ƒ } n  | d  k r[ d  S| \ } } | d  k rƒ d s t ‚ d  S| r› d G| j ƒ  GHn  t | | ƒ } | rÂ d G| j ƒ  GHn  t | | ƒ } | ré d G| j ƒ  GHn  t	 | | ƒ }	 | r
d G|	 GHn  t
 | | d | ƒ}
 |
 d  k r@t | |  | ƒ }
 n  |
 d  k rPd  S| rhd G|
 j ƒ  GHn  t | |
 | ƒ } | r«y d	 G| j ƒ  GHWq«t k
 r§Hq«Xn  t | | | |
 | |	 ƒ } | | _ | S(
   Ngffffffþ?R^   i    R   R   R   R   R   R   (   R   t   get_bonded_from_atom_groupsRb   R   Rg   R   R   Rh   Ri   Rk   Rl   Rn   Ro   R   R   R   (   RT   RU   R^   R]   t   rcR   t   linking_carbonR   R   R   R   R   t   gla(    (    sO   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/monomer_library/glyco_utils.pyt   get_glyco_link_atoms†  sb    			        		c         C   s¢  d „  } d „  } t  d „ } d „  }	 d d l m }
 |
 j |  | ƒ } | rq | j ƒ  rq |
 j | |  ƒ } n  | r© | j ƒ  r© t d |	 |  ƒ |	 | ƒ f ƒ ‚ n  | d  k rÚ t d |	 |  ƒ |	 | ƒ f ƒ ‚ n  | j st d	 | j j	 ƒ  | j
 j	 ƒ  | f ƒ ‚ n  | j j | j j g } | | | | d
 d | ƒ xÐ | j
 | j | j g d d g | j | j | j g d d g | j | j | j g d d g | j | j | j g d d g g D]P \ } } } d  | k râqÁn  g  | D] } | j ^ qé} | | | | | ƒ qÁW| j ƒ  } | d  k rRt d |	 |  ƒ |	 | ƒ f ƒ ‚ n  t | j j ƒ  j ƒ } | rŒd } | | | | | ƒ n  | j ƒ  | j ƒ  f S(   Nc      	   S   sr   t  j d |  d | d d | d ƒ } | j d |  d d |  d d	 | ƒ | j d |  d d |  d d
 | ƒ d  S(   NR(   t   distance_idealt   weighti   i   R%   i    t   j_seqt   paramst   rt_mx_ji(   R   t   bond_simple_proxyt   updatet   add_pair(   R(   t   bond_params_tablet   bond_asu_tableRJ   RI   Ry   t   proxy(    (    sO   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/monomer_library/glyco_utils.pyt	   _add_bond¾  s    	
	

c      	   S   s=   t  j d |  d | d d | d ƒ } | j j d | ƒ d  S(   NR(   t   angle_idealRv   i   i   R   (   R   t   angle_proxyRH   t   add_if_not_duplicated(   R(   t   geometry_proxy_registriesRJ   RI   R   (    (    sO   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/monomer_library/glyco_utils.pyt
   _add_angleÒ  s
    	c         S   sC   t  j d |  d | d | d d | d ƒ } | j j d | ƒ d  S(   NR(   t   volume_idealt
   both_signsRv   i   i   R   (   R   t   chirality_proxyt	   chiralityRƒ   (   R(   R„   RJ   RI   R‡   R   (    (    sO   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/monomer_library/glyco_utils.pyt   _add_chiralÙ  s    	c         S   s;   d } x. |  j  ƒ  D]  } | d d | j ƒ  f 7} q W| S(   NRd   s   %s%s
t    i
   s
             (   RS   R   (   t
   atom_groupR   R)   (    (    sO   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/monomer_library/glyco_utils.pyt   atom_group_outputâ  s    iÿÿÿÿ(   t   glyco_utilssj   
    Failed to get all the atoms needed for glycosidic bond between
      group 1
%s
      group 2
%s
    s°   
  Unspecified problem with carbohydrate groups. Could be that the linking oxygen
  is on the linking residue instead of the docking residue.
    group 1
%s
    group 2
%s
    s©   
  The linking carbohydrate unit has the oxygen attached to the anomeric carbon.
  Consider replacing oxygen %s
  with an oxygen linked to  %s in the same residue
    %sg /Ý$÷?g{®Gáz”?gÍÌÌÌÌ,[@g      @g33333\@g®Gáz^[@sd   
    Unable to determine the linking chiral atoms for atom groups
    group 1
%s
    group 2
%s
    (   R!   t   mmtbx.monomer_libraryRŽ   Rt   R#   R   R   R   R   R   R   R   R%   R   R   R   R*   R
   R+   R,   R/   RK   (   RT   RU   R}   R~   R„   Ry   R€   R…   RŠ   R�   RŽ   Rs   R(   t   i_atomsRJ   RI   R)   (    (    sO   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/monomer_library/glyco_utils.pyt(   apply_glyco_link_using_proxies_and_atoms·  sR    							""	1 "N(    (#   t
   __future__R    t   stringR   t   cctbxR   t   libtbx.utilsR   t   beta_1_4R�   R   R   R   R   R   R   R   R   R
   R   R   R   RR   RV   R!   Rb   Rg   Rh   Ri   Rk   Rl   Rn   Ro   Rt   R‘   (    (    (    sO   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/monomer_library/glyco_utils.pyt   <module>   sB   +			¨			0			
			/