ó
×™xTc           @   sI  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 m	 Z	 d  d l m
 Z
 d  d l m Z d  d l Z e j j d ƒ Z e j j d d	 e ƒZ d
 „  Z d e f d „  ƒ  YZ d „  Z d e f d „  ƒ  YZ d e f d „  ƒ  YZ d „  Z d d d d d „ Z d „  Z e d k rEe e j  d ƒ n  d S(   iÿÿÿÿ(   t   divisionN(   t   cablam_validate(   t   pdb(   t   file_reader(   t
   group_argst   mmtbx_cablam_align_utils_extsl  
cablam_align {
  pdb_infile_1 = None
    .type = path
    .help = '''input PDB file'''
  pdb_infile_2 = None
    .type = path
    .help = '''input PDB file'''
  chain_1 = None
    .type = str
    .help = '''chain for pdb_infile_1'''
  chain_2 = None
    .type = str
    .help = '''chain for pdb_infile_2'''
  help = False
    .type = bool
    .help = '''help and data interpretation messages'''
  threshold = 10
    .type = float
    .help = '''keeps all regions who have diff list averages lower than this'''
  window_size = 10
    .type = int
    .help = '''the size of the regions when looking for similarities'''
}
t   process_includesc           C   s   t  j j d ƒ d  S(   Nsÿ   
--------------------------------------------------------------------------------
python cablam_align.py 1234.pdb abcd.pdb

The user must provide TWO and only TWO pdb files.
--------------------------------------------------------------------------------
(   t   syst   stderrt   write(    (    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/cablam/cablam_align.pyt   usage1   s    	t   cablam_residuesc           B   s#   e  Z d  „  Z d d d d „ Z RS(   c         C   s”   g  } g  |  j  j ƒ  D]! \ } } | j d  k r | ^ q } xP | D]H } | } g  } x& | d  k r~ | j | ƒ | j } qY W| j | ƒ qD W| S(   N(   R   t   itemst   prevrest   Nonet   appendt   nextres(   t   selft   segmentst   kt   vt
   n_residuest   rest   cur_rest   segment(    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/cablam/cablam_align.pyt   get_continuous_segments@   s    7c         C   sí   | d  k s | d  k s t ‚ | d  k rO | d  k rO d } t j j | ƒ n  | d  k ry t j | ƒ } | j ƒ  } n  | d  k s‹ t ‚ | d  k r³ t j	 j
 | ƒ d  |  _ n	 | |  _ t j d | d |  j ƒ |  _ |  j ƒ  |  _ d  S(   NsD   WARNING: pdb_infile AND hierarchy detected; hierarchy will be used.
iüÿÿÿt	   hierarchyt   pdbid(   R   t   AssertionErrorR   R   R	   R   t   inputt   construct_hierarchyt   ost   patht   basenameR   R   t   setupR   R   R   (   R   t
   pdb_infileR   R   t   wt   pdb_io(    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/cablam/cablam_align.pyt   __init__N   s     	N(   t   __name__t
   __module__R   R   R&   (    (    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/cablam/cablam_align.pyR   <   s   	c           C   s%   t  j j d ƒ t ƒ  t  j ƒ  d  S(   Ns,   You must provide TWO and only TWO pdb files
(   R   R   R	   R
   t   exit(    (    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/cablam/cablam_align.pyt   not_enough_pdbsf   s    t   FindSimilarCablamRegionsc           B   s)   e  Z e d d  „ Z d „  Z d „  Z RS(   c         C   s;   | |  _  | |  _ | |  _ | |  _ | |  _ |  j ƒ  d  S(   N(   t
   residues_1t
   residues_2t   window_sizet
   in_and_outt	   thresholdt   simple_align_measures(   R   R,   R-   R.   R/   R0   (    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/cablam/cablam_align.pyR&      s    					c         C   s‚   g  } xu | D]m } t  | j ƒ d k r; | j d  ƒ q n  |  j rf | j | j d | j d ƒ q | j | j d ƒ q W| S(   Ni    t   CA_d_outt   CA_d_in(   t   lent   measuresR   R   R/   (   R   R   R5   t   r(    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/cablam/cablam_align.pyt   get_measures�   s    	"c      	   C   s¥  g  } d } g  |  _  x‰|  j j D]{} |  j | ƒ } xc|  j j D]U} |  j | ƒ } t j | | |  j |  j ƒ } x| D]} g  t	 | j
 | j
 | j ƒ D] } | ^ q¡ }	 g  t	 | j | j | j ƒ D] } | ^ qÐ }
 g  } x= t	 t |	 ƒ ƒ D]) } | j | |	 | | |
 | f ƒ qû W|  j d k r\|  j  j t d | d | j ƒ ƒ q~ | j | k  r~ | j } t d | d | j ƒ g |  _  q~ q~ WqD Wq" Wd  S(   Niˆ  i    t   aligned_residuest   mean(   t   simple_aligned_regionsR,   R   R7   R-   t   cpputilst   get_similar_regionsR0   R.   t   ranget   i_1t   window_lengtht   i_2R4   R   R   R9   (   R   t   similar_regionst   smallest_meant   seg_1t
   measures_1t   seg_2t
   measures_2t   srt   it   is_1t   is_2t   ar(    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/cablam/cablam_align.pyR1   ž   s0    		//'	N(   R'   R(   t   FalseR   R&   R7   R1   (    (    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/cablam/cablam_align.pyR+   }   s   	t   AlignCablamMeasuresc           B   s5   e  Z d  „  Z d „  Z d „  Z d „  Z d „  Z RS(   c   	      C   st   t  d | d | ƒ } t  d | d | ƒ } t d | d | d | d t d | ƒ |  _ | |  _ | |  _ |  j ƒ  d  S(   NR   R   R,   R-   R.   R/   R0   (   R   R+   RL   t   simple_similar_region_objt   hierarchy_1t   hierarchy_2t   condense_simple_aligned_regions(	   R   RO   RP   t
   pdb_name_1t
   pdb_name_2R.   R0   R,   R-   (    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/cablam/cablam_align.pyR&   Ë   s    		c      	   C   sª   x£ t  |  j j ƒ D]� \ } } | d | IJ| d | j t | j d d j | j d d j ƒ f IJx5 | j D]* } | | d j ƒ  I| d j ƒ  IJqt Wq Wd  S(   Ns   similar fragment %is   mean : %.03f, diff : %ii    i   (   t	   enumerateRN   R:   R9   t   absR8   t   resnumt	   id_to_str(   R   t   logRH   RK   t   t(    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/cablam/cablam_align.pyt   print_simple_similar_regionsé   s
    =c   
      C   s�  g  |  _  |  j j } | d } d } t t } } d  } xN| d  k rX | | j } n  | d 7} | t | ƒ k rš | |  j  k r– |  j  j | ƒ n  Pn  | | j } | d | k rV| |  j  k rÚ |  j  j | ƒ n  d  } x[ |  j  D]P } | d | k rê x- | D]% }	 |	 | k rqq| j |	 ƒ qW| } Pqê qê W| d  k r†| } q†q; x- | D]% }	 |	 | k ruq]q]| j |	 ƒ q]Wq; d  S(   Ni    i   (   t   aligned_regionsRN   R:   RL   R   R8   R4   R   (
   R   t   sart   current_regionRH   t	   break_onet	   break_twot
   new_regiont   next_regiont   regiont   pair(    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/cablam/cablam_align.pyRQ   ò   sB    	
 
   c         C   s7   x0 t  |  j ƒ D] \ } } |  j | | | ƒ q Wd  S(   N(   RT   R[   t   print_region(   R   RX   RH   Rb   (    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/cablam/cablam_align.pyt   print_aligned_regions  s    c         C   sƒ   | d d IJ| d | IJ| d t  | d d j | d d j ƒ IJx2 | D]* } | | d j ƒ  I| d j ƒ  IJqQ Wd  S(   Nt   *iM   s   **** %ss	   diff : %ii    i   (   RU   RV   RW   (   R   Rb   t   titleRX   RY   (    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/cablam/cablam_align.pyRd      s
    .(   R'   R(   R&   RZ   RQ   Re   Rd   (    (    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/cablam/cablam_align.pyRM   È   s
   				(	c         C   s5   d | j  ƒ  } |  j ƒ  j d | ƒ } |  j | ƒ S(   Ns   chain %st   string(   t   uppert   atom_selection_cachet	   selectiont   select(   R   t   chaint   st   sel(    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/cablam/cablam_align.pyt   get_chain_selection+  s    c         C   sç   | d  k r% t j j |  ƒ d  } n  | d  k rJ t j j | ƒ d  } n  t j |  ƒ } | j ƒ  }	 t j | ƒ } | j ƒ  }
 | d  k rž t |	 | ƒ }	 n  | d  k r¼ t |
 | ƒ }
 n  t d |	 d |
 d | d | d | d | ƒ S(   NiüÿÿÿRO   RP   RR   RS   R.   R0   (	   R   R   R    R!   R   R   R   Rp   RM   (   t   pdb_1t   pdb_2R.   R0   t   chain_1t   chain_2RR   RS   R%   RO   RP   (    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/cablam/cablam_align.pyt   cablam_align_wrapper3  s$        c         C   s¼  t  j j j d t ƒ } g  } g  } x’ |  D]Š } t j j | ƒ r– t j	 | ƒ } | j
 d k rq | j | ƒ qµ | j
 d k rµ | j | j ƒ qµ q+ | j d | ƒ } | j | ƒ q+ Wt j d | ƒ } | j ƒ  } | j }	 | j j d  k rC| j j d  k rCt | ƒ d k r t ƒ  qC| d | j _ | d | j _ n  | j }	 |	 j rit ƒ  t j ƒ  n  t d	 |	 j d
 |	 j d |	 j d |	 j d |	 j d |	 j ƒ }
 |
 j t j  ƒ d  S(   Nt   master_philR   t   philt   argt   sourcesi   i    i   Rq   Rr   R.   R0   Rs   Rt   (!   t   libtbxRw   t   command_linet   argument_interpreterRv   R   R    t   isfileR   t   any_filet	   file_typeR   t   file_objectt   processt   fetcht   extractt   cablam_alignt   pdb_infile_1R   t   pdb_infile_2R4   R*   t   helpR
   R   R)   Ru   R.   R0   Rs   Rt   Re   t   stdout(   t   argst   interpreterRy   t   pdbsRx   t
   input_filet   arg_philt	   work_philt   work_paramst   paramst   acm(    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/cablam/cablam_align.pyt   runN  s>    	$ 
						t   __main__i   (!   t
   __future__R    R   R   t   mmtbx.cablamR   t   libtbx.phil.command_lineRz   t   iotbxR   R   R   t   boost.pythont   boostt   pythont
   import_extR;   Rw   t   parset   TrueRv   R
   t   objectR   R*   R+   RM   Rp   R   Ru   R’   R'   t   argv(    (    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/cablam/cablam_align.pyt   <module>   s*   		*	Kc			/