ó
›™xTc           @   s~  d  d l  m 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 e j j Z d
 d d g Z d d d d g Z d g Z d d g Z d g Z d d d d d d g Z d g Z d dB d „  ƒ  YZ d „  Z d „  Z d  „  Z e d! „ Z e d" „ Z d# „  Z  d$ „  Z! e d% „ Z" e d& „ Z# e e d' „ Z$ e% d d d d( „ Z' d) e% d* „ Z( d+ „  Z) d, „  Z* d- d. d/ „ Z+ d d0 d1 d- d. d2 d3 d0 d0 d4 d5 e e d6 „ Z, d7 „  Z- d e d8 „ Z. d e d9 „ Z/ d e d: „ Z0 d1 d- d2 e d; „ Z1 d2 e d< „ Z2 e d= „ Z3 d> „  Z4 d? e5 f d@ „  ƒ  YZ6 dA „  Z7 d S(C   iÿÿÿÿ(   t   divisionN(   t   Sorry(   t   flex(   t   get_type(   t   linking_setup(   t)   ad_hoc_single_metal_residue_element_types(   t   ad_hoc_non_linking_elements(   t   ad_hoc_first_rowt
   SACCHARIDEs   D-SACCHARIDEs   L-SACCHARIDEs   "L-PEPTIDE LINKING"s   "D-PEPTIDE LINKING"s   L-PEPTIDE LINKINGs   D-PEPTIDE LINKINGt   ASNt   SERt   THRs   NAG-ASNs   NAG-SERs   NAG-THRs   MAN-SERs   MAN-THRs   XYS-SERs   XYS-THRt   FU4t   emptyc           B   s   e  Z d  „  Z RS(   c         C   s;   d } x. |  j  D]# } | d | t |  | ƒ f 7} q W| S(   Nt    s
     %s : %s
