ó
‹™xTc           @   s$  d  Z  d d l m Z d d l m Z d d l m Z d d l m Z d d l m	 Z	 d d l
 m Z d d l Z
 d d	 l m Z d d
 l m Z m Z d d l m Z d „  Z d e d „ Z d „  Z d e j f d „  ƒ  YZ d „  Z d e f d „  ƒ  YZ d e f d „  ƒ  YZ d „  Z d S(   s}   
Tools for creating atom selection arrays (flex.bool or flex.size_t) based on
a simple keyword syntax and boolean operators.
iÿÿÿÿ(   t   division(   t   simple_parser(   t   wildcard(   t   crystal(   t   flex(   t   stlN(   t	   tokenizer(   t   Sorryt   format_exception(   t   slots_getstate_setstatec         C   s„   t  } t  } x] |  D]U } xL | D]D } | d k rE | r< d St } q  | d k r  | r[ d St } q  q  Wq W| rv d S| r€ d Sd S(   Nt   ABCDEFGHIJKLMNOPQRSTUVWXYZi    t   abcdefghijklmnopqrstuvwxyzi   iÿÿÿÿ(   t   Falset   True(   t   stringst
   have_uppert
   have_lowert   st   c(    (    sF   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/atom_selection.pyt   _character_case_id   s"     	   s   \c            s  t  ‰ t ˆ t ƒ sc ˆ j d  k r- t ‰ n  ˆ j ‰ ˆ sK ˆ j ƒ  ‰ n  ˆ rc ˆ j ƒ  ‰ qc n  g  ‰ ‡  ‡ ‡ ‡ ‡ ‡ f d †  } | ƒ  t	 ˆ ƒ d k rˆ rˆ rt
 d ˆ g ƒ d k rt
 d ˆ  j ƒ  ƒ } | d k r| d k rˆ j ƒ  ‰ n ˆ j ƒ  ‰ | ƒ  qn  ˆ S(   Nc             sy   xr ˆ  j  ƒ  D]d \ }  } ˆ s. |  j ƒ  }  n  ˆ rC |  j ƒ  }  n  t j d |  d ˆ d ˆ ƒ r ˆ j | ƒ q q Wd  S(   Nt   stringt   patternt   escape_char(   t   itemst   stript   upperR   t   is_matcht   append(   t   keyt   value(   t   mapR   t   pattern_was_quotedt   resultt    unconditionally_case_insensitivet   wildcard_escape_char(    sF   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/atom_selection.pyt   match.   s      		i    R   (   R   t
   isinstancet   strt   quote_tokent   NoneR   R   R   R   t   lenR   t   keyst   lower(   R   R   R"   R!   R#   t   keys_case_id(    (   R   R   R   R    R!   R"   sF   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/atom_selection.pyt   _get_map_string!   s.    		  	c         C   sD  d d l  m } d  } d  } | d  k	 rR | j d ƒ t | ƒ k rR | | ƒ } n  | d  k	 rˆ | j d ƒ t | ƒ k rˆ | | ƒ } n  | d  k	 rÈ | d  k	 rÈ | | k rÈ t d |  | | f ƒ ‚ n  g  } xo | j ƒ  D]a \ } }	 | | ƒ }
 | d  k	 r|
 | k  rqÛ n  | d  k	 r/|
 | k r/qÛ n  | j |	 ƒ qÛ W| S(   Niÿÿÿÿ(   t   utils_base_256_ordinalt    s-   range with first index > last index: %s %s:%s(   t	   iotbx.pdbR-   R'   t   countR(   t   RuntimeErrorR   R   (   t   sel_keywordR   t   startt   stopt   ot   o_startt   o_stopR    R   t
   iselectiont   os(    (    sF   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/atom_selection.pyt   _get_serial_rangeE   s,    ''  t   selection_tokenizerc           B   s   e  Z d d  „ Z d „  Z RS(   c         C   sK   | d  k r t j d } n  t j j |  d | d t j d | ƒ g ƒd  S(   Ns
   \*?[]^+-.:t   input_stringt   list_of_settingst   contiguous_word_characters(   R'   R   t"   default_contiguous_word_characterst   word_iteratort   __init__t   settings(   t   selfR   R>   (    (    sF   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/atom_selection.pyRA   ]   s    
	c         C   s/   |  j  ƒ  } | d  k r+ t d | ƒ ‚ n  | S(   Ns   Missing argument for %s.(   t   try_popR'   R1   (   RC   t   keywordt   word(    (    sF   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/atom_selection.pyt   pop_argumentg   s     N(   t   __name__t
   __module__R'   RA   RG   (    (    (    sF   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/atom_selection.pyR;   [   s   
c         C   s.   t  |  ƒ d k  r* |  d d k r* |  d S|  S(   Ni   iÿÿÿÿt
   0123456789R.   (   R(   (   R   (    (    sF   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/atom_selection.pyt   resid_shiftl   s    " t   AtomSelectionErrorc           B   s   e  Z e Z d  Z RS(   t
   exceptions(   RH   RI   t   __orig_module__(    (    (    sF   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/atom_selection.pyRL   p   s   t   cachec           B   sx  e  Z d  Z d d d d d d d d d	 d
 d d d d d d d d d d d d g Z d dN 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 d0 „  Z d1 „  Z d2 „  Z d3 „  Z  d4 „  Z! d5 „  Z" d6 „  Z# d7 „  Z$ d8 „  Z% d9 „  Z& d: „  Z' d; „  Z( d< „  Z) d= „  Z* d> „  Z+ d? „  Z, d@ „  Z- dA „  Z. dB „  Z/ dC „  Z0 dD „  Z1 dE „  Z2 dF „  Z3 dG „  Z4 dN dH „ Z5 e6 dN dN e7 dI „ Z8 e6 dN dN dJ „ Z9 e6 dN dK „ Z: dN dN dN dN dN dN dN dN dL „ Z; dM „  Z< RS(O   s’  
  Manager for interpreting atom selection strings, with caching of partial
  selections.  This has some limited understanding of chemical identities via
  keywords like pepnames, water, or single_atom_residue, but more advanced
  selections require the use of a callback.  In practice this would usually
  involve wrapping the cache in another object, for example the class
  build_all_chain_proxies in mmtbx.monomer_library.pdb_interpretation.

  Because the selections available here are used in some situations where setup
  speed is important, the "within" keyword may optionally be supported if the
  special_position_settings attribute is not None.
  t   rootR"   t   n_seqt   namet   altloct   resnamet   chain_idt   resseqt   icodet   residt
   resid_listt   chain_break_listt   segidt   model_idt   elementt   charget   anisout   pepnamest   single_atom_residuet   watert   heterot   special_position_settingss   \c         C   sP   | |  _  | |  _ | j |  ƒ d  |  _ d  |  _ d  |  _ d  |  _ | |  _ d  S(   N(	   RP   R"   t   get_atom_selection_cacheR'   R`   Ra   Rb   Rc   Rd   (   RC   RP   R"   Rd   (    (    sF   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/atom_selection.pyRA   š   s    						c         C   s   t  d |  j d | d |  j ƒ S(   NR   R   R"   (   R,   RR   R"   (   RC   R   (    (    sF   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/atom_selection.pyt   get_name¥   s    	c         C   s   t  d |  j d | d |  j ƒ S(   NR   R   R"   (   R,   RS   R"   (   RC   R   (    (    sF   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/atom_selection.pyt
   get_altloc«   s    	c         C   s   t  d |  j d | d |  j ƒ S(   NR   R   R"   (   R,   RT   R"   (   RC   R   (    (    sF   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/atom_selection.pyt   get_resname±   s    	c      	   C   s%   t  d |  j d | d |  j d t ƒ S(   NR   R   R"   R!   (   R,   RU   R"   R   (   RC   R   (    (    sF   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/atom_selection.pyt   get_chain_id·   s
    		c         C   s   t  d |  j d | d |  j ƒ S(   NR   R   R"   (   R,   RV   R"   (   RC   R   (    (    sF   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/atom_selection.pyt
   get_resseq¾   s    	c      	   C   s"   t  d d d |  j d | d | ƒ S(   NR2   RV   R   R3   R4   (   R:   RV   (   RC   R3   R4   (    (    sF   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/atom_selection.pyt   get_resseq_rangeÄ   s    c         C   s   t  d |  j d | d |  j ƒ S(   NR   R   R"   (   R,   RW   R"   (   RC   R   (    (    sF   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/atom_selection.pyt	   get_icodeÈ   s    	c         C   s   t  d |  j d | d |  j ƒ S(   NR   R   R"   (   R,   RX   R"   (   RC   R   (    (    sF   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/atom_selection.pyt	   get_residÎ   s    	c   
      C   sP  d d l  m } d  } d  } | d  k	 rX | j d ƒ t | ƒ k rX | t | ƒ ƒ } n  | d  k	 r” | j d ƒ t | ƒ k r” | t | ƒ ƒ } n  | d  k	 rÑ | d  k	 rÑ | | k rÑ t d | | f ƒ ‚ n  g  } xr |  j j ƒ  D]a \ } } | | ƒ }	 | d  k	 r|	 | k  rqç n  | d  k	 r;|	 | k r;qç n  | j	 | ƒ qç W| S(   Niÿÿÿÿ(   R-   R.   s0   range with first index > last index: resid %s:%s(
   R/   R-   R'   R0   R(   RK   R1   RX   R   R   (
   RC   R3   R4   R5   R6   R7   R    R   R8   R9   (    (    sF   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/atom_selection.pyt   get_resid_rangeÔ   s*    ''  c      
   C   sg   d  | | g k s t ‚ d d  l } | j j j d |  j d |  j d t | ƒ d t | ƒ ƒ } | g S(   NiÿÿÿÿRY   RZ   R3   R4   (	   R'   t   AssertionErrort   iotbx.pdb.hierarchyt   pdbt	   hierarchyt   get_resid_sequenceRY   RZ   RK   (   RC   R3   R4   t   iotbxR    (    (    sF   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/atom_selection.pyRs   é   s    		c         C   s   t  d |  j d | d |  j ƒ S(   NR   R   R"   (   R,   R[   R"   (   RC   R   (    (    sF   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/atom_selection.pyt	   get_segidó   s    	c         C   s   t  d |  j d | d |  j ƒ S(   NR   R   R"   (   R,   R\   R"   (   RC   R   (    (    sF   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/atom_selection.pyt   get_model_idù   s    	c      	   C   s"   t  d d d |  j d | d | ƒ S(   NR2   t   modelR   R3   R4   (   R:   R\   (   RC   R3   R4   (    (    sF   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/atom_selection.pyt   get_model_id_rangeÿ   s    c         C   s   t  d |  j d | d |  j ƒ S(   NR   R   R"   (   R,   R]   R"   (   RC   R   (    (    sF   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/atom_selection.pyt   get_element  s    	c         C   s   t  d |  j d | d |  j ƒ S(   NR   R   R"   (   R,   R^   R"   (   RC   R   (    (    sF   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/atom_selection.pyt
   get_charge	  s    	c         C   s
   |  j  g S(   N(   R_   (   RC   (    (    sF   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/atom_selection.pyt
   get_anisou  s    c   
      C   s  |  j  d  k rd d  l } | j j } |  j j ƒ  } | j d d d d ƒ } x— |  j j ƒ  D]† } x} | j	 ƒ  D]o } xf | j
 ƒ  D]X } xO | j ƒ  D]A } | d | j ƒ d k r— x  | j ƒ  D] }	 d |	 _ qÂ Wq— q— Wq„ Wqq Wq^ W| j ƒ  d k j ƒ  |  _  n  |  j  g S(   Niÿÿÿÿt   first_valuei    t	   incrementRR   t   common_wateri   (   Rb   R'   R/   Rq   t   common_residue_names_get_classRP   t   atomst	   reset_tmpt   modelst   chainst
   conformerst   residuesRT   t   tmpt   extract_tmp_as_size_tR8   (
   RC   Rt   t	   get_classR€   t   sentinelRw   t   chaint	   conformert   residuet   atom(    (    sF   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/atom_selection.pyt	   get_water  s     c         C   s:   |  j  d  k r0 |  j j ƒ  } | j ƒ  |  _  n  |  j  g S(   N(   Rc   R'   RP   R€   t   extract_hetero(   RC   R€   (    (    sF   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/atom_selection.pyt
   get_hetero"  s    c      	   C   sÓ  |  j  d  k rÉd d  l } | j j } t d d d d g ƒ } |  j j ƒ  } | j d d d d ƒ } xB|  j j	 ƒ  D]1} x(| j
 ƒ  D]} x| j ƒ  D]} xú | j ƒ  D]ì }	 | d	 |	 j ƒ d
 k rð xË |	 j ƒ  D] }
 d |
 _ qÚ Wq¯ |	 j j ƒ  d k r¯ |	 j d	 d ƒ } | d  k	 r›|	 j ƒ  d k rAd | _ q˜|	 j ƒ  } | j t g  | D] }
 |
 j ^ q]ƒ ƒ r˜x | D] }
 d |
 _ qWq˜q›q¯ q¯ Wqœ Wq‰ Wqv W| j ƒ  d k j ƒ  |  _  n  |  j  g S(   Niÿÿÿÿs    N  s    CA s    C  s    O  R|   i    R}   RR   t   common_amino_acidi   t   CA(   R`   R'   R/   Rq   R   t   setRP   R€   R�   R‚   Rƒ   R„   R…   RT   R†   R   t   find_atom_byt
   atoms_sizet   issubsetRR   R‡   R8   (   RC   Rt   Rˆ   t   n_ca_c_oR€   R‰   Rw   RŠ   R‹   RŒ   R�   t   cat   residue_atoms(    (    sF   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/atom_selection.pyt   get_pepnames(  s2    &c         C   sü   |  j  d  k rò |  j j ƒ  } | j d d d d ƒ } x› |  j j ƒ  D]Š } x� | j ƒ  D]s } xj | j ƒ  D]\ } xS | j ƒ  D]E } x< | j	 ƒ  D]. } | j
 ƒ  d k r’ d | j ƒ  d _ q’ q’ Wq Wql WqY WqF W| j ƒ  d k j ƒ  |  _  n  |  j  g S(   NR|   i    R}   i   (   Ra   R'   RP   R€   R�   R‚   Rƒ   t   residue_groupsR„   R…   R•   R†   R‡   R8   (   RC   R€   R‰   Rw   RŠ   t   rgt   cft   res(    (    sF   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/atom_selection.pyt   get_single_atom_residueD  s    *c         C   s‘   | d k s t  ‚ |  j j ƒ  } | j ƒ  } d  } | d k rN | | k } n6 | d k ri | | k  } n | d k r„ | | k } n  | j ƒ  g S(   Nt   >t   <t   =(   R    R¡   R¢   (   Ro   RP   R€   t	   extract_bR'   R8   (   RC   t   opR   R€   t   b_isot	   selection(    (    sF   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/atom_selection.pyt   get_bfactorS  s    c         C   s‘   | d k s t  ‚ |  j j ƒ  } | j ƒ  } d  } | d k rN | | k } n6 | d k ri | | k  } n | d k r„ | | k } n  | j ƒ  g S(   NR    R¡   R¢   (   R    R¡   R¢   (   Ro   RP   R€   t   extract_occR'   R8   (   RC   R¤   R   R€   t   occR¦   (    (    sF   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/atom_selection.pyt   get_occupancy`  s    c         C   s   t  j d |  j d | ƒ S(   Nt   sizet   iselections(   R   t   unionRQ   (   RC   R¬   (    (    sF   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/atom_selection.pyR­   m  s    		c         C   s   t  j d |  j d | ƒ S(   NR«   R¬   (   R   t   intersectionRQ   (   RC   R¬   (    (    sF   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/atom_selection.pyR®   r  s    		c         C   s   |  j  d |  j d | ƒ ƒ S(   NR¬   R   (   R­   Rf   (   RC   R   (    (    sF   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/atom_selection.pyt   sel_namew  s    c         C   s   |  j  d |  j d | ƒ ƒ S(   NR¬   R   (   R­   Rg   (   RC   R   (    (    sF   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/atom_selection.pyt
   sel_altlocz  s    c         C   s   |  j  d |  j d | ƒ ƒ S(   NR¬   R   (   R­   Rh   (   RC   R   (    (    sF   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/atom_selection.pyt   sel_resname}  s    c         C   s   |  j  d |  j d | ƒ ƒ S(   NR¬   R   (   R­   Ri   (   RC   R   (    (    sF   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/atom_selection.pyt   sel_chain_id€  s    c         C   s   |  j  d |  j d | ƒ ƒ S(   NR¬   R   (   R­   Rj   (   RC   R   (    (    sF   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/atom_selection.pyt
   sel_resseqƒ  s    c         C   s"   |  j  d |  j d | d | ƒ ƒ S(   NR¬   R3   R4   (   R­   Rk   (   RC   R3   R4   (    (    sF   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/atom_selection.pyt   sel_resseq_range†  s    c         C   s   |  j  d |  j d | ƒ ƒ S(   NR¬   R   (   R­   Rl   (   RC   R   (    (    sF   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/atom_selection.pyt	   sel_icode‰  s    c         C   s   |  j  d |  j d | ƒ ƒ S(   NR¬   R   (   R­   Rm   (   RC   R   (    (    sF   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/atom_selection.pyt	   sel_residŒ  s    c         C   s"   |  j  d |  j d | d | ƒ ƒ S(   NR¬   R3   R4   (   R­   Rn   (   RC   R3   R4   (    (    sF   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/atom_selection.pyt   sel_resid_range�  s    c         C   s"   |  j  d |  j d | d | ƒ ƒ S(   NR¬   R3   R4   (   R­   Rs   (   RC   R3   R4   (    (    sF   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/atom_selection.pyt   sel_resid_sequence’  s    c         C   s   |  j  d |  j d | ƒ ƒ S(   NR¬   R   (   R­   Ru   (   RC   R   (    (    sF   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/atom_selection.pyt	   sel_segid–  s    c         C   s   |  j  d |  j d | ƒ ƒ S(   NR¬   R   (   R­   Rv   (   RC   R   (    (    sF   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/atom_selection.pyt   sel_model_id™  s    c         C   s"   |  j  d |  j d | d | ƒ ƒ S(   NR¬   R3   R4   (   R­   Rx   (   RC   R3   R4   (    (    sF   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/atom_selection.pyt   sel_model_id_rangeœ  s    c         C   s   |  j  d |  j d | ƒ ƒ S(   NR¬   R   (   R­   Ry   (   RC   R   (    (    sF   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/atom_selection.pyt   sel_element   s    c         C   s   |  j  d |  j d | ƒ ƒ S(   NR¬   R   (   R­   Rz   (   RC   R   (    (    sF   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/atom_selection.pyt
   sel_charge£  s    c         C   s   |  j  d |  j ƒ  ƒ S(   NR¬   (   R­   R{   (   RC   (    (    sF   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/atom_selection.pyt
   sel_anisou¦  s    c         C   s   |  j  d |  j ƒ  ƒ S(   NR¬   (   R­   Rš   (   RC   (    (    sF   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/atom_selection.pyt   sel_pepnames©  s    c         C   s   |  j  d |  j ƒ  ƒ S(   NR¬   (   R­   RŸ   (   RC   (    (    sF   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/atom_selection.pyt   sel_single_atom_residue¬  s    c         C   s   |  j  d |  j ƒ  ƒ S(   NR¬   (   R­   RŽ   (   RC   (    (    sF   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/atom_selection.pyt	   sel_water¯  s    c         C   s   |  j  d |  j ƒ  ƒ S(   NR¬   (   R­   R�   (   RC   (    (    sF   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/atom_selection.pyt
   sel_hetero²  s    c         C   s   |  j  d |  j | | ƒ ƒ S(   NR¬   (   R­   R§   (   RC   R¤   R   (    (    sF   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/atom_selection.pyt   sel_bfactorµ  s    c         C   s   |  j  d |  j | | ƒ ƒ S(   NR¬   (   R­   Rª   (   RC   R¤   R   (    (    sF   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/atom_selection.pyt   sel_occupancy¸  s    c         C   sm   | d k s t  ‚ |  j d  k	 s' t  ‚ t j d |  j j d | d |  j j ƒ  j ƒ  ƒ d | ƒ j	 d | ƒ S(   Ni    t   asu_mappingst   buffer_thicknesst
   sites_cartt   distance_cutofft   primary_selection(
   Ro   Rd   R'   R   t   neighbors_fast_pair_generatorRÅ   RP   R€   t   extract_xyzt   neighbors_of(   RC   t   radiusRÉ   (    (    sF   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/atom_selection.pyt
   sel_within»  s    	c         C   s   t  | | ƒ S(   N(   R;   (   RC   R   R>   (    (    sF   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/atom_selection.pyR;   Å  s    c            sÉ  t  } g  } x6t j d ˆ d | d | ƒ D]\ } ‰ | j j ƒ  ‰ ‡ f d †  }	 ˆ d k r  t | ƒ d k r‚ t d ƒ ‚ n  | r— t d ƒ ‚ n  t } q+ ˆ d	 k rá t | ƒ d
 k sÄ t ‚ | j	 ƒ  ‰  | j
 ˆ  ƒ q+ ˆ d5 k rQt | ƒ d k st ‚ | j	 ƒ  }
 | j	 ƒ  } ˆ d k r=| j
 | |
 @ƒ qA| j
 | |
 Bƒ q+ ˆ d k r|| j
 t j |  j t ƒ ƒ q+ ˆ d k r§| j
 t j |  j t  ƒ ƒ q+ ˆ d k rÛ| j
 |  j d ˆ j | j ƒ ƒ ƒ q+ ˆ d6 k r| j
 |  j d ˆ j | j ƒ ƒ ƒ q+ ˆ d k rC| j
 |  j d ˆ j | j ƒ ƒ ƒ q+ ˆ d k rw| j
 |  j d ˆ j | j ƒ ƒ ƒ q+ ˆ d7 k rˆ j | j ƒ ‰  ‡  ‡ f d †  } ‡  ‡ f d †  } | ƒ  \ } } | d k  r}ˆ d k rü| j
 |  j d ˆ  ƒ ƒ qˆ d8 k ra| ƒ  \ } } | d  k r?| j
 |  j d ˆ  ƒ ƒ qz| j
 |  j d | d | ƒ ƒ q| j
 |  j d ˆ  ƒ ƒ qA| |  } | | d
 } ˆ d k rÃ| j
 |  j d | d | ƒ ƒ qAˆ d9 k rñ| j
 |  j d | d | ƒ ƒ qA| j
 |  j d | d | ƒ ƒ q+ ˆ d k rG| j
 |  j d ˆ j | j ƒ ƒ ƒ q+ ˆ d k r{| j
 |  j d ˆ j | j ƒ ƒ ƒ q+ ˆ d  k r¯| j
 |  j d ˆ j | j ƒ ƒ ƒ q+ ˆ d! k rã| j
 |  j d ˆ j | j ƒ ƒ ƒ q+ ˆ d" k r| j
 |  j ƒ  ƒ q+ ˆ d# k r'| j
 |  j  ƒ  ƒ q+ ˆ d$ k rI| j
 |  j! ƒ  ƒ q+ ˆ d% k rk| j
 |  j" ƒ  ƒ q+ ˆ d& k sƒˆ d' k r™| j
 |  j# ƒ  ƒ q+ ˆ d( k s±ˆ d) k r`ˆ j | j ƒ j } | d: k rÜ|	 ƒ  qAˆ j$ ƒ  } | j } y t% | ƒ } Wn t& k
 r|	 ƒ  qAXˆ d( k rD| j
 |  j' | | ƒ ƒ qA| j
 |  j( | | ƒ ƒ q+ ˆ d- k r|  j) d  k	 rˆ j	 ƒ  j d. k s–t ‚ t% ˆ j	 ƒ  j ƒ } ˆ j	 ƒ  j d/ k sÆt ‚ |  j* d ˆ d0 | d t ƒ } | j
 |  j+ d1 | d2 | ƒ ƒ q+ | d  k	 r:| d3 | d ˆ d4 | ƒ sA|	 ƒ  qAq+ |	 ƒ  q+ W| rTt  } n  t | ƒ d k rƒ| rpd  St j |  j t  ƒ S| d } x | d
 D] } | | M} q˜W| rÅ| j, t  ƒ rÅd  S| S(;   NR@   t	   stop_wordt&   expect_nonmatching_closing_parenthesisc              s3   ˆ  d k r t  d ˆ  ƒ ‚ n  t d ˆ  ƒ ‚ d  S(   Nt   peptidet   proteinsQ   "%s" atom selection keyword not available:
  Please try using "pepnames" instead.s)   Atom selection syntax error at word "%s".(   RÑ   RÒ   (   R   R1   (    (   t   lword(    sF   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/atom_selection.pyt   raise_syntax_errorÖ  s    t   optionali    s,   "optional" can appear only at the beginning.s    "optional" can appear only once.t   noti   t   andt   ori   t   allt   noneRR   R   RS   t   altidRT   RŠ   RV   RX   t   resiRw   c             s˜  ‡  f d †  }  ˆ j  j d ƒ } | d k  r-ˆ j ƒ  ‰  ˆ  d  k rR ˆ j  d f Sˆ  j  j d ƒ s{ ˆ j ƒ  ˆ j  d f St ˆ  j  ƒ d k rˆ j ƒ  ‰  ˆ  d  k rÂ ˆ j  d t ˆ j  ƒ f S|  ƒ  sï ˆ j ƒ  ˆ j  d t ˆ j  ƒ f Sˆ j  d ˆ  j  t ˆ j  ƒ f Sˆ j  ˆ  j  t ˆ j  ƒ f S| d t ˆ j  ƒ k r‹ˆ j ƒ  ‰  ˆ  d  k	 r‹|  ƒ  r{ˆ j  ˆ  j  | f Sˆ j ƒ  q‹n  ˆ j  | f S(   Nc              s3   t  ˆ  j ƒ d k r t Sd j ˆ  j d ƒ d k S(   Ni    RJ   (   R(   R   R   t   find(    (   t   arg_cont(    sF   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/atom_selection.pyt   is_cont  s     t   :i    iÿÿÿÿi   (   R   RÝ   RD   R'   t
   startswitht   backupR(   (   Rß   t   i_colon(   t   argR@   (   RÞ   sF   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/atom_selection.pyt   try_compose_range  s2    
	
!	c             sq   ˆ j  ƒ  }  |  d  k r& ˆ j ƒ  d S|  j j ƒ  } | d k rc ˆ j |  j ƒ } ˆ  j | j f Sˆ j ƒ  d S(   Nt   through(   NN(   NN(   RD   R'   Râ   R   R*   RG   (   t   arg_nextt   lnextt	   arg_final(   Rä   R@   (    sF   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/atom_selection.pyt   try_compose_sequence  s    

R3   R4   RW   R[   R]   R^   R_   R`   Ra   Rb   Rc   t   hetatmt   bfactort	   occupancyR    R¡   R¢   t   withint   (t   ,t   callbackRÍ   RÉ   RF   t   result_stack(   R×   s   or(   s   altlocRÛ   (   s   resseqs   residRÜ   s   model(   s   residRÜ   (   s   residRÜ   (   R    R¡   R¢   (-   R   R   t   infix_as_postfixR   R*   R(   R   R   Ro   t   popR   R   t   boolRQ   R¯   RG   R°   R±   R²   R³   R'   R¶   R¸   Rº   R´   R·   R»   Rµ   R¹   R¼   R½   R¾   R¿   RÀ   RÁ   RÂ   RD   t   floatt
   ValueErrorRÃ   RÄ   Rd   t   selection_parserRÎ   t   all_eq(   RC   R@   RÕ   Rñ   RÏ   RÐ   t   have_optionalRò   RF   RÔ   t   rhst   lhsRå   Rê   t   valRã   R3   R4   R¤   Rç   Rè   RÍ   t   selR¦   R    (    (   Rä   RÓ   R@   sF   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/atom_selection.pyRø   È  s   	""""
""""
				 	 
c         C   s›   y2 |  j  d |  j d | d | ƒ d | d | ƒ SWnb t t f k
 rN ‚  nI t k
 r– t ƒ  j ƒ  } | j d | g ƒ t d j | ƒ ƒ ‚ n Xd S(	   sv   
    Given a selection string, return the corresponding flex.bool selection
    of the same size as root.atoms().
    R@   R   R>   RÕ   Rñ   s,   Atom selection string leading to error:
  %ss   
N(	   Rø   R;   RL   t   KeyboardInterruptt	   ExceptionR   t
   splitlinest   extendt   join(   RC   R   RÕ   R>   Rñ   t   msg(    (    sF   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/atom_selection.pyR¦   †  s    				 c         C   s8   |  j  d | d | d | ƒ } | d k r. d S| j ƒ  S(   sk   
    Given a selection string, return the corresponding flex.size_t array
    specifying atom indices.
    R   RÕ   R>   N(   R¦   R'   R8   (   RC   R   RÕ   R>   R    (    (    sF   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/atom_selection.pyR8   œ  s    		c	      	   C   s¾   g  }	 x± | |  j  f | |  j f | |  j f | |  j f | |  j f | |  j f | |  j f | |  j f g D]I \ }
 } |
 d  k	 rm | j	 |
 d  ƒ } | d  k	 r¶ |	 j
 | ƒ q¶ qm qm W|	 S(   N(   RR   RS   RT   RU   RV   RW   R[   R\   R'   t   getR   (   RC   RR   RS   RT   RU   RV   RW   R[   R\   R    Rä   t   attrt   isel(    (    sF   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/atom_selection.pyt
   get_labels©  s    	 c         C   sœ  t  j j ƒ  } t j } | |  j j | j | ƒ ƒ j | |  j	 j | j
 | ƒ ƒ ƒ j | |  j j | j | ƒ ƒ ƒ j | |  j j | j | ƒ ƒ ƒ j | |  j j | j | ƒ ƒ ƒ j | |  j j | j | ƒ ƒ ƒ | |  j j | j | ƒ ƒ j | |  j	 j | j | ƒ ƒ ƒ j | |  j j | j | ƒ ƒ ƒ j | |  j j | j | ƒ ƒ ƒ j | |  j j | j | ƒ ƒ ƒ j | |  j j | j | ƒ ƒ ƒ g S(   N(   R   t   vectort   unsignedR   t   size_tRR   R  t   name1R®   RS   t   altloc1RT   t   resname1RU   t	   chain_id1RV   t   resseq1RW   t   icode1t   name2t   altloc2t   resname2t	   chain_id2t   resseq2t   icode2(   RC   t   link_recordt   sel_nullt   fs(    (    sF   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/atom_selection.pyt   link_iselectionsÀ  s    	!!!!!!!!N(=   RH   RI   t   __doc__t	   __slots__R'   RA   Rf   Rg   Rh   Ri   Rj   Rk   Rl   Rm   Rn   Rs   Ru   Rv   Rx   Ry   Rz   R{   RŽ   R�   Rš   RŸ   R§   Rª   R­   R®   R¯   R°   R±   R²   R³   R´   Rµ   R¶   R·   R¸   R¹   Rº   R»   R¼   R½   R¾   R¿   RÀ   RÁ   RÂ   RÃ   RÄ   RÎ   R;   R   R   Rø   R¦   R8   R  R  (    (    (    sF   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/atom_selection.pyRO   t   s´   	
										
																																					
»c         C   sŸ   | j  ƒ  j d ƒ s t ‚ t j | j ƒ  t ƒ } t |  ƒ j d k rX |  j	 ƒ  }  n  x@ |  D]8 } | | j
 ƒ  } | j ƒ  j  ƒ  } | j | t ƒ q_ W| S(   Ni    Rõ   (   t   extract_i_seqRù   Ro   R   Rõ   R«   R   t   typeRH   R8   t   parentR€   t   set_selectedR   (   R¦   t	   pdb_atomst   selection_completet   i_seqt
   atom_groupt   group_atoms(    (    sF   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/atom_selection.pyt&   expand_selection_to_entire_atom_groupsÑ  s    (   R  t
   __future__R    Rt   R   R   t   cctbxR   t   scitbx.array_familyR   t   scitbxR   t   scitbx.stl.mapt   libtbx.philR   t   libtbx.utilsR   R   t   libtbxR	   R   R   R,   R:   R@   R;   RK   RL   RO   R'  (    (    (    sF   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/atom_selection.pyt   <module>   s*   	 		ÿ ÿ _