ó
ˆ™xTc           @   s’  d  d l  m Z d  d l m Z m Z d  d l m Z d  d l Z d  d l m Z m	 Z	 d  d l
 Z
 d  d l Z d  d l Z d Z e j j e ƒ Z d e f d „  ƒ  YZ d	 e f d
 „  ƒ  YZ d e f d „  ƒ  YZ d „  Z d „  Z d e f d „  ƒ  YZ d e f d „  ƒ  YZ d e f d „  ƒ  YZ d „  Z d d e d „ Z e j e j d d „ Z  d „  Z! d „  Z" d „  Z# e$ d k rŽe" ƒ  n  d S(   iÿÿÿÿ(   t   division(   t   Sorryt   Usage(   t
   smart_openN(   t   adopt_init_argst
   group_argss  
  file_name = None
    .type = path
    .multiple = True
    .optional = True
    .style = hidden
  use_hydrogens = True
    .type = bool
    .style = hidden
  include_helices = True
    .type = bool
    .style = hidden
  include_sheets = True
    .type = bool
    .style = hidden
t   structure_basec           B   s   e  Z d  „  Z d „  Z RS(   c         C   s   d  S(   N(   t   None(   t   self(    (    sK   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/secondary_structure.pyt
   as_pdb_str7   s    c         C   s
   |  j  ƒ  S(   N(   R	   (   R   (    (    sK   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/secondary_structure.pyt   __str__:   s    (   t   __name__t
   __module__R	   R
   (    (    (    sK   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/secondary_structure.pyR   3   s   		t
   annotationc           B   sY   e  Z d d d d  „ Z d „  Z e j ƒ  d „ Z d „  Z d „  Z	 e j ƒ  d „ Z
 RS(   c         C   sy   | d  k	 rK | d  k r$ | d  k s* t ‚ t | ƒ |  _ t | ƒ |  _ n* d  | | g k sc t ‚ | |  _ | |  _ d  S(   N(   R   t   AssertionErrort   parse_helix_recordst   helicest   parse_sheet_recordst   sheets(   R   t   recordsR   R   (    (    sK   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/secondary_structure.pyt   __init__O   s    	c         C   sa   g  } x$ |  j  D] } | j | j ƒ  ƒ q Wx$ |  j D] } | j | j ƒ  ƒ q7 Wd j | ƒ S(   Ns   
(   R   t   appendR	   R   t   join(   R   R   t   helixt   sheet(    (    sK   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/secondary_structure.pyR	   Y   s    c         C   sŠ   g  } | j  rS xA |  j D]3 } y | j | j ƒ  ƒ Wq t k
 rK } q Xq Wn  | j r† x' |  j D] } | j | j ƒ  ƒ qf Wn  | S(   N(   t   include_helicesR   t   extendt   as_atom_selectionst   RuntimeErrort   include_sheetsR   (   R   t   paramst
   selectionsR   t   eR   (    (    sK   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/secondary_structure.pyR   o   s    		c         C   s\   g  } x> |  j  D]3 } y | j | j ƒ  ƒ Wq t k
 rB } q Xq Wd d j | ƒ d S(   Nt   (s   ) or (t   )(   R   R   R   R   R   (   R   R   R   R    (    (    sK   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/secondary_structure.pyt   overall_helix_selection|   s    c         C   s\   g  } x> |  j  D]3 } y | j | j ƒ  ƒ Wq t k
 rB } q Xq Wd d j | ƒ d S(   NR!   s   ) or (R"   (   R   R   R   R   R   (   R   R   R   R    (    (    sK   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/secondary_structure.pyt   overall_sheet_selection…   s    c         C   s‡   |  j  | ƒ } g  } xk | D]c \ } } d | j | j | j | j f } d | j | j | j | j f } | j | | f ƒ q W| S(   Ns3   name %s and chain '%s' and resseq %d and icode '%s'(   t   extract_h_bondst   namet   chain_idt   resseqt   icodeR   (   R   R   t   bonded_atomsR   t   atom1t   atom2t   selection_1t   selection_2(    (    sK   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/secondary_structure.pyt   as_bond_selections�   s    N(   R   R   R   R   R	   t   ss_input_paramst   extractR   R#   R$   R/   (    (    (    sK   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/secondary_structure.pyR   N   s   
				
t	   pdb_helixc           B   s,   e  Z d  „  Z d „  Z d „  Z d „  Z RS(   c         C   sM   t  |  t ƒ  ƒ | d k s( t d ƒ ‚ | t d d ƒ k sI t d ƒ ‚ d  S(   Ni    s   Bad helix lengthi   i   s   Bad helix class(   R   t   localsR   t   range(   R   t   serialt   helix_idt   start_resnamet   start_chain_idt   start_resseqt   start_icodet   end_resnamet   end_chain_idt
   end_resseqt	   end_icodet   helix_classt   commentt   length(    (    sK   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/secondary_structure.pyR   œ   s    c         C   sh   d } | |  j  |  j |  j |  j |  j |  j |  j |  j |  j |  j	 |  j
 |  j |  j f } | j ƒ  S(   Ns5   HELIX  %3d %3s %3s%2s %4d%1s %3s%2s %4d%1s%2d%30s %5d(   R5   R6   R7   R8   R9   R:   R;   R<   R=   R>   R?   R@   RA   t   strip(   R   t   formatt   out(    (    sK   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/secondary_structure.pyR	   ®   s    c         C   sn   |  j  |  j k r5 t d d |  j  |  j f ƒ ‚ n  |  j |  j k rj t d d |  j |  j f ƒ ‚ n  d  S(   Ns2   Don't know how to deal with helices with multiple s    insertion codes ('%s' vs. '%s').s   chain IDs ('%s' vs. '%s').(   R:   R>   R   R8   R<   (   R   (    (    sK   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/secondary_structure.pyt   continuity_check¶   s    c         C   s3   |  j  ƒ  d |  j |  j |  j |  j f } | g S(   Ns*   chain '%s' and resseq %d:%d and icode '%s'(   RE   R8   R9   R=   R>   (   R   t   sele(    (    sK   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/secondary_structure.pyR   ¾   s    
	(   R   R   R   R	   RE   R   (    (    (    sK   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/secondary_structure.pyR2   ›   s
   				-c         C   s6   t  |  ƒ d k s t ‚ |  d k r( d S|  j ƒ  Sd  S(   Ni   s     t    (   t   lenR   RB   (   t   chars(    (    sK   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/secondary_structure.pyt   parse_chain_idí   s    c         C   s—  g  } xŠ|  D]‚} | j  d ƒ s( q n  y t j | d d !ƒ } Wn t k
 r[ d } n Xy t j | d d !ƒ } Wn t k
 rŒ q n XyÏ t d t j | d d	 !ƒ d
 | d d !j ƒ  d | d d !d t | d d !ƒ d t j | d d !ƒ d | d d | d d !d t | d d !ƒ d t j | d d !ƒ d | d d | d  | d d! !d" | ƒ } Wn# t k
 r�} t d# | ƒ ‚ n X| j | ƒ q W| S($   Nt   HELIXiG   iL   i    i&   i(   R5   i   i
   R6   i   i   R7   i   i   R8   i   R9   i   i   R:   R;   i   i   R<   i    R=   i!   i%   R>   R?   R@   iF   RA   s   Bad HELIX record:
%s(	   t
   startswitht   stringt   atoit
   ValueErrorR2   RB   RJ   R   R   (   R   R   t   lineRA   R?   t   current_helixR    (    (    sK   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/secondary_structure.pyR   ô   s>    


t
   pdb_strandc           B   s   e  Z d  „  Z d „  Z RS(   c         C   se   t  |  t ƒ  ƒ | d k r( | d k s. t ‚ | d k sF t d ƒ ‚ | |
 k ra t d ƒ ‚ n  d  S(   Ni    iÿÿÿÿi   s
   Bad sense.sY   Different insertion codes for the beginning and the end of beta strand are not supported.(   iÿÿÿÿi    i   (   R   R3   R   R   (   R   t   sheet_idt	   strand_idR7   R8   R9   R:   R;   R<   R=   R>   t   sense(    (    sK   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/secondary_structure.pyR     s    c         C   s    d |  j  |  j |  j |  j f S(   Ns*   chain '%s' and resseq %d:%d and icode '%s'(   R8   R9   R=   R:   (   R   (    (    sK   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/secondary_structure.pyR   +  s    (   R   R   R   R   (    (    (    sK   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/secondary_structure.pyRR     s   	t   pdb_strand_registerc           B   s   e  Z d  „  Z RS(   c         C   s   t  |  t ƒ  ƒ d  S(   N(   R   R3   (   R   t   cur_atomt   cur_resnamet   cur_chain_idt
   cur_resseqt	   cur_icodet	   prev_atomt   prev_resnamet   prev_chain_idt   prev_resseqt
   prev_icode(    (    sK   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/secondary_structure.pyR   1  s    (   R   R   R   (    (    (    sK   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/secondary_structure.pyRV   0  s   t	   pdb_sheetc           B   s5   e  Z d  „  Z d „  Z d „  Z d „  Z d „  Z RS(   c         C   s   t  |  t ƒ  ƒ d  S(   N(   R   R3   (   R   RS   t	   n_strandst   strandst   registrations(    (    sK   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/secondary_structure.pyR   ?  s    c         C   s   |  j  j | ƒ d  S(   N(   Rc   R   (   R   t   strand(    (    sK   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/secondary_structure.pyt
   add_strandF  s    c         C   s   |  j  j | ƒ d  S(   N(   Rd   R   (   R   t   registration(    (    sK   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/secondary_structure.pyt   add_registrationI  s    c         C   s1   g  } x$ |  j  D] } | j | j ƒ  ƒ q W| S(   N(   Rc   R   R   (   R   t   strand_selectionsRe   (    (    sK   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/secondary_structure.pyR   L  s    c         C   s1  t  |  j ƒ t  |  j ƒ k s$ t ‚ g  } x÷ t |  j |  j ƒ D]à \ } } d } d } | | j |  j |  j | j | j	 | j
 | j | j | j | j | j | j f } | d  k	 r| d 7} | | | j | j | j | j | j | j | j | j | j | j f
 7} n  | j | j ƒ  ƒ q@ Wd j | ƒ S(   Ns.   SHEET  %3d %3s%2d %3s%2s%4d%1s %3s%2s%4d%1s%2ds   %4s%3s%2s%4d%1s %4s%3s%2s%4d%1sRG   s   
(   RH   Rc   Rd   R   t   zipRT   RS   Rb   R7   R8   R9   R:   R;   R<   R=   R>   RU   R   RW   RX   RY   RZ   R[   R\   R]   R^   R_   R`   R   RB   R   (   R   t   linesRe   t   regt   format1t   format2RP   (    (    sK   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/secondary_structure.pyR	   «  s     $"
(   R   R   R   Rf   Rh   R   R	   (    (    (    sK   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/secondary_structure.pyRa   >  s
   				_c         C   sü  g  } d  } d  } xÇ|  D]¿} | j d ƒ s4 q n  d | } | d d !} t j | d d !ƒ } | | k r× | d  k	 r­ t | j ƒ t | j ƒ k s� t ‚ | j | ƒ n  t	 d | d | d g  d	 g  ƒ } | } n  y t j | d
 d !ƒ } Wn# t
 k
 r} t d | ƒ ‚ n Xt d | d t j | d d !ƒ d | d d !d t | d d !ƒ d t j | d d !ƒ d | d d | d d !d t | d d !ƒ d t j | d d !ƒ d | d d  | ƒ }	 | j |	 ƒ | d! k rë| j d  ƒ q | d" j ƒ  d# k r
d  }
 nÁ y§ t d$ | d" d% !d& | d% d' !d( t | d' d) !ƒ d* t j | d) d+ !ƒ d, | d+ d- | d. d/ !d0 | d/ d1 !d2 t | d1 d3 !ƒ d4 t j | d3 d5 !ƒ d6 | d5 ƒ 
}
 Wn t
 k
 rÊd  }
 n X| j |
 ƒ q W| d  k	 rø| j | ƒ n  | S(7   Nt   SHEETs   %-80si   i   i   RS   Rb   Rc   Rd   i&   i(   s*   Bad SHEET record:
%s
Cannot convert sense.RT   i   i
   R7   i   i   R8   i   R9   i   R:   R;   i   i   R<   i!   R=   i%   R>   RU   i    i)   t    RW   i-   RX   i0   RY   i2   RZ   i6   R[   R\   i8   i<   R]   i?   R^   iA   R_   iE   R`   (   R   RL   RM   RN   RH   Rc   Rd   R   R   Ra   RO   R   RR   RJ   Rf   Rh   RB   RV   (   R   R   t   current_sheett   current_sheet_idRP   RS   Rb   RU   R    t   current_strandRg   (    (    sK   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/secondary_structure.pyR   À  st    
$		

		

c         C   sÖ   |  d  k	 s | d  k	 s t ‚ |  d  k r˜ g  }  xe | D]Z } t j | ƒ j ƒ  } x< | D]4 } | j d ƒ s} | j d ƒ rY |  j | ƒ qY qY Wq7 Wn  t |  ƒ d k rÃ | r´ d  St d ƒ ‚ n  t	 d |  ƒ } | S(   NRK   Ro   i    s   No secondary structure found.R   (
   R   R   R   t   for_readingt	   readlinesRL   R   RH   R   R   (   R   t	   pdb_filest
   allow_nonet	   file_nameRk   RP   t   secondary_structure(    (    sK   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/secondary_structure.pyt   process_records   s    Rp   c         C   sÑ  d d  l  } t j j d | t f ƒ } g  } xþ |  D]ö } t j j | ƒ rÂ t j j | ƒ } t j j	 | ƒ \ }	 }
 |
 d k r£ | j
 t j j d | ƒ ƒ q+| j
 t j j d | ƒ ƒ q5 | j d ƒ râ | d	 d
 } n  y t j j | ƒ } Wn# t k
 r} | t | ƒ IJq5 X| j
 | ƒ q5 W| j d | ƒ } | j ƒ  } t | j ƒ d k rqt d ƒ ‚ n  t d | j ƒ } | d  k	 rÍ| j r«| | j ƒ  IJqÍ| j rÍ| | j | ƒ IJqÍn  | S(   Niÿÿÿÿs_   %s
  echo_pdb_records = False
    .type = bool
  echo_pymol_cmds = False
    .type = bool
  %s
s   .pdbs   .ents   .gzs   file_name="%s"Rx   s   --i   s   =Truet   sourcesi    s$   Please supply at least one PDB file.Rv   (   s   .pdbs   .ents   .gz(   t	   iotbx.pdbt   libtbxt   philt   parset   ss_input_params_strt   ost   patht   isfilet   abspatht   splitextR   RL   R   t   strt   fetchR1   RH   Rx   R   Rz   R   t   echo_pdb_recordsR	   t   echo_pymol_cmdst   as_pymol_dashes(   t   argsRD   t   logt   cmd_params_strt   iotbxt   master_philt	   user_philt   argRx   t   baset   extt   cmdline_philR    t   working_philR   Ry   (    (    sK   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/secondary_structure.pyt   run  s:    	 		c    	      C   s²  d d l  m }  d d l m } d d l m } d } | j ƒ  } | j | j | ƒ ƒ t	 j
 ƒ  } t d | ƒ } | j ƒ  } | j | | ƒ s˜ t ‚ | j d | ƒ } t | j ƒ  ƒ d k sÈ t ‚ t | _ | j d | ƒ } t | j ƒ  ƒ d	 k st ‚ t | _ t | _ | j d | ƒ } t | j ƒ  ƒ d
 k sCt ‚ | j ƒ  d d k s_t ‚ t | _ t | j d | ƒ ƒ d k sŒt ‚ | j d | ƒ d d k s®t ‚ d S(   s	    Disablediÿÿÿÿ(   t   file_reader(   t   flex(   t
   test_utilssÃ  HELIX    1   1 ALA A   16  THR A   18  5                                   3
HELIX    2   2 ASP A   37  GLY A   48  1                                  12
HELIX    3   3 SER A   57  GLY A   65  1                                   9
HELIX    4   4 ASN A  119  PHE A  133  1                                  15
HELIX    5   5 PRO A  134  ARG A  136  5                                   3
HELIX    6   6 GLY A  138  ALA A  152  1                                  15
HELIX    7   7 ASP A  165  VAL A  178  1                                  14
HELIX    8   8 ASP A  181  ARG A  191  1                                  11
HELIX    9   9 SER A  192  ASP A  194  5                                   3
HELIX   10  10 SER A  195  GLN A  209  1                                  15
HELIX   11  11 ALA A  216  ALA A  225  1                                  10
HELIX   12  12 SER A  228  GLY A  233  1                                   6
HELIX   13  13 ARG A  235  GLY A  251  1                                  17
HELIX   14  14 SER A  252  ALA A  260  1                                   9
HELIX   15  15 SER A  263  LEU A  275  1                                  13
SHEET    1   A 5 ARG A  13  ASP A  14  0
SHEET    2   A 5 LEU A  27  SER A  30 -1  O  ARG A  29   N  ARG A  13
SHEET    3   A 5 VAL A 156  HIS A 159  1  O  VAL A 156   N  PHE A  28
SHEET    4   A 5 ASP A  51  ASP A  54  1  N  ALA A  51   O  LEU A 157
SHEET    5   A 5 ASP A  74  LEU A  77  1  O  HIS A  74   N  VAL A  52R   R   im   i   ib   i    sK   dist (chain 'A' and resi 41 and name H), (chain 'A' and resi 37 and name O)i   s(   chain 'A' and resseq 16:18 and icode ' 'N(   RŽ   R—   t   scitbx.array_familyR˜   R}   R™   t
   std_stringR   t   split_linesR0   R1   R   R	   t	   show_diffR   RŠ   RH   t
   splitlinest   FalseR   t   TrueR   R   (	   R—   R˜   R™   t   ptpb_1ywf_recordsRk   R   t   sst   ss_outt   pml_out(    (    sK   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/secondary_structure.pyt   exercise_hbonds9  s2    				$c          C   s…   d d l  m }  d d l m } d } |  j ƒ  } | j |  j | ƒ ƒ t d | ƒ } | j ƒ  } | j	 | | ƒ s| t
 ‚ d GHd  S(   Niÿÿÿÿ(   R˜   (   R™   s´  HELIX    1   1 THRA1   11  ASPA1   39  1                                  29
HELIX    2   2 GLUA1   46  ARGA1   73  1                                  28
HELIX    3   3 THRA1   93  ALAA1  120  1                                  28
HELIX    4   4 PROA1  124  HISA1  133  1                                  10
HELIX    5   5 LEUA1  135  ARGA1  154  1                                  20
HELIX    6   6 THRa1   11  TYRa1   37  1                                  27
HELIX    7   7 GLUa1   46  GLNa1   72  1                                  27
HELIX    8   8 THRa1   93  ALAa1  120  1                                  28
HELIX    9   9 PROa1  124  HISa1  133  1                                  10R   t   OK(   Rš   R˜   R}   R™   R›   R   Rœ   R   R	   R�   R   (   R˜   R™   t   two_char_chain_recordsRk   R¢   R£   (    (    sK   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/secondary_structure.pyt   exercise_singleq  s    
c          C   s{   d d l  m }  |  j t d d ƒ} | j j ƒ  } | j j ƒ  } | j ƒ  } d j | ƒ } t	 j
 | | ƒ sw t ‚ d  S(   Niÿÿÿÿ(   R—   t
   force_typet   pdbs   
(   RŽ   R—   t   any_fileRx   t   file_objectt   secondary_structure_sectiont   extract_secondary_structureR	   R   R™   R�   R   (   R—   t   pdb_int   old_sst	   structuret   new_ss(    (    sK   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/secondary_structure.pyt   tst_pdb_file…  s    t   __main__(%   t
   __future__R    t   libtbx.utilsR   R   R}   R   t   libtbx.philR   R   RM   t   sysR�   R€   R~   R   R0   t   objectR   R   R2   RJ   R   RR   RV   Ra   R   R   R    Rz   t   stdoutt   stderrR–   R¥   R¨   R³   R   (    (    (    sK   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/secondary_structure.pyt   <module>   s.   $MR		"‚	@(	8			