(   t   __dict__t   getattr(   t   selft   outlt   attr(    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/monomer_library/linking_utils.pyt   __repr__2   s    !(   t   __name__t
   __module__R   (    (    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/monomer_library/linking_utils.pyR   1   s   c         C   s   d |  GHd  S(   Ns    !!! %-76s !!!(    (   t   s(    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/monomer_library/linking_utils.pyt   _write_warning_line8   s    c         C   s`   |  j  d | j  d d } | |  j  d | j  d d 7} | |  j  d | j  d d 7} | S(   Ni    i   i   (   t   xyz(   t   atom1t   atom2t   d2(    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/monomer_library/linking_utils.pyt   get_distance2;   s      c         C   sÔ   g  } | j  t j | j ƒ t j |  j ƒ ƒ | j  t j | j ƒ t j |  j ƒ ƒ | j  t j | j ƒ t j |  j ƒ ƒ t j | d ƒ } t j | d ƒ } | d j t j | j | ƒ d ƒ ƒ } | S(   Ni   i   i    (   t   appendR   t   doubleR   t   vec3_doublet   dott   cross(   t   centreR   R   t   atom3t   abct   at   bt   volume(    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/monomer_library/linking_utils.pyt
   get_volumeA   s    ))))c         C   s  | r… d GH|  j  ƒ  GH| j  ƒ  GHt |  j ƒ  j ƒ GHt | j ƒ  j ƒ GHt GHt |  j ƒ  j ƒ j ƒ  GHt | j ƒ  j ƒ j ƒ  GHn  t |  j ƒ  j ƒ d  k r¤ t St | j ƒ  j ƒ d  k rÃ t St |  j ƒ  j ƒ j ƒ  t k rè t St | j ƒ  j ƒ j ƒ  t k rt St S(   Ns   ----- is_glyco_bond -----(	   t   quoteR   t   parentt   resnamet   sugar_typest   uppert   Nonet   Falset   True(   R   R   t   verbose(    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/monomer_library/linking_utils.pyt   is_glyco_bondR   s$      ! ! c         C   s§  | r… d GH|  j  ƒ  GH| j  ƒ  GHt |  j ƒ  j ƒ GHt | j ƒ  j ƒ GHt GHt |  j ƒ  j ƒ j ƒ  GHt | j ƒ  j ƒ j ƒ  GHn  t |  j ƒ  j ƒ d  k r¤ t St | j ƒ  j ƒ d  k rÃ t Sd } d } t |  j ƒ  j ƒ j ƒ  t k rý | d 7} n. t |  j ƒ  j ƒ j ƒ  t k r+| d 7} n  t | j ƒ  j ƒ j ƒ  t k rY| d 7} n. t | j ƒ  j ƒ j ƒ  t k r‡| d 7} n  | d k r£| d k r£t	 St S(   Ns   ----- is_glyco_amino_bond -----i    i   (
   R*   R   R+   R,   R-   R.   R/   R0   t   amino_typesR1   (   R   R   R2   t   sugarst   aminos(    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/monomer_library/linking_utils.pyt   is_glyco_amino_bondd   s4      !!!!c         C   s
  t  |  j ƒ  j ƒ d  k r t St  | j ƒ  j ƒ d  k r> t Sd } d } t  |  j ƒ  j ƒ j ƒ  t k rx | d 7} n" |  j ƒ  j t k rš | d 7} n  t  | j ƒ  j ƒ j ƒ  t k rÈ | d 7} n" | j ƒ  j t k rê | d 7} n  | d k r| d k rt St S(   Ni    i   (	   R   R+   R,   R/   R0   R.   R-   t   n_linking_residuesR1   (   R   R   R5   t   n_links(    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/monomer_library/linking_utils.pyt   is_n_glyco_bond~   s"      !!c         C   s
  t  |  j ƒ  j ƒ d  k r t St  | j ƒ  j ƒ d  k r> t Sd } d } t  |  j ƒ  j ƒ j ƒ  t k rx | d 7} n" |  j ƒ  j t k rš | d 7} n  t  | j ƒ  j ƒ j ƒ  t k rÈ | d 7} n" | j ƒ  j t k rê | d 7} n  | d k r| d k rt St S(   Ni    i   (	   R   R+   R,   R/   R0   R.   R-   t   o_linking_residuesR1   (   R   R   R5   t   o_links(    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/monomer_library/linking_utils.pyt   is_o_glyco_bond�   s"      !!c   	      C   sC  d „  } g  } x§ | D]Ÿ } x– | D]Ž } | j  j ƒ  d	 k rD q# n  | j ƒ  j ƒ  j |  j ƒ  j ƒ  j k rt q# n  | j |  j k rŒ q# n  | j | j k r¤ q# n  | j | ƒ q# Wq W| j | ƒ | j d | ƒ | j d |  ƒ t | ƒ d k r3| r/d d GHx | D] } | j	 ƒ  GHqWd d GHn  d  St | Œ  } | S(
   Nc         S   s   |  j  | j  k  r d Sd Sd  S(   Niÿÿÿÿi   (   t   name(   t   a1t   a2(    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/monomer_library/linking_utils.pyt   _sort_by_name¡   s     t   Ht   Dt   Ti    i   t   -iP   (   RB   RC   RD   (   t   elementt   stripR+   t   resseqR>   R   t   sortt   insertt   lent   format_atom_recordR/   R)   (	   t   c_atomt   o_atomt   anglesR2   RA   t   otherst   anglet   atomt   v(    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/monomer_library/linking_utils.pyt   get_chiral_volume    s2    	 *   	c         C   s0   t  |  | | d | ƒ} | d k  r( d Sd Sd  S(   NR2   i    t   BETAt   ALPHA(   RT   (   RM   RN   RO   R2   RS   (    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/monomer_library/linking_utils.pyt   get_hand¹   s    c            sF  d „  ‰  ‡  f d †  } d d d d d d d	 d
 g } |  j  ƒ  } t ƒ  } x | D] } t | | t ƒ qR W| r– d | j | j t | j ƒ f GHn  t | j ƒ } xš t | ƒ D]Œ \ }	 } d  }
 |	 rÓ | }
 n9 t	 | j ƒ d  k	 rt	 | j ƒ j
 ƒ  t k r| }
 n  |
 | k r² | r+| |  |
 ƒ St | | t ƒ q² q² W| S(   Nc         S   s   t  |  j ƒ  j ƒ  j ƒ  ƒ S(   N(   RK   R+   t   atoms(   RR   (    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/monomer_library/linking_utils.pyt   _num_atoms_residueÁ   s    c            su   | d k r. |  j  j ƒ  j ƒ  t k r. d Sn  | d k rq ˆ  |  ƒ d k rq |  j  j ƒ  j ƒ  t k rn d Sqq n  | S(   Nt   common_elementt   metalt   otheri   (   RF   RG   R.   R   (   RR   t
   class_name(   RY   (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/monomer_library/linking_utils.pyt   _filter_for_metalÃ   s    
t   common_saccharidet   common_waterRZ   t   common_small_moleculet   common_amino_acidt   common_rna_dnaR\   t   unknowns4       atom_group1: altloc="%s" resname="%s" class="%s"(   R+   R   t   setattrR0   t   altlocR,   t	   get_classt	   enumerateR/   R   R.   R-   R1   (   RR   t   important_onlyR2   R^   t   attrst
   atom_groupt   classesR   t   gct   it   rc(    (   RY   sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/monomer_library/linking_utils.pyt   get_classesÀ   s@    					 c         C   s  d s t  ‚ | d  k r! g  } n  | d  k r6 g  } n  | d  k rK g  } n  d } d  } d  } xœt |  j ƒ  ƒ D]ˆ\ }	 }
 |
 j | k r‘ qp n  | rµ |
 j j ƒ  t k rÔ qp qÔ n |
 j j ƒ  t d k rÔ qp n  |
 j ƒ  j	 j ƒ  } xt | j ƒ  ƒ D]ø \ } } | r,| j j ƒ  t k rKqü qKn | j j ƒ  t d k rKqü n  | j | k r`qü n  |
 j | j g } | j
 ƒ  | | k rŽqü n  | j ƒ  j	 j ƒ  } | rÄ| rÄ| | k rÄqü qÄn  t |
 | ƒ } | | k  rü |
 } | } | } qü qü Wqp W| | f S(   Ni    g     jø@i   (   t   AssertionErrorR/   Rh   RX   R>   RF   RG   R   R+   Rf   RI   R   (   t   atom_group1t   atom_group2t   ignore_hydrogenst    ignore_atom_names_in_atom_group1t    ignore_atom_names_in_atom_group2t   ignore_atom_name_pairst   min_d2t	   min_atom1t	   min_atom2Rn   R   t   altloc1t   jR   t   pairt   altloc2R   (    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/monomer_library/linking_utils.pyt   get_closest_atomsï   sR    		 	  	  	  
  	g      @c   
      C   sß   d s t  ‚ | | 9} g  } x¼ t |  j ƒ  ƒ D]¨ \ } } | r_ | j j ƒ  t k r_ q/ q_ n  xu t | j ƒ  ƒ D]a \ } } | r¢ | j j ƒ  t k r¢ qr q¢ n  t | | ƒ }	 |	 | k  rr | j | | g ƒ qr qr Wq/ W| S(   Ni    (   Rq   Rh   RX   RF   RG   R   R   R   (
   Rr   Rs   t   bond_cutoffRt   t
   link_atomsRn   R   R|   R   R   (    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/monomer_library/linking_utils.pyt   get_link_atoms  s    
 	 	c   	      C   s±   d s t  ‚ g  | j ƒ  D] } | j ƒ  ^ q } | j d |  j ƒ  j ƒ  d | ƒ } | j ƒ  } g  | j ƒ  D] } | j ƒ  ^ qn } | j j d d d | d | ƒ \ } } | S(   Ni    t
   sites_cartt   site_labelst   by_valuet   delta(	   Rq   RX   t   id_strt   pair_proxiest   xray_structure_simpleRƒ   t    sites_cart_used_for_pair_proxiest   nonbonded_proxiest
   get_sorted(	   t   pdb_inpt   pdb_hierarchyt   geometry_restraints_managerRR   R„   Rˆ   Rƒ   t   sorted_nonbonded_proxiest	   not_shown(    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/monomer_library/linking_utils.pyt   get_nonbonded-  s    "		"c         C   sv   d |  j  | j  f } | | j k r9 | j | t | f Sd | j  |  j  f } | | j k rr | j | t | f Sd S(   Ns   %s-%s(   NNN(   R,   t   link_link_id_dictR0   R1   R/   (   Rr   Rs   t   mon_lib_srvt
   simple_key(    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/monomer_library/linking_utils.pyt   is_atom_group_pair_linkedR  s    g333333@i#   c            sk  ‡  ‡ ‡ f d †  } ‡  ‡ f d †  } ˆ  j  ˆ ƒ | k r@ d  Sd d l m } ˆ  j ƒ  j j ƒ  d ˆ j ƒ  j j ƒ  d k r— ˆ  } ˆ ‰  | ‰ n  ˆ  j ƒ  j j ƒ  d } ˆ j ƒ  j j ƒ  d }	 ˆ  j ƒ  }
 ˆ j ƒ  } yR |
 d d !| d d !k r2t t	 |
 d d !ƒ t	 | d d !ƒ ƒ d	 k  r2d  SWn t
 k
 rFn X| d
 k r\d } n  |	 d
 k rqd }	 n  ˆ  j j ƒ  } ˆ j j ƒ  } g  } x’ | j ƒ  D]„ \ } } | d | |	 f k r¢g  | d D] } | d | d f ^ qÏ} | | f | k s| | f | k r&| j | ƒ q&q¢q¢Wt | ƒ d k r@d  St | ƒ d k rg| ƒ  rc| d Sd  Sd  S(   Nc    	         s  d d  l  }  ˆ  j ƒ  j d ƒ } ˆ  j ƒ  j d ƒ } ˆ  j ƒ  j d ƒ } t j | j g ƒ t j | j g ƒ } t j | j g ƒ t j | j g ƒ } | j | ƒ } t j ˆ j g ƒ t j ˆ  j g ƒ } | j | ƒ | j ƒ  | j ƒ  } d |  j	 |  j
 t | d ƒ ƒ ƒ ˆ k  S(   Niÿÿÿÿt   C4t   C5t   C6iZ   i    (   t   mathR+   t   get_atomR   R    R   R"   R!   t   normt   degreest   acost   abs(	   Rš   t   a1pt   a2pt   a3pt   v1pt   v2pt   vnt   vlt   cos_phi(   R   R   t   rna_dna_angle_cutoff(    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/monomer_library/linking_utils.pyt   final_link_direction_checkl  s    (((#c            s+   ˆ  j  ƒ  j |  ƒ j ˆ j  ƒ  j | ƒ ƒ S(   N(   R+   R›   t   distance(   t   name1t   name2(   R   R   (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/monomer_library/linking_utils.pyt   get_distance_atomsz  s    iÿÿÿÿ(   t   basepairs_lengthsi   i   i   i   i   RD   t   Ui    i   (   Rª   R/   t   bondlength_defaultsR®   R+   R,   RG   R‡   RŸ   t   intt
   ValueErrorR>   t	   iteritemsR   RK   (   R   R   t   rna_dna_bond_cutoffR¨   R©   R­   R®   t   tt   rn1t   rn2t   atom1_idstrt   atom2_idstrt   an1t   an2t   possible_classest   kRS   t   xt   arr_to_check(    (   R   R   R¨   sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/monomer_library/linking_utils.pyt   is_linked_basepairsg  sH    2	0 	 	+$g      @gffffffþ?g×£p=
×ÿ?g      à?g      @g       @c         C   s:  |  j  j ƒ  j ƒ  t k r t S| j  j ƒ  j ƒ  t k r> t St j } t j | | | |
 |	 | | ƒ } t |  d t	 ƒ} t | d t	 ƒ} t j
 |  | ƒ } t j
 | | ƒ } t j |  | ƒ d k rï t j | | ƒ d k rï d } d } n  | | g } | j ƒ  | rd G| G| GHn  | | k r+t St | ƒ } | rId G| GHn  | j | d  ƒ } | d  k	 r™|  j  t k s…| j  t k r™| | d 7} q™n  | r«d G| GHn  | r¾| d } n t |  | ƒ } | rßd G| GHn  | d  k	 r| | k  r| rd G| G| GHn  t S| rt	 Sd	 | k r7d
 | k r7t	 Sd	 | k rSd | k rSt	 Sd
 | k rod | k rot	 Sd | k r‹d | k r‹t	 S| j d	 ƒ d k rÎt |  | d | d | ƒ} | d  k	 rÎt	 Sn  t j |  | ƒ d k rt j | | ƒ d k rt	 Sd | k rE|
 |
 } d | k r1|	 |	 } n  | | k rAt St	 Sd | k r¹|  j  j ƒ  j ƒ  t k s‡| j  j ƒ  j ƒ  t k r‹t	 Sd G| GH|  j ƒ  GH| j ƒ  GHd s¹t ‚ n  d | k rÉt	 S| d
 k r| d
 k r| rd G|  j ƒ  G| j ƒ  GHqn  d | k r$| r d GHn  t	 S| r6d d GHn  t S(   NRi   t   sulfurt   lookup1t   lookup2i   t   limitR   s
   limit < d2Rc   Rb   Ra   R\   R´   R¨   R_   R[   RZ   t   lookupi    s   AMINO ACIDSs   other returns Trues   drop through i   (   RF   RG   R.   R   R0   R   t   skip_if_botht   update_skip_if_longerRp   R1   t   adjust_classt   sulfur_classRI   t   tuplet   getR/   R   R   t   countRÀ   R   R*   Rq   (   R   R   Rª   t   max_bonded_cutofft   amino_acid_bond_cutoffR´   R¨   t   inter_residue_bond_cutofft   second_row_buffert   metal_coordination_cutofft   saccharide_bond_cutofft   sulfur_bond_cutofft   other_bond_cutofft   use_only_bond_cutoffR2   RÆ   t   skip_if_longert   class1t   class2RÅ   RÄ   R   t
   link_class(    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/monomer_library/linking_utils.pyt   is_atom_pair_linked   sº    				
      	
 	 
  c         c   s<   x |  j  ƒ  D] } | Vq Wx | j  ƒ  D] } | Vq) Wd  S(   N(   RX   (   Rr   Rs   RR   (    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/monomer_library/linking_utils.pyt   generate_atoms_from_atom_groups(  s     	 c   
      C   sð   i  } | r | | 9} n  xÐ t  t |  | ƒ ƒ D]¹ \ } } xª t  t |  | ƒ ƒ D]“ \ } } | | k ro qQ n  | rQ t | | ƒ }	 |	 | k rä | j | j g  ƒ | | j j | ƒ | j | j g  ƒ | | j j | ƒ qä qQ qQ Wq/ W| S(   N(   Rh   RÛ   R   t
   setdefaultt   i_seqR   (
   Rr   Rs   R€   R2   Ro   Rn   R   R|   R   R   (    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/monomer_library/linking_utils.pyt   get_bonded_from_atom_groups,  s"     "c         C   sZ  d  } | r | | 9} g  } n  | j ƒ  } | j ƒ  } | j ƒ  } | j ƒ  } x|  j ƒ  D]ö}	 |	 j | j k rz q\ n  | r� d |	 j GHn  xÀ|	 j ƒ  D]²}
 |
 j | j k rº qœ n  | rÏ d |
 j GHn  x||
 j ƒ  D]n} | j | j k rú qÜ n  | rd | j | j f GHn  t } x)t	 | j
 ƒ  ƒ D]\ } } | j | j k rUq1n  | rsd | j | j f GHn  | r×xW | j ƒ  D]I } | j | j k r¤q†n  t | | ƒ } | | k r†| j | ƒ q†q†W| Sd } d  } xV | j ƒ  D]H } | j | j k rqðn  t | | ƒ } | | k  rð| } | } qðqðW| r1| Sq1WqÜ Wqœ Wq\ Wd  S(   Ns   model: "%s"s   chain: "%s"s'     residue_group: resseq="%s" icode="%s"s(       atom_group: altloc="%s" resname="%s"iè  (   R/   R+   t   modelst   idt   chainst   residue_groupsRH   t   icodeR0   Rh   t   atom_groupsR,   Rf   RX   R>   R   R   (   t	   hierarchyRR   R€   R2   RX   t   target_atom_groupt   target_residue_groupt   target_chaint   target_modelt   modelt   chaint   residue_groupt   yield_residue_groupt   atom_group_iRk   R&   R   Rx   t   min_atom(    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/monomer_library/linking_utils.pyt
   get_bondedD  sf    
	          c      	   C   sý   g  } x“ | D]‹ } x‚ t  | ƒ D]t \ } } t |  | d | d | ƒ} | r  xD | D]9 }	 | rm | d }
 n
 | d }
 | j |
 | |	 g ƒ qT Wq  q  Wq W| rù xT | D]I } x | D] } | j Gq¶ Wt | d | d ƒ Gt | d | d ƒ GHq© Wn  | S(   NR€   R2   i    i   i   (   Rh   Rð   R   R>   R   (   Rå   t   bondsR€   R2   t   tmpt   bondRn   RR   Ro   t   rcaR\   RQ   (    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/monomer_library/linking_utils.pyt   get_angles_from_included_bondst  s(    	
%c	         C   sZ  d s t  ‚ | | 9} | j ƒ  }	 | j ƒ  }
 |	 j ƒ  } |
 j ƒ  } | j j ƒ  j ƒ  t k s| | j j ƒ  j ƒ  t k r½ | rŠ d GHn  d  St | | ƒ } | r¶ t |  | d | ƒSd  Sn™ t	 | | ƒ \ } } | d  k sê | d  k rî d  St
 | | ƒ | k r:| r6d | j ƒ  | j ƒ  t
 | | ƒ | f GHn  d  St |  | | d | d | ƒSd  S(   Ni    s   Returning None because of metalR2   s%   atoms too far apart %s %s %0.1f %0.1ft   intra_residue_bond_cutoff(   Rq   R+   RF   R.   RG   R   R/   R‚   t.   process_atom_groups_for_linking_multiple_linksR   R   R*   t+   process_atom_groups_for_linking_single_link(   RŽ   R   R   t   classes1t   classes2RÎ   R´   Rö   R2   Rr   Rs   t   residue_group1t   residue_group2R�   (    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/monomer_library/linking_utils.pyt   process_atom_groups_for_linking�  sD    
   		c         C   sS  t  | | ƒ r? | j j d ƒ d k r~ | } | } | } q~ n? t | | ƒ r~ | j j d ƒ d k r~ | } | } | } q~ n  d | j ƒ  j j ƒ  | j j ƒ  | j ƒ  j j ƒ  | j j ƒ  f } d | j ƒ  j j ƒ  | j ƒ  j j ƒ  f } | rMd | GHd | GH| j ƒ  GH| j ƒ  GHt | | ƒ GHt	 | | ƒ GHt  | | ƒ GHn  t | | ƒ rz| t
 k rqd } n  | }	 nZt	 | | ƒ r§| t k ržd } n  | }	 n-t  | | ƒ rÎd } d  }
 d  } | j j d ƒ d k ré| }
 n! | j j d ƒ d k r
