ó
šxTc           @   s   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 m	 Z	 d  d l
 Z
 d  d l Z d „  Z d „  Z d e f d	 „  ƒ  YZ d
 „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d d d d „ Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d e f d „  ƒ  YZ  d e f d  „  ƒ  YZ! d! „  Z" d" e f d# „  ƒ  YZ# d$ e f d% „  ƒ  YZ$ d& e f d' „  ƒ  YZ% d( e f d) „  ƒ  YZ& d* e f d+ „  ƒ  YZ' d, e f d- „  ƒ  YZ( d. „  Z) d/ „  Z* d S(0   iÿÿÿÿ(   t   division(   t   ncs(   t   flexN(   t   dequec         c   s�   d | k s t  ‚ | g | } | |  | } t d | d |  d d | d ƒ } x( | d | D] } | j | ƒ | Vqa Wd S(   s7   
    Groups values and pads them to a fixed length
    i    t   iterablei   t   maxleni   N(   t   AssertionErrorR   t   append(   t   sequencet   widtht   paddingt   paddedt   dt   v(    (    s9   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/rsam.pyt   localize   s    c         c   s’   x‹ |  r� t  |  ƒ } | j ƒ  \ } } x= | D]5 \ } } | d | d | ƒ s] | d 8} Pn  | } q. W| d } |  |  } |  | }  | Vq Wd S(   s\   
    Breaks up sequences where elements are not consecutive according to a
    property
    t   leftt   righti   N(   t	   enumeratet   next(   R   t   consecutivityt   itert   indexR   R   t   divisort   leader(    (    s9   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/rsam.pyt   split    s    	




t   StructuralConsecutivityc           B   s/   e  Z d  Z d „  Z d „  Z e d „  ƒ Z RS(   sX  
    Two residue_groups are consecutive if:
        distance( pre of left, post of right ) <= distance_cutoff
    NB. If either ( pre of left, post of right ) is missing, the two
        are not consecutive
    If a residue_group is disordered, only 'A'-'A' and ' '-'A' type bonds are
        considered, the rest is assumed to be correct 
    c         C   s   | |  _  | |  _ | |  _ d  S(   N(   t   pre_bond_atomt   post_bond_atomt   distance_cutoff(   t   selfR   R   R   (    (    s9   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/rsam.pyt   __init__A   s    		c   	      C   s  |  j  d | d |  j ƒ } |  j  d | d |  j ƒ } | sD | rH t Sd | k rq | d } | t | ƒ } nz d | k rš | d } | t | ƒ } nQ t g  | D] } | | k r¤ | ^ q¤ ƒ } | sÏ t S| | d } | | d } | j | ƒ |  j k S(   Nt   rgt   namet    i    (   t
   candidatesR   R   t   Falset   mint   sortedt   distanceR   (	   R   R   R   t   pre_atom_witht   post_atom_witht   pre_atomt	   post_atomt   at   common(    (    s9   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/rsam.pyt   __call__H   s     

+c         C   sA   t  g  |  j ƒ  D]* } | j | k r | j ƒ  j | f ^ q ƒ S(   N(   t   dictt   atomsR    t   parentt   altloc(   R   R    R+   (    (    s9   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/rsam.pyR"   d   s    (   t   __name__t
   __module__t   __doc__R   R-   t   staticmethodR"   (    (    (    s9   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/rsam.pyR   7   s   		c         C   s�  t  g  t |  ƒ D] } | d | k r | ^ q Œ  \ } } d j | ƒ } d	 g t |  ƒ }	 d }
 x#t d | d | ƒ D]} t | ƒ | k  r— qy n  d j g  | D]% } | j | j ƒ  d j d ƒ ^ q¤ ƒ } t	 j
 | | |
 ƒ } | st d | | |
 f ‚ n  | j d ƒ |
 } xb t | d | ƒD]N \ } } | t | ƒ k  sQt ‚ | | t |	 ƒ k  smt ‚ | |	 | | <q-W| }
 qy W|	 S(
   s,   
    Aligns residue list with sequence 
    i   R!   i    R   R   t   .s8   Full sequence = %s, Fragment sequence = %s, (start = %s)t   startN(   t   zipR   t   joint   Nonet   lenR   t   gett   atom_groupst   resnamet   ret   searcht   RuntimeErrorR7   R   (   R   t   residuesR   t   one_letter_fort
   min_lengtht   gap_chart   pt   indicest   gaplesst   mappingt   currentt   fragmentR   t   fragment_seqt   matchR7   t   it   residue_group(    (    s9   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/rsam.pyt   map_residues_to_sequencel   s2    82
c         C   s0   t  j ƒ  } | j |  ƒ | j | ƒ | j ƒ  S(   N(   R   t   LCSTreet   insert_wordt   get_longest_common_substring(   R   R   t   lcs(    (    s9   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/rsam.pyt   sequence_overlapŸ   s    c         C   sy   |  j  | ƒ } | d k s! t ‚ | j  | ƒ } | d k sB t ‚ | | } t |  ƒ | } | t | ƒ } | | | f S(   Niÿÿÿÿ(   t   findR   R;   (   R   R   RT   t   start_1t   start_2t   forwt   midwt   backw(    (    s9   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/rsam.pyt   sequence_shift§   s    
c         C   sf   t  d | d |  d t d | d |  ƒ ƒ \ } } } t d | ƒ } t |  ƒ } | |  |  | | | S(   NR   R   RT   i    (   R\   RU   t   maxR;   (   t
   seq_extendt	   seq_finalRY   RZ   R[   R7   t   length(    (    s9   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/rsam.pyt   sequence_stichµ   s    !c         C   sX   | | j  ƒ  k  s t ‚ | j ƒ  } t d | | d |  j ƒ | | <| j d | ƒ d  S(   NR^   R_   t	   sequences(   t   multiplicityR   t   sequence_stringsRa   R   t   extend(   R   t	   alignmentR   Rb   (    (    s9   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/rsam.pyt   alignment_stichÁ   s    
c         C   s,   | t  |  | t | t  | | t f S(   N(   RY   R[   (   R   R   RE   (    (    s9   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/rsam.pyt   sequence_matchÌ   s    i   i   gš™™™™™Ù?c         C   sM  g  } | }	 xt  d |  d | ƒ D]ë}
 t |
 ƒ | k  r@ q" n  t d |
 d | d | ƒ } t |
 ƒ } t j ƒ  } | j | ƒ | j |	 ƒ | j ƒ  } t | ƒ | k  rÃ t | ƒ | k  rÃ q" n  | j | ƒ } | d k sä t ‚ |	 j | ƒ } | d k st ‚ | | } | | } | t |	 ƒ } d	 g | t
 |
 | ƒ } d	 g | t |	 |  ƒ d	 g | } t g  t
 | | ƒ D]. \ } } | d	 k	 r}| d | k r}| ^ q}ƒ } | t | t |	 ƒ ƒ | k  rÙq" n  | j d „  t
 | | ƒ Dƒ ƒ |	 | }	 |	 s" Pq" q" W| j d	 g t |	 ƒ ƒ t | ƒ t | ƒ k sIt ‚ | S(
   s+   
    Aligns residue list with sequence
    R   R   t   rgsRC   t   unknowniÿÿÿÿi   c         s   s=   |  ]3 \ } } | d k	 r | d k	 r1 | d  n d Vq d S(   i    N(   R:   (   t   .0RF   t   s(    (    s9   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/rsam.pys	   <genexpr>  s    	N(   R   R;   t   one_letter_sequenceR   RQ   RR   RS   RV   R   R:   R8   t   listR$   Re   (   RB   R   R   RC   Rj   t   min_hssp_lengtht   min_fragment_lengtht   min_fractionRf   t	   remainingRK   RL   t   lRT   t   ssRW   RX   RY   RZ   R[   t   f_alit   s_aliRF   Rl   t   matching(    (    s9   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/rsam.pyt   align_residues_to_sequenceÔ   sJ    	$

&+
c         C   s…  g  } g  }	 | }
 x!t  d |  j ƒ  d | ƒ D]} t d | d | d | ƒ } t | ƒ } t j ƒ  } | j | ƒ | j |
 ƒ | j ƒ  } t | ƒ | k  rÕ t | ƒ | k  rÕ | j | ƒ |	 j | | ƒ q. n  | j	 | ƒ } | d k sö t
 ‚ |
 j	 | ƒ } | d k st
 ‚ | | } | | } | t |
 ƒ } d
 g | | } | | |
 |  | | } d } x[ t | | ƒ D]J \ } } | s•q}n  | j | j ƒ  d j | ƒ | k r}| d 7} q}q}W| t | t |
 ƒ ƒ | k  r| j | ƒ |	 j | | ƒ q. n  | j | ƒ |	 j | ƒ |
 | }
 q. W| j d
 g t |
 ƒ ƒ |	 j |
 ƒ t t j | g  ƒ t t j |	 d	 ƒ f S(   s,   
    Aligns residue list with sequence 
    R   R   Ri   RC   Rj   iÿÿÿÿi    i   R!   N(   R   t   residue_groupsRm   R;   R   RQ   RR   RS   R   RV   R   R:   R8   R<   R=   R>   R$   t   reducet   operatort   add(   t   chainR   R   RC   Rj   Ro   Rq   RE   t   firstt   secondRr   RK   RL   Rs   RT   Rt   RW   RX   RY   RZ   R[   Ru   Rv   Rw   t   fRl   (    (    s9   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/rsam.pyt   align_chain_to_sequence  sT    "	$

%c            sŒ  d j  ‡  f d †  | Dƒ ƒ } t d |  d | d | j d | j ƒ  d | j d | d	 | d
 ˆ  ƒ \ } } t | ƒ t | ƒ k sˆ t ‚ d j  ‡  f d †  | Dƒ ƒ | k s³ t ‚ d  g t | ƒ }	 g  t | ƒ D] \ }
 } | ˆ  k rÓ |
 ^ qÓ } xŽ t g  t	 | | ƒ D] } | d ˆ  k r| ^ qƒ D]T \ }
 \ } } |
 t | ƒ k  sZt ‚ | |
 t |	 ƒ k  svt ‚ | |	 | |
 <q0W|	 S(   NR!   c         3   s!   |  ] } | ˆ  k r | Vq d  S(   N(    (   Rk   t   c(   t   gap(    s9   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/rsam.pys	   <genexpr>_  s    R}   R   R   RC   Rj   Ro   Rq   RE   c         3   s!   |  ] } | ˆ  k r | Vq d  S(   N(    (   Rk   R‚   (   Rƒ   (    s9   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/rsam.pys	   <genexpr>l  s    i   (
   R9   R�   R   RC   t   unknown_one_letterR;   R   R:   R   R8   (   R}   t   mtypeR   Rƒ   Ro   t   min_matching_fractionRH   t   a_rgst   a_seqRI   RN   R‚   RG   RF   R   (    (   Rƒ   s9   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/rsam.pyt   match_chain_to_alignment]  s&    		+1Kc         C   s¼  g  } g  } | }	 x…t  d |  d | ƒ D]n}
 d j g  |
 D]% } | j | j ƒ  d j | ƒ ^ q; ƒ } t | ƒ } t j ƒ  } | j | ƒ | j |	 ƒ | j	 ƒ  } t | ƒ | k  rï t | ƒ | k  rï | j
 | ƒ | j
 | | ƒ q( n  | j | ƒ } | d k st ‚ |	 j | ƒ } | d k s1t ‚ | | } | | } | t |	 ƒ } | j
 | | | ƒ | j
 | | |	 |  | | ƒ |	 | }	 q( Wt t j | ƒ t t j | ƒ f S(   s,   
    Aligns residue list with sequence 
    R   R   R!   i    iÿÿÿÿ(   R   R9   R<   R=   R>   R;   R   RQ   RR   RS   R   RV   R   Rz   R{   R|   (   RB   R   R   RC   Ro   Rj   RE   R~   R   Rr   RK   R   RL   Rs   RT   Rt   RW   RX   RY   RZ   R[   (    (    s9   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/rsam.pyt   mismatching_sequence_alignmentx  s6    2$

!c   
      C   su   g  } xh |  D]` } y1 t  d | d | d | d | d | d | ƒ } Wn t k
 r_ }	 d  } n X| j | ƒ q W| S(   NR   RB   R   RC   RD   RE   (   RP   RA   R:   R   (
   Rb   RB   R   RC   RD   RE   t   mappingst   seqt   resi_mapt   e(    (    s9   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/rsam.pyt   map_to_sequences§  s    	
c         C   s|   xo t  |  j ƒ D]^ \ } } y4 t d | d | d | d | d | d |  j ƒ } Wn t k
 rf q n X| | f SWd g  f S(   NR   RB   R   RC   RD   RE   iÿÿÿÿ(   R   t
   alignmentsRP   Rƒ   RA   (   Rf   RB   R   RC   RD   R   RŒ   R�   (    (    s9   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/rsam.pyt   map_to_alignmentÅ  s    c         C   sH   t  g  | D] } | r
 | ^ q
 ƒ } g  |  D] } | | k r, | ^ q, S(   N(   t   set(   R   R   t   rt   substrahendR   (    (    s9   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/rsam.pyt   residue_group_differenceÚ  s    %c         C   sZ   t  g  | D] } | r
 | j ƒ  ^ q
 ƒ } g  |  j ƒ  D] } | j ƒ  | k r8 | ^ q8 S(   N(   R’   t	   memory_idRy   (   R}   Ry   R   t   substr(    (    s9   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/rsam.pyt   chain_residue_groups_differenceà  s    +c         C   s6   g  |  D]+ } | r | j  ƒ  r | j  ƒ  d j ^ q S(   Ni    (   R=   R>   (   Ri   R   (    (    s9   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/rsam.pyt   three_letter_sequenceæ  s    c         C   s5   d j  g  t d |  ƒ D] } | j | | ƒ ^ q ƒ S(   NR!   Ri   (   R9   R™   R<   (   Ri   RC   Rj   Rl   (    (    s9   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/rsam.pyRm   ë  s    	t   NumberingFramec           B   s&   e  Z d  Z d „  Z e d „  ƒ Z RS(   sB   
    Calculates frame shift wrt master residue group sequence
    c         C   sp  | s | r# d |  _  d |  _ nIt j ƒ  } t t d | d | ƒ ƒ } g  | D] } |  j d | ƒ ^ qQ } g  } x´ t d | d | ƒ D]� }	 |  j d |	 ƒ }
 | j |
 ƒ xu t | | ƒ D]d \ } } | j	 | ƒ | j
 d t | ƒ d t |
 ƒ ƒ \ } } } | j | | |	 | | f ƒ qÀ Wq‹ Wt | d d „  ƒ\ } } } | j ƒ  | j ƒ  |  _  | |  _ d  S(   Ni    R   R   RB   t   keyc         S   s   |  d S(   Ni   (    (   Rl   (    (    s9   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/rsam.pyt   <lambda>  s    (   t   shiftt   overlapt   difflibt   SequenceMatcherRn   R   t   to_sequencet   set_seq2R8   t   set_seq1t   find_longest_matchR;   R   R]   t   resseq_as_int(   R   t	   residues1t	   residues2R   t   matchert
   fragments1R€   t
   sequences1t   matchest   frag2t   seq2t   frag1t   seq1R+   t   bR`   t   r1t   r2(    (    s9   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/rsam.pyR   ö  s&    	%- c         C   s$   g  |  D] } | j  ƒ  d j ^ q S(   Ni    (   R=   R>   (   RB   R   (    (    s9   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/rsam.pyR¡     s    (   R2   R3   R4   R   R5   R¡   (    (    (    s9   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/rsam.pyRš   ñ  s   	"t   VanDerWaalsRadiusc           B   s&   e  Z d  Z d „  Z e d „  ƒ Z RS(   s4   
    Supplies van der Waals-radii of given type
    c         C   s©   | j  ƒ  } t j ƒ  |  _ |  j j t | ƒ ƒ xq | D]i } | j | k rg |  j j | | j ƒ q8 | j | j	 ƒ  j
 i  ƒ } |  j j | j | j | ƒ ƒ q8 Wd  S(   N(   R/   R   t   doublet   valuest   reserveR;   R    R   R<   R0   R>   (   R   t   roott   radius_for_mainchain_atomt   sidechain_data_fort   unknown_radiusR/   t   atomt
   radius_for(    (    s9   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/rsam.pyR   #  s    c      
   C   sL   |  d | d t  t | j | j ƒ ƒ d t  t | j | j ƒ ƒ d | j ƒ S(   NR·   R¸   R¹   Rº   (   R.   R8   t   mainchain_atom_namest   mainchain_atom_radiit   three_letter_codest   sidechain_atom_radii_dictst   unknown_atom_radius(   t   clsR·   t   mmt(    (    s9   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/rsam.pyt   from_mmt8  s    (   R2   R3   R4   R   t   classmethodRÄ   (    (    (    s9   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/rsam.pyR³     s   	c         C   s   | |  } | j  | ƒ S(   N(   t   dot(   t   centret   coordst   diffs(    (    s9   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/rsam.pyt   distance_sqs_fromG  s    
t   AccessibleSurfaceAreac           B   sY   e  Z d  Z d d d „ Z e d „  ƒ Z e d „  ƒ Z e d „  ƒ Z e d „  ƒ Z RS(   s3   
    Calculates accessible surface area values
    gffffffö?iÀ  c         C   s¶  d | k s t  d | ƒ ‚ d | k s8 t  d | ƒ ‚ t | j ƒ  ƒ } | j ƒ  j ƒ  } |  j d | j d | ƒ } g  | D] } | j ƒ  j ^ q~ }	 |  j d | ƒ }
 t	 j
 ƒ  } | j t | ƒ ƒ | j d | } x¸ t | | j | ƒ D]¡ \ } } } t	 j t d | j d	 | ƒ ƒ } | j | } |  j d | d
 | | k  d | d | d |	 ƒ } | | |
 | j } | j |  j d | d | ƒ ƒ qñ Wd t j | | | |  _ d  S(   Ni    s   Negative probe radius: %ss   Negative precision: %st   radiit   probet   countg       @RÇ   RÈ   t	   selectionR/   t   probing_radii_sqst   altlocst   pointst   considered_neighbour_datag      @(   R   Rn   R/   t   extract_xyzt   probing_radii_squaresRµ   R0   R1   t   points_on_sphereR   R´   R¶   R;   R8   t   sqrtRÊ   t   xyzt   atoms_to_considerR   t   count_accessible_pointst   matht   pi(   R   R·   t	   vdw_radiiRÍ   t	   precisionR/   RÈ   RÐ   R+   RÑ   t   sphere_pointst   accessible_countst   max_distancesR»   t   radiust   maxdistt	   distancest   cutofft   selectedt   trial_points(    (    s9   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/rsam.pyR   R  s8    			"%			c         C   sK   x> | D]6 \ } } t  d | d |  ƒ } |  j | | k ƒ }  q Wt |  ƒ S(   NRÇ   RÈ   (   RÊ   t   selectR;   (   RÒ   RÓ   t   trialt   probing_radius_sqt   distance_sqs(    (    s9   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/rsam.pyRÚ   }  s    c         C   s   |  | } | | S(   N(    (   RÌ   RÍ   t   probing_radii(    (    s9   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/rsam.pyRÕ   ‡  s    
c   
         sŒ   ˆ j  ƒ  j ‰ ‡ f d †  ‰  ˆ r9 ‡  ‡ f d †  } n ˆ  } g  t | | | | ƒ D]3 \ } } } }	 | | | | ƒ rU | j |	 f ^ qU S(   Nc            s   |  ˆ  k o | S(   N(    (   R+   Rl   t   aloc(   RÇ   (    s9   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/rsam.pyRœ   ˜  s    c            s#   | s | ˆ k o" ˆ  |  | | ƒ S(   N(    (   R+   Rl   Rí   (   t   base_selectort   centre_atom_altloc(    s9   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/rsam.pyRœ   ›  s    (   R0   R1   R8   RØ   (
   RÇ   RÏ   R/   RÐ   RÑ   t   selectorR+   Rl   Rí   t   prs(    (   Rî   RÇ   Rï   s9   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/rsam.pyRÙ   Ž  s    	%c         C   s�   t  j d t  j d ƒ } d |  } t j |  ƒ } | | d | d } t j d | | ƒ } | | } t j t t j | ƒ | | t j | ƒ | ƒ ƒ S(   s6   Generates quasi equidistant points on a sphere surfaceg      @g      @g       @g      ð?(	   RÛ   RÜ   R×   R   t   double_ranget   vec3_doubleR8   t   cost   sin(   RÎ   t	   incrementt   offsetRG   t   yst   rst   phis(    (    s9   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/rsam.pyRÖ   ¨  s    

(	   R2   R3   R4   R   R5   RÚ   RÕ   RÙ   RÖ   (    (    (    s9   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/rsam.pyRË   M  s   +
t	   RGIndexerc           B   s)   e  Z d  Z d „  Z d „  Z d „  Z RS(   s3   
    Quick indexing based on ( resseq, icode )
    c         C   sM   t  g  t | ƒ D]- \ } } | j ƒ  | j f | | f f ^ q ƒ |  _ d  S(   N(   R.   R   R¥   t   icodet   data(   R   Ri   RN   R   (    (    s9   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/rsam.pyR   À  s    c         C   s   |  j  | S(   N(   Rý   (   R   R›   (    (    s9   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/rsam.pyt   __getitem__È  s    c         C   s   | |  j  k S(   N(   Rý   (   R   R›   (    (    s9   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/rsam.pyt   __contains__Í  s    (   R2   R3   R4   R   Rþ   Rÿ   (    (    (    s9   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/rsam.pyRû   »  s   		t   DSSPInterfacec           B   s    e  Z d  Z d „  Z d „  Z RS(   s4   
    Runs DSSP to determine secondary structure
    c         C   sb  d d  l  } | j j j ƒ  } | j j j ƒ  } | j | ƒ | j | j ƒ  ƒ d d  l } | j	 j
 | j ƒ  ƒ \ } } | r“ | r“ t | ‚ n  g  |  _ | j j	 j d | ƒ } | d  k	 r^| j ƒ  }	 t d |	 ƒ }
 x3 | j D]( } |  j d | d |	 d |
 d d ƒ qå WxJ | j D]< } x3 | j D]( } |  j d | d |	 d |
 d d ƒ q+WqWn  d  S(	   Niÿÿÿÿt   recordsRi   t   sset   indexert   ss_typet   helixt   sheet(   t	   iotbx.pdbt   pdbt	   hierarchyR·   t   modelt   append_modelt   append_chaint   detached_copyt   mmtbx.secondary_structuret   secondary_structuret   run_ksdssp_directt   as_pdb_stringt
   ValueErrort   elementst   process_recordsR:   Ry   Rû   t   helicest$   register_secondary_structure_elementt   sheetst   strands(   R   R}   t   iotbxR·   R
  t   mmtbxR  t   errorst   annRi   R  R  R  t   strand(    (    s9   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/rsam.pyR   ×  s8    				c   
      C   sÅ   | j  | j f } | | k s$ t ‚ | | \ } } | | | k sJ t ‚ | j | j f } | | k sn t ‚ | | \ }	 } | |	 | k s” t ‚ | |	 k s¦ t ‚ |  j j | | |	 d !ƒ d  S(   Ni   (   t   start_resseqt   start_icodeR   t
   end_resseqt	   end_icodeR  R   (
   R   R  Ri   R  R  t   siR7   R   t   eit   end(    (    s9   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/rsam.pyR     s    (   R2   R3   R4   R   R  (    (    (    s9   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/rsam.pyR   Ò  s   	)t   AtomDescriptionc           B   s\   e  Z d  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z	 e
 d „  ƒ Z RS(	   s   
    Serializable atom
    c         C   sC   | |  _  | |  _ | |  _ | |  _ | |  _ | |  _ | |  _ d  S(   N(   R°   t   elementt   heteroR    t   occt   segidRØ   (   R   R°   R&  R'  R    R(  R)  RØ   (    (    s9   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/rsam.pyR     s    						c         C   s   d |  j  S(   Ns   atom %s(   R    (   R   (    (    s9   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/rsam.pyt
   identifier   s    c         C   s’   d d  l  } | j j j ƒ  } | j |  j ƒ | j |  j ƒ | j |  j	 ƒ | j
 |  j ƒ | j |  j ƒ | j |  j ƒ | j |  j ƒ | S(   Niÿÿÿÿ(   R  R  R	  R»   t   set_bR°   t   set_elementR&  t
   set_heteroR'  t   set_nameR    t   set_occR(  t	   set_segidR)  t   set_xyzRØ   (   R   R  t   new_atom(    (    s9   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/rsam.pyt   as_iotbx_object%  s    c         C   s.   |  j  |  j |  j |  j |  j |  j |  j f S(   N(   R°   R&  R'  R    R(  R)  RØ   (   R   (    (    s9   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/rsam.pyt   parseable_form4  s    c         C   s(   t  |  j |  j |  j |  j |  j f ƒ S(   N(   t   hashR&  R'  R    R(  R)  (   R   (    (    s9   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/rsam.pyt   __hash__9  s    c         C   s®   t  | |  j ƒ s t St |  j | j ƒ d k  o­ |  j | j k o­ |  j | j k o­ |  j | j k o­ |  j | j k o­ |  j	 | j	 k o­ |  j
 d |  j d | j ƒ d k  S(   Ng{®Gáz„?t   point1t   point2(   t
   isinstancet	   __class__R#   t   absR°   R&  R'  R    R(  R)  R&   RØ   (   R   t   other(    (    s9   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/rsam.pyt   __eq__@  s    c         C   s   |  | k S(   N(    (   R   R<  (    (    s9   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/rsam.pyt   __ne__P  s    c         C   sK   |  \ } } } | \ } } } t  j | | d | | d | | d ƒ S(   Ni   (   RÛ   R×   (   R7  R8  t   x1t   y1t   z1t   x2t   y2t   z2(    (    s9   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/rsam.pyR&   U  s    (   R2   R3   R4   R   R*  R3  R4  R6  R=  R>  R5   R&   (    (    (    s9   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/rsam.pyR%    s   							t   ProteinSidechainCBCompletionc           B   sS   e  Z d  Z d Z d Z d Z d Z e e e f Z d Z d „  Z	 e
 d „  ƒ Z RS(   s@   
    Calculates C-beta positions uniformly for each residue
    s    C  s    CA s    N  s    CB t   cbetac            sà   | d k sF | d k  sF |  j  ˆ  k sF t ‡  f d †  |  j Dƒ ƒ rR g  |  _ nŠ ˆ  |  j } t d | j d d d | j d |  j  d	 | j d
 | j	 d |  j
 d | j d ˆ  |  j j d ˆ  |  j j ƒ ƒ } | g |  _ d  S(   Nt   GLYi   c         3   s   |  ] } | ˆ  k Vq d  S(   N(    (   Rk   R+   (   t
   atom_named(    s9   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/rsam.pys	   <genexpr>m  s    R°   R&  s    CR'  R    R(  R)  RØ   t   cat   nR‚   (   t   CBt   anyt   NEEDEDt	   generatedt   CAR%  R°   R'  R(  R)  t   cb_coordinates_fromRØ   t   Nt   C(   R   RH  R>   t	   max_levelRI  Rý   (    (   RH  s9   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/rsam.pyR   j  s     '							c   	      C   s_  t  j | g ƒ |  } t  j | g ƒ |  } d | j ƒ  | d | j ƒ  | } d d | j ƒ  | d | j ƒ  | } t  j | d d | d d | d d | d d | d d | d d | d d | d d | d d | d d | d d | d d f g ƒ } d | j ƒ  | d | j ƒ  | d | j ƒ  | } | |  d S(   Ni   iÿÿÿÿi    i   gÐ»ëKºV`?gRçzp±Áí?g1ç¾A <ó?(   R   Ró   t   norm(	   RI  RJ  R‚   t   n_relt   c_relt   xt   yt   zt   cb_rel(    (    s9   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/rsam.pyRP  ƒ  s    &*//;8(   R2   R3   R4   RR  RO  RQ  RK  RM  t   NAMER   R5   RP  (    (    (    s9   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/rsam.pyRE  ^  s   	t
   SequenceDBc           B   s2   e  Z d  Z d „  Z d „  Z d „  Z d „  Z RS(   s:   
    Quick retrieval functions for matching sequences
    c         C   s   g  |  _  d  S(   N(   t   store(   R   (    (    s9   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/rsam.pyR   ¤  s    c         C   s   |  j  j | | f ƒ d  S(   N(   R]  R   (   R   R   Rý   (    (    s9   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/rsam.pyR|   ©  s    c         C   su   g  } t  | ƒ } x\ |  j D]Q \ } } t j ƒ  } | j | ƒ | j | ƒ | j ƒ  } | j t  | ƒ ƒ q W| S(   N(   R;   R]  R   RQ   RR   RS   R   (   R   R   Rw   t
   seq_lengthRl   R   RT   Rt   (    (    s9   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/rsam.pyRw   ®  s    c         C   s   t  |  j ƒ S(   N(   R;   R]  (   R   (    (    s9   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/rsam.pyRÎ   ½  s    (   R2   R3   R4   R   R|   Rw   RÎ   (    (    (    s9   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/rsam.pyR\  Ÿ  s
   			c         C   s°   | j  s( t | j ƒ t | j  ƒ k r; t d | j ‚ n  t | j  ƒ t | j  ƒ } t t | j | j  ƒ ƒ } t g  |  D] } | j | | ƒ ^ q| ƒ t |  ƒ d | j	 S(   s)   
    Calculates weight from sequence
    s   Incomplete data for type '%s'i   (
   t   molecular_weightsR;   t   one_letter_codesRA   R    t   sumR.   R8   R<   t   condensation_weight_loss(   R   RÃ   t   averaget
   weight_fort   rescode(    (    s9   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/rsam.pyt   sequence_weightÂ  s    (%c         C   sL   t  d |  j ƒ  d t t | j | j ƒ ƒ d | j ƒ } t d | d | ƒ S(   NRi   RC   Rj   R   RÃ   (   Rm   Ry   R.   R8   R¿   R`  R„   Rf  (   R·   RÃ   R   (    (    s9   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/rsam.pyt   structure_weightÒ  s
    (+   t
   __future__R    t   phaserR   t   scitbx.array_familyR   R?   RŸ   t   collectionsR   RÛ   R{   R   R   t   objectR   RP   RU   R\   Ra   Rg   Rh   Rx   R�   R‰   RŠ   R�   R‘   R•   R˜   R™   Rm   Rš   R³   RÊ   RË   Rû   R   R%  RE  R\  Rf  Rg  (    (    (    s9   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/rsam.pyt   <module>   sN   		5	3					;	F		/						-)	n>NA#	