ó
Hˆâ^c           @   ss  d  d l  Z d  d l Z d  d l Z d  d l Z d  d l m	 Z	 m
 Z
 d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d	 „  Z d
 „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z  d „  Z! d „  Z" d „  Z# d „  Z$ d „  Z% d „  Z& d „  Z' d  „  Z( d! „  Z) d" „  Z* d# „  Z+ d S($   iÿÿÿÿN(   t   expm3t   normc      
   C   sk   t  j ƒ  } xD t j |  D]5 } | j | d d | d d | d d | d ƒq W| j t j |  ƒ | S(   Ni    t   namei   t   elementi   t   hybridi   (   t   nxt   Grapht   aat   atomdatat   add_nodet   add_edges_fromt   bonddata(   t   aa_namet   aa_treet   atom(    (    s   coordinates_mut.pyt   create_tree_for_aa   s
    3c         C   s4   x- |  j  ƒ  D] } | | d |  j | d <q Wd  S(   Ni   t   XYZ(   t   nodest   node(   R   t   coordsR   (    (    s   coordinates_mut.pyt   add_coordinates_to_residue   s    c      
   C   s{   t  ƒ  } d d d d d d d d d	 d
 g
 } x; |  j ƒ  D]- } |  j | d | k r: | j | ƒ q: q: Wt j |  | ƒ S(   Nt   Nt   Ht   H1t   H2t   H3t   CAt   HAt   Ct   Ot   OXTR   (   t   listR   R   t   appendR   t   subgraph(   R   t   atoms_sidechaint   atoms_backbonesR   (    (    s   coordinates_mut.pyt   find_subgraph_sidechain   s    	c   	      C   sb  t  ƒ  } xR|  j ƒ  D]D} x;| j ƒ  D]-} |  j | d | j | d k r) |  j | d | j | d k r) |  j | d d k r  | j | | f ƒ qVt |  | ƒ } t | | ƒ } t | ƒ d k rVt | ƒ d k rV| d } | d } |  j | d | j | d k rS|  j | d | j | d k rS| j | | f ƒ qSqVq) q) Wq W| S(   NR   R   R   R   i   i    (   R   R   R   R    t   find_all_bonded_neighbourst   len(	   t   tree1t   tree2t   identical_atomst   atom1t   atom2t   host1t   host2t
   host_atom1t
   host_atom2(    (    s   coordinates_mut.pyt   find_identical_atoms#   s     	""$

""$c      
   C   s±   d d d d d d d d d	 d
 g
 } x† |  j  ƒ  D]x } |  j | d | k r1 xX | j  ƒ  D]G } |  j | d | j | d k r[ |  j | d | j | d <q[ q[ Wq1 q1 Wd  S(   NR   R   R   R   R   R   R   R   R   R   R   R   (   R   R   (   t   aa_tree1t   aa_tree2t   atoms_backboneR*   R+   (    (    s   coordinates_mut.pyt   assign_coordinates_backbone7   s    "c         C   s`   t  |  ƒ } t  | ƒ } t | | ƒ } x2 | D]* } |  j | d d | j | d d <q. Wd  S(   Ni    R   i   (   R$   R0   R   (   R1   R2   R'   R(   R)   t   match(    (    s   coordinates_mut.pyt"   assign_coordinates_identical_atomsA   s
    c         C   sc   t  ƒ  } t j |  d ƒ } xA |  j ƒ  D]3 } y | | Wq( t k
 rZ | j | ƒ q( Xq( W| S(   NR   (   R   R   t   get_node_attributesR   t   KeyErrorR    (   R   t   atoms_unassignedt   assigned_coordinatesR   (    (    s   coordinates_mut.pyt   find_atoms_without_coordsI   s    	c            s*   t  ‡  f d †  |  j d t ƒ ƒ d d S(   Nc            s   |  \ } } | d ˆ  k S(   NR   (    (   t   .0t   nt   d(   t   atomname(    s   coordinates_mut.pyt   <lambda>U   s    t   datai    (   t   filterR   t   True(   R   R?   (    (   R?   s   coordinates_mut.pyt   get_number_from_nameT   s    c         C   s3  |  j  | d } |  j  | d } |  j  | d } |  j  | d } | d k r› | d k r› | d k rx | d k rx d S| d k s | d k r” d Sd Sn”| d k s³ | d k r&| d k sË | d k rÏ d	 S| d
 k sç | d
 k rë d S| d k s| d k rd S| d k s| d k r/d Sn	| d k s>| d k r}| d k rZ| d k rZd S| d k rv| d k rvd Sd Sn² | d
 k s•| d
 k rÔ| d k r±| d k r±d S| d k rÍ| d k rÍd Sd Sn[ | d k sì| d k r+| d k r| d k rd S| d k r$| d k r$d Sd Sn d Sd  S(   NR   R   R   t   sp2g¼t“Vö?g      ø?g¤p=
×£ø?R   gq=
×£pñ?R   g¸…ëQ¸î?R   g)\Âõ(ð?t   Sgq=
×£põ?t   sp3g…ëQ¸…÷?g\Âõ(\õ?gÉv¾Ÿ/÷?g
×£p=
÷?gD‹lçû©ó?g´Èv¾Ÿý?g+‡Ùø?gÍÌÌÌÌÌü?g      ð?(   R   (   R   R*   R+   t   element1t   element2t   hybrid1t   hybrid2(    (    s   coordinates_mut.pyt   get_bondlengthW   sL    c         C   se   |  j  d | ƒ } t ƒ  } xC | D]; } | d | k rL | j | d ƒ q" | j | d ƒ q" W| S(   Nt   nbunchi    i   (   t   edgesR   R    (   R   R   t   bondst   neighbouring_atomst   bond(    (    s   coordinates_mut.pyR%   ‰   s    	c         C   sl   t  |  | ƒ } t ƒ  } t j |  d ƒ } x; | D]3 } y | | | j | ƒ Wq1 t k
 rc q1 Xq1 W| S(   NR   (   R%   R   R   R7   R    R8   (   R   R   t
   neighbourst   neighbours_with_coordsR:   t	   neighbour(    (    s   coordinates_mut.pyt   find_neighbours_with_coords”   s    	c         C   sf  |  j  | d } |  j  | d } | d k ro | d k rG t t t f S| d k r` t t t f St d ƒ ‚ nó | d k r¼ | d k r” t t t f S| d k r­ t t t f St d ƒ ‚ n¦ | d	 k r	| d k rá t t t f S| d k rú t t t f St d
 ƒ ‚ nY | d k r"t t t f S| d k rV| d k rGt t t f St d ƒ ‚ n t d ƒ ‚ d  S(   NR   R   R   RE   RG   s   C should be sp2 or sp3R   s   O should be sp2 or sp3R   s   N should be sp2 or sp3R   RF   s   S should be sp3s   Element not programmed(   R   t   FalseRC   t	   NameError(   R   R   R   R   (    (    s   coordinates_mut.pyt   vacancy_from_hybrid¡   s6    c         C   s   |  t  j j |  ƒ S(   N(   t   npt   linalgR   (   t   vector(    (    s   coordinates_mut.pyt   normalise_vectorÄ   s    c         C   sF  |  d d k rD |  d d k rD t  j |  d |  d d g ƒ } nø |  d d k rˆ |  d d k rˆ t  j |  d d |  d g ƒ } n´ |  d d k rÌ |  d d k rÌ t  j d |  d |  d g ƒ } np |  t  j d d d g ƒ k rù t d ƒ ‚ nC |  d d k r$t  j d d d g ƒ } n t  j d d d g ƒ } t | ƒ S(   Ni    g        i   i   s%   Bonded atoms are on top of each otherg      ð?(   RY   t   asarrayRW   R\   (   R[   t   perp_vector(    (    s   coordinates_mut.pyt   find_normal_vectorÈ   s     $ $ $c         C   sN   t  j | ƒ } t t  j t  j d ƒ | t | ƒ | ƒ ƒ } t  j | |  ƒ S(   Ni   (   RY   t   radiansR    t   crosst   eyeR   t   dot(   R[   t   axist   anglet   thetat   rotmat(    (    s   coordinates_mut.pyt   rotate_vectorÛ   s    /c         C   s(   | t  j |  | ƒ t  j |  |  ƒ |  S(   N(   RY   Rc   (   t   vec1t   vec2(    (    s   coordinates_mut.pyt   Gram_Schmidt_vectorà   s    c         C   sÀ   t  |  d | d ƒ d k r^ t  |  d | d ƒ d k r^ t  |  d | d ƒ d k r^ d St t j |  | ƒ ƒ } t j j t j t j | |  ƒ | ƒ t j |  | ƒ ƒ } t j | ƒ Sd  S(   Ni    gíµ ÷Æ°>i   i   g        (   t   absR\   RY   Ra   t   matht   atan2Rc   t   degrees(   t   v0t   v1t   plane_normalRe   (    (    s   coordinates_mut.pyt   angle_between_vectorsã   s    <9c         C   s-   t  t j |  ƒ ƒ } | d k r% t St Sd  S(   Ni    (   R&   R   t   cycle_basisRV   RC   (   R   t   length(    (    s   coordinates_mut.pyt   check_for_ringsñ   s    c         C   s4   x- | D]% } |  j  | d d k r( t St Sq Wd  S(   NR   RE   (   R   RV   RC   (   R   t
   ring_atomsR   (    (    s   coordinates_mut.pyt   check_planarity_ringù   s    c         C   sh   t  ƒ  } d } xL | D]D } y* |  j | d | j | ƒ | d 7} Wq t k
 rY q Xq W| | f S(   Ni    R   i   (   R   R   R    R8   (   R   Rw   t   existing_coordst   ncoordsR   (    (    s   coordinates_mut.pyt   get_existing_coords_ring  s    	c         C   sF   t  |  ƒ } t ƒ  } x* | D]" } | | k r | j | ƒ q q W| S(   N(   R;   R   R    (   R   t
   first_atomR9   t   chain_atomsR   (    (    s   coordinates_mut.pyt   get_atom_list_upto_ring  s    	c         C   s”  t  |  d ƒ } t  |  d ƒ } t  |  d ƒ } t j |  j | d ƒ } t j |  j | d ƒ } t j |  j | d ƒ } t j t j | d ƒ } t j t j | d ƒ }	 | |	 }
 | |
 } | | } | | } | | } t | | ƒ } t | | ƒ } t | | ƒ } x t j | j	 ƒ  D]j } t  |  | ƒ } t j t j | | ƒ } | |
 } | | } t
 | | | ƒ } | | |  j | d <q"Wd  S(   NR   t   CBt   CGR   i    i   (   RD   RY   R]   R   t   ringsRd   Rk   Rs   Rw   t   keysRh   (   R   t   resnameR   R   R€   t	   CA_coordst	   CB_coordst	   CG_coordst   CB_libt   CG_libt   diff_CGt   CA_CBt	   CB_CG_libt	   CB_CG_molt   lib_vect   mol_vecRe   R   t   numbert   atom_libt   position_libt   new_position(    (    s   coordinates_mut.pyt   assign_coordinates_ring  s0    






c   
      C   s…  | d k s$ | d k s$ | d k ra t  |  d ƒ } t  | d ƒ } |  j | d | j | d <n | d k s… | d k s… | d	 k r t  |  d
 ƒ } t  |  d ƒ } t  | d ƒ } t j |  j | d ƒ t j |  j | d ƒ } d t | ƒ } t j |  j | d ƒ | | j | d <na | d k sD| d k sD| d k rt  |  d ƒ }	 t  | d ƒ } |  j |	 d | j | d <n  d  S(   Nt   ILEt   CILEt   NILEt   CG1R€   R   t   THRt   CTHRt   NTHRR   t   HBg      ø?t   VALt   CVALt   NVALt   CG2(   RD   R   RY   R]   R\   (
   t   old_treet   new_treet   oldnamet   old_CG1t   new_CGt   old_CBt   old_HBt   bond_oldt   new_bondt   old_CG2(    (    s   coordinates_mut.pyt   position_CG_for_TRPI  s     $$2,$c         C   sË   t  |  ƒ d k r) |  d } | d } n |  } | } | d
 k rJ d } n  | d k r_ d } n  | d k rw | d k s¿ | d k r | d k s¿ | d k r§ | d	 k s¿ | d	 k rÃ | d k rÃ t St Sd  S(   Ni   i   t   HISt   HIDt   HIEt   HIPt   PHEt   TYRt   TRP(   R«   R¬   R­   R®   (   R«   R¬   R­   R®   (   R&   RC   RV   (   t   resname1t   resname2t	   resname1_t	   resname2_(    (    s   coordinates_mut.pyt   check_special_assignment[  s    
		c   3      C   s  |  \ } } | \ } } t  | ƒ d k rA | d } | d } n | } | } | d k re | d k s} | d k r | d k r d  S| d k rìt | d ƒ } t | d ƒ }	 t | d ƒ }
 t | d	 ƒ } t | d
 ƒ } t | d ƒ } t | d ƒ } t | d ƒ } t | d ƒ } t | d ƒ } t | d ƒ } t | d ƒ } | j | d | j | d <| j |	 d | j | d <| j |
 d | j | d <| j | d | j | d <| j | d | j | d <| j | d | j | d <n$t | d ƒ } t | d ƒ } t | d ƒ } t | d ƒ } t | d ƒ } t | d ƒ } t | d ƒ } t | d ƒ } t | d	 ƒ } t | d
 ƒ } | j | d | j | d <| j | d | j | d <| j | d | j | d <| j | d | j | d <| j | d | j | d <y> t | d ƒ } t | d ƒ } | j | d | j | d <Wn t k
 r_n Xt | d ƒ } t j | j | d ƒ } t j | j | d ƒ } | | }  d t |  ƒ }! t | d ƒ }" | |! | j |" d <t j | j | d ƒ t j | j | d ƒ }# t j | j |" d ƒ t j | j | d ƒ }$ t |# |$ ƒ }% d t j | j | d ƒ t j | j | d ƒ }& t j | j |" d ƒ |& }' t |' |% d ƒ }( t | d ƒ }) |& |( | j |) d <t | d ƒ }* t | d ƒ }+ t j | j |" d ƒ t j | j |) d ƒ }, t j | j | d ƒ t j | j |) d ƒ }- t j | j | d ƒ t j | j |" d ƒ }. t |, |. ƒ }/ |. |/ }0 t |, |- ƒ }1 |- |1 }2 | j |" d |/ |0 | j |+ d <| j |) d |1 |2 | j |* d <d  Sd  S(   Ni   i   R¯   R°   R±   t   CD2t   CD1t   CE2t   NE1t   HD1t   HE1t   ND1t   CE1t   NE2t   HD2t   HE2R   g=
×£p=ö?t   CZ2g      à?g     €f@t   CE3t   CZ3t   CH2(	   R&   RD   R   t
   IndexErrorRY   R]   R\   Rk   Rh   (3   t   aa_treest   resnamest   aa_tree_oldt   aa_tree_newR¢   t   newnamet   oldname_t   newname_t   old_CD2t   old_CD1t   old_CE2t   old_NE1t   old_HD1t   old_HE1t   new_ND1t   new_CD2t   new_CE1t   new_NE2t   new_HD2t   new_HE2t   old_ND1t   old_CE1t   old_NE2t   old_HD2t   new_CD1t   new_CE2t   new_NE1t   new_HD1t   old_HE2t   new_HE1t   H_coordst   host_coordst   bond_vectort   new_bond_vectort   new_CZ2t   CE2_CD2t   CE2_CZ2t   normalt   midpointt   CZ2_midt   CE3_midt   new_CE3t   new_CZ3t   new_CH2t   CE3_CZ2t   CE3_CD2t   CZ2_CE2t   perp_CH2t   par_CH2t   perp_CZ3t   par_CZ3(    (    s   coordinates_mut.pyt   special_assignmentp  sš    
 
226222$$c         C   sE  t  j |  j t |  d ƒ d ƒ } t  j |  j t |  d ƒ d ƒ } t  j |  j t |  d ƒ d ƒ } t  j |  j t |  d ƒ d ƒ } t  j |  j t |  d ƒ d ƒ } t t  j | | | | ƒ ƒ } t | | ƒ } t  j | | ƒ }	 t |  d ƒ } t |  d ƒ } t |  d ƒ } t | d ƒ }
 t | d ƒ } |	 d	 k rÆ|  j | d | j |
 d <t  j |  j | d ƒ t  j |  j | d ƒ } t  j |  j | d ƒ d
 | | j | d <n{ |  j | d | j |
 d <t  j |  j | d ƒ t  j |  j | d ƒ } t  j |  j | d ƒ d
 | | j | d <d  S(   NR   R   R   t   HA2t   HA3R   R   R   g        g¤p=
×£ø?(   RY   R]   R   RD   R\   Ra   Rc   (   RÉ   RÊ   R   R   Rú   Rû   R   Rë   t   HA2_HA3t   dotpR   R   RQ   (    (    s   coordinates_mut.pyt   mutate_GLY_chiralÊ  s*    ##### 202-c   
      C   sÜ   t  |  d ƒ } t  |  d ƒ } t  |  d ƒ } t  | d ƒ } t  | d ƒ } t  | d ƒ } |  j | d | j | d <t j |  j | d ƒ t j |  j | d ƒ } | j | d }	 |	 d t | ƒ | j | d <d  S(   NR€   t   HG2t   HG3t   HGt   OD1R   g
×£p=
÷?(   RD   R   RY   R]   R\   (
   RÉ   RÊ   t   CG_oldt   HG2_oldt   HG3_oldt   CG_newt   HG_newt   OD1_newt   CG_HG3R†   (    (    s   coordinates_mut.pyt   mutate_HYP_from_PROâ  s    2c         C   s9  t  j |  j t |  d ƒ d ƒ } t  j |  j t |  d ƒ d ƒ } t  j |  j t |  d ƒ d ƒ } t  j |  j t |  d ƒ d ƒ } t  j |  j t |  d ƒ d ƒ } t t  j | | | | ƒ ƒ } t | | ƒ } t  j | | ƒ d k r5t |  d ƒ } t |  d ƒ } t |  d ƒ } t  j |  j | d ƒ } t  j |  j | d ƒ }	 t  j |  j | d ƒ }
 t  j j |
 |	 ƒ } t  j j | |	 ƒ } |	 | t | |	 ƒ |  j | d <|	 | t |
 |	 ƒ |  j | d <y: |  j | d d =|  j | d	 d =|  j | d
 d =Wq5t	 k
 r1q5Xn  d  S(   NR   R   R   R›   R—   RŸ   g        i   i   i   (
   RY   R]   R   RD   R\   Ra   Rc   RZ   R   R8   (   RÊ   R   R   R›   R—   RŸ   Rë   t   CG2_HBt	   HB_coordsR…   t
   CG2_coordst   bond_CCt   bond_CH(    (    s   coordinates_mut.pyt   check_chirality_ILEð  s2    ##### ##c         C   s  t  j |  j t |  d ƒ d ƒ } t  j |  j t |  d ƒ d ƒ } t  j |  j t |  d ƒ d ƒ } t  j |  j t |  d ƒ d ƒ } t  j |  j t |  d ƒ d ƒ } t t  j | | | | ƒ ƒ } t | | ƒ } t  j | | ƒ d k  rt |  d ƒ } t |  d ƒ } t |  d ƒ } t  j |  j | d ƒ } t  j |  j | d ƒ }	 t  j |  j | d ƒ }
 t  j j |
 |	 ƒ } t  j j | |	 ƒ } |	 | t | |	 ƒ |  j | d <|	 | t |
 |	 ƒ |  j | d <y |  j | d d =Wqt	 k
 rqXn  d  S(	   NR   R   R   R›   t   OG1RŸ   g        i   (
   RY   R]   R   RD   R\   Ra   Rc   RZ   R   R8   (   RÊ   R   R   R›   R  RŸ   Rë   t   OG1_HBR  R…   t
   OG1_coordst   bond_COR  (    (    s   coordinates_mut.pyt   check_chirality_THR  s.    ##### ##c         C   s  t  j |  j t |  d ƒ d ƒ } t  j |  j t |  d ƒ d ƒ } t  j |  j t |  d ƒ d ƒ } t  j |  j t |  d ƒ d ƒ } t  j |  j t |  d ƒ d ƒ } t t  j | | | | ƒ ƒ } t | | ƒ } t  j | | ƒ d k rt |  d ƒ } t |  d ƒ } t |  d ƒ } t  j |  j | d ƒ } t  j |  j | d ƒ }	 t  j |  j | d ƒ }
 t  j j |
 |	 ƒ } t  j j | |	 ƒ } |	 | t | |	 ƒ |  j | d <|	 | t |
 |	 ƒ |  j | d <y |  j | d d =Wqt	 k
 rqXn  d  S(	   NR€   R   R   t   CDR  R  g        i   (
   RY   R]   R   RD   R\   Ra   Rc   RZ   R   R8   (   RÊ   R€   R   R  R  R  Rë   t   OD1_HGt	   HG_coordsR†   t
   OD1_coordsR  R  (    (    s   coordinates_mut.pyt   check_chirality_HYP&  s.    ##### ##c         C   s4  t  |  d ƒ } t  |  d ƒ } t  |  d ƒ } t  |  d ƒ } t  |  d ƒ } t j |  j | d ƒ } t j |  j | d ƒ } t j |  j | d ƒ } | | }	 | | }
 t |
 |	 ƒ } d | | } | | } | | | } t j | | | ƒ } | d | d | } | |  j | d <| |  j | d <d  S(	   NR   R   R   R€   R  R   g      à?g…ëQ¸Õ?(   RD   RY   R]   R   Rk   Ra   (   R   R   R   R   R€   R  R„   t   N_coordsR…   t   N_CAt   N_CBt   perp_1t	   midpoint1t	   midpoint2t	   CD_coordst   perp_2R†   (    (    s   coordinates_mut.pyt   create_proline_coordsA  s&    


c         C   s£  t  |  | ƒ } t j |  j | d ƒ } g  | D]  } t j |  j | d ƒ ^ q0 } t |  | | ƒ } t |  | ƒ \ } }	 }
 t | ƒ d k r£ |  j | d =nü| ržt | ƒ d k r"t j | ƒ t j | d ƒ } t | ƒ } t | | d ƒ } | t	 | ƒ } | | |  j | d <qŸt | ƒ d k rÝt j | d ƒ } t j | d ƒ } t j | | ƒ } t j | | ƒ } t
 | | ƒ } | | } t | | d ƒ } | | } | t	 | ƒ } | | |  j | d <qŸt | ƒ d k rt j d d d g ƒ } x# | D] } | |  j | d 7} qWt j | d d	 | d d	 | d d	 g ƒ } | | } | t	 | ƒ } | | |  j | d <qŸt d
 ƒ ‚ n|	 r“t | ƒ d k r| | d } t | ƒ } t | | d ƒ } | t	 | ƒ } | | |  j | d <qŸt | ƒ d k r„| | d } | | d } t
 | | ƒ } | | } | | } | t	 | ƒ } | | |  j | d <qŸt d ƒ ‚ n t d ƒ ‚ d  S(   NR   i    i   g     `[@i   g      ^Ài   g        g      @sb   Too few or many neighbours known for creating a 
                               tetrahedral centreg      ^@s]   Too few or many neighbours known for creating a 
                               planar centres)   Cannot create new bond with terminal atom(   RU   RY   R]   R   RL   RX   R&   R_   Rh   R\   Rk   RW   (   R   t   new_atomt	   host_atomt   neighbours_hostRå   t   xt   neighbours_coordst
   bondlengtht   tetrahedralt   planart   terminalRæ   t	   perp_unitRç   t
   neighbour1t
   neighbour2t   bond1t   bond2R  t   para_1t   new_perpR¨   t   centroidR   (    (    s   coordinates_mut.pyt   create_new_coords_one_host[  sj    - 

0


c         C   sÁ   x6 | D]. } |  j  | d d k r |  j  | d =q q Wt | ƒ d k r½ | d } | d } | | k r” y |  j  | d =Wqº t k
 r qº Xq½ y |  j  | d =Wq½ t k
 r¹ q½ Xn  d  S(   NR   R   R   i   i    i   (   R   R&   R8   (   R   t   hostst   hostR*   R+   (    (    s   coordinates_mut.pyt   remove_multiple_hosts™  s     

(,   t   amino_acidsR   t   aa_ringdataR   t   numpyRY   t   networkxR   t   scipy.linalgR    R   R   R   R$   R0   R4   R6   R;   RD   RL   R%   RU   RX   R\   R_   Rh   Rk   Rs   Rv   Rx   R{   R~   R“   Rª   R¶   Rù   Rþ   R
  R  R  R  R#  R5  R8  (    (    (    s   coordinates_mut.pyt   <module>   sJ   			
		
				2			#										4			Z							>