| }
 n  | j j d ƒ d k r+| } n! | j j d ƒ d k rL| } n  |
 r| rt |  | | g g d	 d
 ƒ} | r‘d GH|
 G| G| GHn  t |
 | | d | ƒ} t |
 | | d | ƒ} | d  k rÖ| }	 qËd | |
 j j ƒ  d | j j ƒ  d f } | }	 qÔd d d GHt d ƒ t | j ƒ  ƒ t | j ƒ  ƒ t d t | | ƒ ƒ t d t	 | | ƒ ƒ t d t  | | ƒ ƒ |
 d  k r¡t d ƒ n  | d  k rºt d ƒ n  d d d GHd  Sn | }	 g  } x- | | g D] } | j | j d t ƒ ƒ qçW| r7d |	 GH| GH| j ƒ  GH| j ƒ  GHn  | g |	 g | | f g f S(   Nt   Ciÿÿÿÿs   %s:%s-%s:%ss   %s-%ss
   tmp_key %ss   long_tmp_key %sR   t   OR€   g      ü?RW   R2   s   %s%s-%ss    %st   !iT   s     Possible link ignoreds     N-linked glycan : %ss     O-linked glycan : %ss     Glycan-glycan   : %ss     No carbon atom founds     No oxygen atom foundt   pdbress   key %s(   R3   R>   t   findR7   R+   R,   RG   R*   R:   R=   t   standard_n_linkst   standard_o_linksR/   Rõ   RT   RW   R   RL   R   R‡   R1   (   RŽ   R   R   Rö   R2   t   tmp_atomt   long_tmp_keyt   tmp_keyt
   data_linkst   keyRM   RN   RO   R(   t   handt   data_link_keyt   pdbres_pairRR   (    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/monomer_library/linking_utils.pyRø   Á  s¦    						 	 	 	 				
  	c         C   sî   d s t  ‚ d „  } g  } g  } g  } x· | D]¯ \ } } d | | ƒ | | ƒ f }	 g  }
 x- | | g D] } |
 j | j d t ƒ ƒ qi W| r° | j ƒ  GH| j ƒ  GH|	 GHn  | j |
 ƒ | j |	 ƒ | j | | f ƒ q. W| | | f S(   Ni    c         S   s  d } xò d d d d g D]Þ } t  |  | d  ƒ d  k	 rW | d t  |  | ƒ j ƒ  7} q t  |  j ƒ  | d  ƒ d  k	 r› | d t  |  j ƒ  | ƒ j ƒ  7} q t  |  j ƒ  j ƒ  | d  ƒ d  k	 rë | d t  |  j ƒ  j ƒ  | ƒ j ƒ  7} q d s t ‚ q W| d  S(	   NR   R>   R,   RH   Rf   s   %s_i    iÿÿÿÿ(   R   R/   RG   R+   Rq   (   RR   R	  R   (    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/monomer_library/linking_utils.pyt   _quote/  s     &$,s   %s-%sR  (   Rq   R   R‡   R1   R*   (   RŽ   R�   R2   R  t   pdbres_pairst   keysRX   R   R   R	  R  RR   (    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/monomer_library/linking_utils.pyR÷   *  s$    	c         C   s¤   d d l  m } d } | d |  j 7} ye | d |  j 7} | d |  j j ƒ  7} | d |  j j ƒ  7} | d |  j 7} | d |  j 7} Wn t	 k
 rŸ n X| S(   Niÿÿÿÿ(   t
   show_stackR   s   %ss    %s(
   t   libtbx.introspectionR  t	   data_linkR  R   R*   R   t	   automatict   was_usedt	   Exception(   t   applyR  R   (    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/monomer_library/linking_utils.pyt   print_applyM  s     t   apply_cif_listc           B   s   e  Z d  „  Z d „  Z RS(   c         C   sS   d s t  ‚ d } x" |  D] } | d t | ƒ 7} q W| d 7} | d d 7} | S(   Ni    t   CIFss   
%ss   
t   _iP   (   Rq   R  (   R   R   t   ga(    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/monomer_library/linking_utils.pyR   \  s    
c         C   s.   d s t  ‚ d d GH| GHt j |  | ƒ d  S(   Ni    t   APPENDi
   (   Rq   t   listt
   __append__(   R   t   item(    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/monomer_library/linking_utils.pyR  e  s    	(   R   R   R   R  (    (    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/monomer_library/linking_utils.pyR  [  s   		c         C   s[   | j  j ƒ  t j k r t St |  | d d ƒ} t | ƒ t j | j  j ƒ  k rW t St S(   NR€   gÍÌÌÌÌÌü?(   RF   RG   R   t   simple_valenceR1   Rð   RK   R0   (   Rå   RR   Rñ   (    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/monomer_library/linking_utils.pyt   check_valencek  s     "(    (8   t
   __future__R    t   iotbxt   libtbx.utilsR   t   scitbx.array_familyR   t   mmtbx.chemical_componentsR   t   mmtbx.monomer_libraryR   t#   mmtbx.monomer_library.linking_setupR   R   R   t   pdbt   common_residue_names_get_classRg   R-   R4   R8   R;   R  R  t   not_correct_sugarsR   R   R   R)   R0   R3   R7   R:   R=   RT   RW   Rp   R1   R/   R   R‚   R’   R–   RÀ   RÚ   RÛ   RÞ   Rð   Rõ   Rý   Rø   R÷   R  R  R  R!  (    (    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/monomer_library/linking_utils.pyt   <module>   sœ   												1'	%	7z	/+g!	