ó
šxTc        -   @   s3  d  Z  d d l Z d d l Z d e f d „  ƒ  YZ d d d d d	 d
 d d d d d d d d d d d d d d g Z d d d d d d d d d  d! d" d# d$ d% d& d$ d' d# d( d g d d) d* d+ d, d- d- d. d/ d0 d1 d2 d3 d/ d2 d4 d5 d! d6 d g d d* d7 d8 d9 d: d; d< d= d> d? d@ dA dB dC d d dD dE d, g d d+ d8 dF d/ d# d; d d d- dD dG dH dI d" d4 d% dJ dK d, g d d, d9 d/ dL dM dJ dN d+ d d# d dO dP dQ dR dS d  dT dU g d d- d: d# dM dV dD d? dW dX d3 d d d  d? d$ d4 d dK d1 g d d- d; d; dJ dD dY d< d4 dD dD dB dZ d[ dB d\ dC d5 d3 d g d d. d< d dN d? d< d] d! d^ d_ dJ d d d d d= d` d* da g d  d/ d= d d+ dW d4 d! db dc dT dN d" d; d8 dZ d4 d< d dd g d! d0 d> d- d dX dD d^ dc de d` dc df dJ dg d3 dW dh dJ da g d" d1 d? dD d# d3 dD d_ dT d` di dW dD dA d% dj dH d dk d< g d# d2 d@ dG d d dB dJ dN dc dW dl d dm d4 d; dT dW dk dD g d$ d3 dA dH dO d dZ d d" df dD d de d# dZ dn d d  d9 do g d% d/ dB dI dP d  d[ d d; dJ dA dm d# dp d d d\ d! dM d> g d& d2 dC d" dQ d? dB d d8 dg d% d4 dZ d dq dr da df d_ dk g d$ d4 d d4 dR d$ d\ d dZ d3 dj d; dn d dr dB d dA df d3 g d' d5 d d% dS d4 dC d= d4 dW dH dT d d\ da d ds d d1 dt g d# d! dD dJ d  d d5 d` d< dh d dW d  d! df dA d du dv df g d( d6 dE dK dT dK d3 d* d dJ dk dk d9 dM d_ df d1 dv dw dZ g d d d, d, dU d1 d da dd da d< dD do d> dk d3 dt df dZ dx g g Z dy dZ d dZ d dr d4 dZ d d dZ d d d d dZ d= d4 d4 dr d dZ d g dZ dy dr dy d= d% d d4 d% d4 d% dr dT dZ d4 d d4 d4 d% d d dr d# g d dr d d% dr dZ dr dr dZ dr dZ dZ dZ d% dr d% d d d d dZ dr dr g dZ dy d% dm d# d d d d% d d% d% d# d d4 dZ d4 d d% d d dr d= g d d= dr d# d: dr dr d4 d% d= dr dZ d4 d d# d4 d d dr dr d dZ dy g dr d% dZ d dr dm d% d d4 d% d= d4 d% d% d% dr dr dZ d d= dZ dT d% g d4 d dr d dr d% dm dZ d% dZ d% dr d4 dZ dZ dr d4 dZ d% dr dZ dr dZ g dZ d4 dr d d4 d dZ dN d% d4 dr d d= dZ d= d4 d dZ d% dr d d# d4 g d d% dZ d% d% d4 d% d% dy dr d# d# dr dr dr d% dr d dT dr d d dr g d d4 dr d d= d% dZ d4 dr d: dr dZ d4 d d# d d4 d dr dr d dZ d= g dZ d% dZ d% dr d= d% dr d# dr dy d d% d% dZ dr dr d d= dZ d d dr g d dr dZ d% dZ d4 dr d d# dZ d d; dZ dr d4 dZ dZ d d= d d d4 d g d dT dZ d# d4 d% d4 d= dr d4 d% dZ d; dZ d4 d d= d4 dr d% d dZ d4 g d dZ d% d d d% dZ dZ dr d d% dr dZ dN d dr d d dr d% dZ dr d g d d4 dr d4 d# d% dZ d= dr d# dZ d4 d4 d d; d= d4 d dr d d d dT g dZ d d% dZ d4 dr dr d4 d% d dr dZ d dr d= d; d d dr dr d d d4 g d= d4 d d4 d dr d4 d dr d4 dr dZ d= d d4 d dy d# dZ d% d dZ d4 g d4 d4 d d d dZ dZ dZ d d d d d4 d d d d# dy d4 dr d4 dZ d g d4 d% d d% dr d d% d% dT dr d= d= dr dr dr dr dZ d4 dy dr d d dr g dr d d d dr d= dr dr dr dr dZ d d% d% d dr d% dr dr dz dr d# dZ g d d dZ d d dZ dZ d d d d d d dZ d d d d4 d dr d d d g dZ dr dr dr dZ dT dr d# d dZ d d4 dZ dr d d dZ dZ d d# d dm dZ g d d# dr d= dy d% dZ d4 dr d= dr d d4 d dT d4 d4 d dr dZ d dZ dy g g Z dT d4 dZ d dZ d4 dZ d d d d dZ d d d d= d4 d4 dr dZ g d4 dn dr d% dZ dr dr d dr d d dr dr dr dr d d d dZ dZ g dZ dr d: d# dr d d dr d d% dr d= d d4 dZ d4 d dr d% dr g d d% d# dy dr dZ d4 dr d= dr dZ d4 d d# d4 d4 d dZ dr dZ g dZ dZ dr dr d: dr d d4 dr d4 d4 dr d% dr dr dZ dZ d d= d g d4 dr d dZ dr d: dZ d% dZ d% dr d4 dZ dZ dZ d4 dZ dr dZ dr g dZ dr d d4 d dZ dm dr d dr dZ d= dZ d4 d4 d dZ dr dZ d# g d d dr dr d4 d% dr dT dr d# d= dr dr dr dr dZ d d dr d g d dr d d= dr dZ d dr dy dZ d d4 d d= d# d4 d dZ dr dZ g d d d% dr d4 d% dr d# dZ dT d# dr dr dZ dZ dZ d d= dZ d g d d dr dZ d4 dr dZ d= d d# dy dZ dZ d4 d d d d= d d g dZ dr d= d4 dr d4 d= dr d4 dr dZ d: dZ d4 d4 d= d4 dr d% dZ g d dr d d d% dZ dZ dr d dr dZ dZ d; d dZ d d dZ d% dr g d dr d4 d# dr dZ d4 dr d= dZ d4 d4 d dy d= d4 d dZ dZ d g d dr dZ d4 dr dZ d4 dr d# dZ d d4 dZ d= dy d d dr dr dZ g d= d d4 d4 dZ d4 d dZ d4 dZ d d= d d4 d dT d= dZ dr dZ g d4 d d d dZ dZ dZ d d d d d4 d d d d= dy d4 dZ dZ g d4 d dr dZ d dr dr d dZ d= d= dr dZ dZ dr dZ d4 dT dr d g dr dZ d% dr d= dZ dZ dr dr dZ d d% d% dZ dr dr dZ dr d$ d# g dZ dZ dr dZ d dr d# d dZ d d dZ dr d dZ dZ dZ d d# d; g g Z g  e D]+ Z	 g  e D] Z
 e e
 e	 k ƒ ^ qì^ qßZ e d{ d| d} e d~ e d d ƒ Z e d{ d€ d} e d~ e d d� ƒ Z e d{ d‚ d} d dƒ d d d d	 d
 d d d d d d d d d d d d d d„ d d… g d~ e d dA ƒ Z e d{ d† d} e d~ e d d\ ƒ Z d‡ e f dˆ „  ƒ  YZ e d‰ e e e e g ƒ Z e d‰ g  ƒ Z dŠ e f d‹ „  ƒ  YZ d S(Œ   s-   
Scoring matrices taken from mmtbx.alignment
iÿÿÿÿNt   ScoringMatrixc           B   s;   e  Z d  Z d „  Z d „  Z d „  Z d „  Z d „  Z RS(   s(   
    Data used for sequence scoring
    c         C   s(   | |  _  | |  _ | |  _ | |  _ d  S(   N(   t   namet   indexert   scorest   gap_penalty(   t   selfR   R   R   R   (    (    sI   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/residue_substitution.pyt   __init__   s    			c         C   s3   |  j  j | ƒ } |  j  j | ƒ } |  j | | S(   N(   R   t   indexR   (   R   t   leftt   rightt
   index_leftt   index_right(    (    sI   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/residue_substitution.pyt	   score_for   s    c         C   sR   | | k s | | k r |  j  Sy |  j d | d | ƒ SWn t k
 rM | SXd  S(   NR   R	   (   R   R   t
   ValueError(   R   R   R	   t   gapt   unknown(    (    sI   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/residue_substitution.pyt   score_or_unknown_for   s    c         C   s�   t  |  j ƒ } d | } | t g  t | ƒ D] } |  j | | ^ q, ƒ } | d t t t j |  j g  ƒ ƒ } | | | f S(   Ng      ð?i   (   t   lenR   t   sumt   rangeR   t   reducet   operatort   add(   R   t   countt   normt   nt   perfectt   random(    (    sI   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/residue_substitution.pyt   normalization(   s
    
4&c         C   s   d |  j  S(   Ns   %s scoring matrix(   R   (   R   (    (    sI   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/residue_substitution.pyt   __str__1   s    (   t   __name__t
   __module__t   __doc__R   R   R   R   R   (    (    (    sI   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/residue_substitution.pyR       s   					t   At   Ct   Dt   Et   Ft   Gt   Ht   It   Kt   Lt   Mt   Nt   Pt   Qt   Rt   St   Tt   Vt   Wt   Yi   iìÿÿÿi   iÝÿÿÿi   iòÿÿÿiûÿÿÿiôÿÿÿiíÿÿÿiõÿÿÿi   i   iüÿÿÿiñÿÿÿi   iÆÿÿÿiw   iÍÿÿÿiËÿÿÿiÕÿÿÿiÞÿÿÿiéÿÿÿiÊÿÿÿiÄÿÿÿiÌÿÿÿiÜÿÿÿiäÿÿÿi    iêÿÿÿi²ÿÿÿi'   i"   iÈÿÿÿi   i   ièÿÿÿi   iØÿÿÿiæÿÿÿi   iöÿÿÿi   ióÿÿÿiëÿÿÿi¼ÿÿÿi&   i   iúÿÿÿi   iîÿÿÿiºÿÿÿi[   iÐÿÿÿi
   iÒÿÿÿiÑÿÿÿiÓÿÿÿiàÿÿÿiáÿÿÿi   iF   i0   iïÿÿÿi×ÿÿÿiA   iþÿÿÿi   iøÿÿÿi-   i   i   i%   i÷ÿÿÿi/   iãÿÿÿiÔÿÿÿi;   içÿÿÿiâÿÿÿi   i@   iðÿÿÿiÖÿÿÿi   i   i	   iÏÿÿÿi(   i=   iýÿÿÿi   iåÿÿÿi+   iÂÿÿÿi­   ie   i   i   R   t   identityR   R   R   t   dayhoffi°ÿÿÿt   blosum50t   Bt   Xt   Zt   blosum62t   SubstitutionSuitec           B   s)   e  Z d  Z d „  Z d „  Z d „  Z RS(   sS   
    An object to group matrices together that are applicable to the same mmt 
    c         C   s/   t  g  | D] } | j | f ^ q
 ƒ |  _ d  S(   N(   t   dictR   t   _matrix_for(   R   t   matricest   m(    (    sI   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/residue_substitution.pyR   ½   s    c         C   s   |  j  j ƒ  S(   N(   R>   t   keys(   R   (    (    sI   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/residue_substitution.pyt   namesÂ   s    c         C   s   |  j  | S(   N(   R>   (   R   R   (    (    sI   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/residue_substitution.pyt
   matrix_forÇ   s    (   R   R   R    R   RB   RC   (    (    (    sI   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/residue_substitution.pyR<   ¸   s   		R?   t   SequenceSimilarityc           B   s5   e  Z d  Z d „  Z e d „  ƒ Z e d „  ƒ Z RS(   s(   
    Calculates sequence similarity
    c         C   s£   | j  ƒ  d k rY g  | j d D]- } | j d | d | d | j d | ƒ ^ q  |  _ nF g  t | j Œ  D]- } |  j d | d | d | j d | ƒ ^ qi |  _ d  S(	   Ni   i    R   R	   R   R   t   rescodest   matrix(   t   multiplicityt
   alignmentsR   R   t   valuest   zipt   similarity_score(   R   t	   alignmentRF   R   t   ct   equiv(    (    sI   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/residue_substitution.pyR   Ø   s
    Dc         C   s\   | | j  j ƒ  k r. t d | | j f ‚ n  | j  j d | ƒ } |  d | d | d | ƒ S(   Ns   Unknown matrix: %s for %sR   RL   RF   R   (   t   similarity_matrix_suiteRB   t   RuntimeErrorR   RC   (   t   clst   mmtRL   RF   R   R@   (    (    sI   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/residue_substitution.pyt   from_mmt_and_alignmentð   s    c         C   sq   d t  |  ƒ k s t ‚ t g  t t j t |  ƒ d ƒ ƒ D]0 \ } } | j d | d | d | d | ƒ ^ q: ƒ S(   Ni   R   R	   R   R   (   R   t   AssertionErrort   mint   sett	   itertoolst   combinationst   sortedR   (   RE   RF   R   R   t   lt   r(    (    sI   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/residue_substitution.pyRK   ú   s    (   R   R   R    R   t   classmethodRS   t   staticmethodRK   (    (    (    sI   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/residue_substitution.pyRD   Ó   s   	
(   R    R   RW   t   objectR    t   amino_acid_codest   dayhoff_mdm78_similarity_scorest   blosum50_similarity_scorest   blosum62_similarity_scorest   jt   it   intt   identity_similarity_scoresR5   R6   R7   R;   R<   t   proteinR   RD   (    (    (    sI   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/phaser/residue_substitution.pyt   <module>   sâ   /	???????????????????EHHHHHHHHHHHHHHHHHHHHHHN???????????????????E8		$'		