ó
Š™xTc           @   s)  d  d l  m Z d  d l Z e j j d ƒ Z d  d l Td  d l m	 Z	 d  d l
 m Z d  d l m Z m Z m Z d  d l m Z m Z d  d	 l m Z d  d l Z d  d l Z d  d l Z d
 e f d „  ƒ  YZ d d d d d g Z d „  Z d e f d „  ƒ  YZ d e f d „  ƒ  YZ d e j j e j e f d „  ƒ  YZ  d e j j e j! e f d „  ƒ  YZ  d e j j e j" e f d „  ƒ  YZ  d e j j e j# e f d „  ƒ  YZ  d e j j e j$ e f d „  ƒ  YZ  d e j j e j% e f d „  ƒ  YZ  d e j j e j& f d „  ƒ  YZ  d e j j e j' f d „  ƒ  YZ  d e j j e j( f d „  ƒ  YZ  d  e f d! „  ƒ  YZ) d" e) f d# „  ƒ  YZ* d$ e* f d% „  ƒ  YZ+ e d& „ Z, e d' „ Z- d( „  Z. e j/ d) „ Z0 d* „  Z1 e2 e2 d+ „ Z3 e4 e4 e2 d, „ Z5 e4 e2 d- „ Z6 e4 e7 e7 e e2 d. „ Z8 d S(/   iÿÿÿÿ(   t   divisionNt   iotbx_pdb_hierarchy_ext(   t   *(   t   flex(   t   show_sorted_by_counts(   t   Sorryt   plural_st   null_out(   t   Autot   dict_with_default_0(   t   StringIOt   pickle_import_triggerc           B   s   e  Z RS(    (   t   __name__t
   __module__(    (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyR      s    t   modelt   chaint   residue_groupt
   atom_groupt   atomc            sñ   |  j  ƒ  } | j ƒ  d k rm |  j ƒ  } | d  k r? d } n d | j } ˆ  ˆ d | |  j ƒ  f IJn€ ‡  ‡ f d †  } | j ƒ  d k r¯ xY | D] } | | ƒ q˜ Wn> | | d ƒ ˆ  ˆ d t | j ƒ  d ƒ IJ| | d	 ƒ d  S(
   Ni    s     s   %ss   empty: "%s%s"c            s"   ˆ  ˆ d |  j  d d ƒ IJd  S(   Ns   "%s"t   replace_floats_withs   .*.(   t   format_atom_record(   R   (   t   outt   prefix(    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyt	   show_atom   s    i   s   ... %d atom%s not showni   iÿÿÿÿ(   t   atomst   sizet   parentt   Nonet   idt   residR   (   t   rgR   R   R   t   chR   R   (    (   R   R   sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyt   _show_residue_group   s     	! t   overall_countsc           B   s×   e  Z d  „  Z d d e e d d d „ Z d d d d „ Z d „  Z d „  Z d „  Z	 d d d „ Z
 d	 „  Z d d d
 „ Z d „  Z d d d d „ Z d d d d „ Z d d „ Z d d d d „ Z d d „ Z RS(   c         C   s   d  |  _ d  |  _ d  S(   N(   R   t   _errorst	   _warnings(   t   self(    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyt   __init__(   s    	t    i
   c            s†  d d l  m } ˆ d  k r( t j ‰ n  g  ˆ _ g  ˆ _ ‡  ‡ ‡ ‡ f d †  } ‡ ‡ ‡ ‡ f d †  }	 d t t ˆ j	 ƒ ƒ }
 ˆ ˆ d IJˆ j
 d k r­ | d ƒ n  ˆ j d k rÉ |	 d	 ƒ n  ˆ ˆ d
 I|
 ˆ j Ig  } ˆ j
 d k r| j d t ˆ j
 ƒ ƒ n  ˆ j d k r<| j d ˆ j ƒ n  t | ƒ d k rhˆ d d j | ƒ In  ˆ Jˆ j d k rˆ|	 d ƒ n  ˆ j d k r¤|	 d ƒ n  ˆ ˆ d I|
 ˆ j Ig  } ˆ j d k rñ| j d t ˆ j ƒ ƒ n  ˆ j d k r| j d ˆ j ƒ n  ˆ j d k rC| j d t ˆ j ƒ ƒ n  t | ƒ d k roˆ d d j | ƒ In  ˆ Jˆ ˆ d I|
 ˆ j IJˆ ˆ d I|
 ˆ j ˆ j ˆ j Iˆ j d k rÚˆ d ˆ j In  ˆ Jˆ j d k rú| d ƒ n  ˆ ˆ d I|
 ˆ j	 Iˆ j d k r8ˆ d ˆ j In  ˆ Jˆ ˆ d I|
 ˆ j IJˆ j d k rŽ|	 d ƒ ˆ ˆ d I|
 ˆ j IJn  ˆ j d k rÅ|	 d ƒ ˆ ˆ d I|
 ˆ j IJn  ˆ j } ˆ ˆ d It | ƒ IJt | ƒ d k r+ˆ ˆ d  IJt | j ƒ  d! ˆ d" ˆ d# ƒn  ˆ j } ˆ ˆ d$ It | ƒ d k raˆ d  In  ˆ Jt | j ƒ  d! ˆ d" ˆ d# ƒˆ j } ˆ ˆ d% t | ƒ IJt | ƒ d k réˆ ˆ d& IJt | j ƒ  d! ˆ d" ˆ d# ƒn  ˆ j  } ˆ ˆ d' t | ƒ IJt | ƒ d k r*ˆ ˆ d( IJt | j ƒ  d! ˆ d" ˆ d# ƒd t t t! ˆ j" ˆ j# ˆ j$ ˆ j% ƒ ƒ ƒ }
 ˆ ˆ d) IJˆ ˆ d* I|
 ˆ j" IJˆ ˆ d+ I|
 ˆ j# IJˆ ˆ d, I|
 ˆ j$ IJˆ j% d k rö| d- ƒ n  ˆ ˆ d. I|
 ˆ j% IJˆ j& d! ˆ d" ˆ ƒ n  ˆ j' } ˆ ˆ d/ t | ƒ IJt | ƒ d k rêˆ ˆ d0 IJi d  d1 6d  d2 6d3 d4 6d5 d6 6d7 d8 6d9 d: 6} t | j ƒ  d! ˆ d" ˆ d# d; g  | j( ƒ  D] } | | d< | ƒ ^ qÇƒn  t ˆ j) ƒ d k r|	 d= ƒ n  ˆ j* d! ˆ d" ˆ d> | ƒ t ˆ j+ ƒ d k rf| d? ƒ ˆ j, d! ˆ d" ˆ d> | ƒ n  ˆ j- d! ˆ d" ˆ d> | ƒ d  S(@   Niÿÿÿÿ(   t   common_residue_names_get_classc            s1   ˆ  r ˆ ˆ |  IJn  ˆ j  j |  j ƒ  ƒ d  S(   N(   R"   t   appendt   strip(   t   msg(   t   flag_errorsR   R   R$   (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyt   add_err7   s     c            s1   ˆ  r ˆ ˆ |  IJn  ˆ j  j |  j ƒ  ƒ d  S(   N(   R#   R(   R)   (   R*   (   t   flag_warningsR   R   R$   (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyt   add_warn:   s     s   %%%dds   total number of:i    s$     ### ERROR: duplicate model ids ###s     ### WARNING: empty model ###s     models:    s   %d with duplicate model id%ss   %d emptys   (%s)s   ; s&     ### WARNING: duplicate chain ids ###s     ### WARNING: empty chain ###s     chains:    s   %d with duplicate chain id%ss   %d explicit chain break%ss     alt. conf.:s     residues:  s   (%d with mixed residue names)s&     ### ERROR: duplicate atom labels ###s     atoms:     s   (%d with duplicate labels)s     anisou:    s&     ### WARNING: empty residue_group ###s     empty residue_groups:s#     ### WARNING: empty atom_group ###s     empty atom_groups:s$   number of atom element+charge types:s+   histogram of atom element+charge frequency:R   R   s     s   residue name classes:s   number of chain ids: %ds    histogram of chain id frequency:s   number of alt. conf. ids: %ds%   histogram of alt. conf. id frequency:s   residue alt. conf. situations:s     pure main conf.:    s     pure alt. conf.:    s     proper alt. conf.:  s$     ### ERROR: improper alt. conf. ###s     improper alt. conf.:s   number of residue names: %ds$   histogram of residue name frequency:t   common_amino_acidt   common_rna_dnas      common watert   common_waters      common small moleculet   common_small_molecules      common elementt   common_elements      othert   othert   annotationst   names;   ### WARNING: consecutive residue_groups with same resid ###t   max_showsE   ### ERROR: residue group with multiple resnames using same altloc ###(.   t	   iotbx.pdbR'   R   t   syst   stdoutR"   R#   t   lent   strt   n_atomst   n_duplicate_model_idst   n_empty_modelst   n_modelsR(   R   t   joint   n_duplicate_chain_idst   n_empty_chainst   n_chainst   n_explicit_chain_breakst
   n_alt_conft
   n_residuest   n_residue_groupst   n_empty_residue_groupst   n_duplicate_atom_labelst   n_anisout   n_empty_atom_groupst   element_charge_typesR   t   itemst   resname_classest	   chain_idst   alt_conf_idst   maxt   n_alt_conf_nonet   n_alt_conf_puret   n_alt_conf_propert   n_alt_conf_impropert4   show_chains_with_mix_of_proper_and_improper_alt_conft   resnamest   keyst*   consecutive_residue_groups_with_same_residt/   show_consecutive_residue_groups_with_same_residt7   residue_groups_with_multiple_resnames_using_same_altloct<   show_residue_groups_with_multiple_resnames_using_same_altloct   show_duplicate_atom_labels(   R$   R   R   R+   R-   t   residue_groups_max_showt   duplicate_atom_labels_max_showR'   R,   R.   t   fmtt   infost   ct   annotation_appearanceR6   (    (   R+   R-   R   R   R$   sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyt   show,   sò     		  

	#	  	#	 		
-	
		c      	   C   s5   t  ƒ  } |  j d | d | d | d | ƒ | j ƒ  S(   NR   R   R_   R`   (   R
   Re   t   getvalue(   R$   R   R_   R`   R   (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyt   as_str¹   s    		c         C   s,   |  j  d  k r% |  j d t ƒ  ƒ n  |  j  S(   NR   (   R"   R   Re   R   (   R$   (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyt   errorsÅ   s     c         C   s,   |  j  d  k r% |  j d t ƒ  ƒ n  |  j  S(   NR   (   R#   R   Re   R   (   R$   (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyt   warningsÉ   s     c         C   s   |  j  ƒ  |  j ƒ  S(   N(   Rh   Ri   (   R$   (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyt   errors_and_warningsÍ   s    c      
   C   sÎ   |  j  d k r d  S| d  k r+ t j } n  xœ |  j d f |  j d f g D]| \ } } | d  k rh qJ n  | | d | IJxI | j ƒ  D]; } x2 | j ƒ  D]$ } | | d | j d d ƒ IJqš Wq‡ WqJ Wd  S(   Ni    t   propert   impropers   residue with %s altlocs     "%s"R   s   .*.(	   RV   R   R9   R:   t   alt_conf_propert   alt_conf_impropert   atom_groupsR   R   (   R$   R   R   R   t   labelt   agR   (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyt   show_improper_alt_confÐ   s       c         C   sP   t  ƒ  } |  j d | ƒ | j ƒ  } t | ƒ d k rL t | j ƒ  ƒ ‚ n  d  S(   NR   i    (   R
   Rr   Rf   R;   R   t   rstrip(   R$   t   sioR*   (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyt$   raise_improper_alt_conf_if_necessaryÜ   s
    	 c         C   sh   | d  k r t j } n  |  j } | | d I| IJ| d k rN | d } n  |  j d | d | ƒ d  S(   Ns2   chains with mix of proper and improper alt. conf.:i    s     R   R   (   R   R9   R:   t1   n_chains_with_mix_of_proper_and_improper_alt_confRr   (   R$   R   R   t   n(    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyRW   â   s     	 c         C   sH   |  j  d k r d  St ƒ  } |  j d | ƒ t | j ƒ  j ƒ  ƒ ‚ d  S(   Ni    R   (   Rv   R
   RW   R   Rf   Rs   (   R$   Rt   (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pytB   raise_chains_with_mix_of_proper_and_improper_alt_conf_if_necessaryì   s
    	c   
   
   C   s–  |  j  } t | ƒ d k r d  S| d  k r7 t j } n  | | d t | ƒ IJ| d  k rj t | ƒ } n | d k rz d  S| d d d } d  } x¼ | |  D]° } x§ t d d g | ƒ D]� \ } }	 | d  k	 rï | j ƒ  |	 j ƒ  k rï q¹ n% | d k r| d  k	 r| | IJn  |	 } | | d | IJt d	 |	 d
 | d | d ƒ q¹ Wq� Wt | ƒ | k r’| | IJ| | d t t | ƒ | ƒ IJn  d  S(   Ni    s8   number of consecutive residue groups with same resid: %ds     t   -i*   R&   s   next s     %sresidue group:R   R   R   s       s'     ... %d remaining instance%s not shown(	   RZ   R;   R   R9   R:   t   zipt	   memory_idR    R   (
   R$   R   R   R7   t   const   delimt   prev_rgt   rgst   nextR   (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyR[   ó   s8    	    " %

c      	   C   sß   |  j  } t | ƒ d k r d  S| | d It | ƒ IJ| d  k rT t t ƒ } n | d k rd d  Sx= | |  D]1 } | | d IJt d | d | d | d ƒ qo Wt | ƒ | k rÛ | | d t t | ƒ | ƒ IJn  d  S(	   Ni    s8   residue groups with multiple resnames using same altloc:s     residue group:R   R   R   s       s'     ... %d remaining instance%s not shown(   R\   R;   R   R|   R    R   (   R$   R   R   R7   R   R   (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyR]     s    	   !
c         C   sV   t  ƒ  } |  j d | d | ƒ | j ƒ  } t | ƒ d k rR t | j ƒ  ƒ ‚ n  d  S(   NR   R7   i    (   R
   R]   Rf   R;   R   Rs   (   R$   R7   Rt   R*   (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pytJ   raise_residue_groups_with_multiple_resnames_using_same_altloc_if_necessary   s    		 c   	   	   C   sC  |  j  } t | ƒ d k r d  S| d  k r7 t j } n  d t t |  j ƒ ƒ } | | d I| t | ƒ IJ| | d I| |  j IJ| d  k r¤ t | ƒ } n | d k r´ d  SxQ | |  D]E } d } x6 | D]. } | | | d | j d d ƒ IJd	 } qÒ Wq¿ Wt | ƒ | k r?| | d
 t t | ƒ | ƒ IJn  d  S(   Ni    s   %%%dds*   number of groups of duplicate atom labels:s*     total number of affected atoms:         s     group s   "%s"R   s   .*.s           s$     ... %d remaining group%s not shown(	   t   duplicate_atom_labelsR;   R   R9   R:   R<   RJ   R   R   (	   R$   R   R   R7   t   dupRa   R   t   prfxR   (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyR^   )  s.    	    
c         C   sV   t  ƒ  } |  j d | d | ƒ | j ƒ  } t | ƒ d k rR t | j ƒ  ƒ ‚ n  d  S(   NR   R7   i    (   R
   R^   Rf   R;   R   Rs   (   R$   R7   Rt   R*   (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyt(   raise_duplicate_atom_labels_if_necessary>  s
    	 N(   R   R   R%   R   t   TrueRe   Rg   Rh   Ri   Rj   Rr   Ru   RW   Rx   R[   R]   R�   R^   R…   (    (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyR!   &   s6   	ˆ						t   __hash_eq_mixinc           B   s#   e  Z d  „  Z d „  Z d „  Z RS(   c         C   s   t  |  j ƒ  ƒ S(   N(   t   hashR{   (   R$   (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyt   __hash__F  s    c         C   s,   t  | |  j ƒ r( |  j ƒ  | j ƒ  k St S(   N(   t
   isinstancet	   __class__R{   t   False(   R$   R4   (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyt   __eq__I  s    c         C   s   |  | k S(   N(    (   R$   R4   (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyt   __ne__N  s    (   R   R   R‰   R�   RŽ   (    (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyR‡   D  s   		t   _c           B   sÙ  e  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) d d) e d „ Z d d) e d „ Z d) d) e e d d) e e e e e d) e d „ Z d) d „ Z d) d „ Z d) d „ Z e d „ Z e d) d) e e d d) e e e e d „ Z d) d „ Z d) d) d „ Z d „  Z d „  Z  d „  Z! d) d „ Z" d) e e d „ Z# d „  Z$ d  d! d" „ Z% d# „  Z& d$ „  Z' d% „  Z( d& „  Z) d' „  Z* e d( „ Z+ RS(*   s6  
  Root node of the PDB hierarchy object.  This is returned by the method
  construct_hierarchy() of the PDB/mmCIF input objects, but it may also be
  created programatically.  Note that it does not contain any reference to
  crystal symmetry or source scattering information, meaning that in practice
  it must often be tracked alongside an equivalent cctbx.xray.structure object.
  Pickling is supported, simply by writing out and reading back the PDB-format
  representation of the hierarchy.

  Examples
  --------
  >>> hierarchy = iotbx.pdb.hierarchy.root()
  c         C   se   d } t  ƒ  } |  j d | d t d d d d  d t d t d	 t d
 t ƒ | t ƒ  |  j | j ƒ  f S(   Ni   t	   cstringiot
   append_endt   interleaved_confi    t   atoms_reset_serial_first_valuet   atom_hetatmt   sigatmt   anisout   siguij(   R
   t   _as_pdb_string_cstringioR†   R   R   t   infoRf   (   R$   t   versiont
   pdb_string(    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyt   __getstate__`  s    		c         C   s  t  | ƒ d k s t ‚ | d } | d k rI t  | ƒ d k s| t ‚ n3 | d k rp t  | ƒ d k s| t ‚ n t d ƒ ‚ | d |  _ d d  l } | j j d	 d
 d t j | d ƒ ƒ j	 ƒ  j
 ƒ  } |  j d t  | ƒ ƒ x | D] } |  j d | ƒ qæ Wd  S(   Ni   i    i   i   i   s!   Unknown version of pickled state.iþÿÿÿiÿÿÿÿt   source_infot   picklet   linest   number_of_additional_modelsR   (   R;   t   AssertionErrort   RuntimeErrorR™   R8   t   pdbt   inputR   t   split_linest   construct_hierarchyt   modelst   pre_allocate_modelst   append_model(   R$   t   stateRš   t   iotbxR§   R   (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyt   __setstate__n  s    
  "c         c   s7   x0 |  j  ƒ  D]" } x | j ƒ  D] } | Vq  Wq Wd S(   s0   
    Iterate over all chains in all models.
    N(   R§   t   chains(   R$   R   R   (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyR­   }  s    c         c   sN   xG |  j  ƒ  D]9 } x0 | j ƒ  D]" } x | j ƒ  D] } | Vq3 Wq  Wq Wd S(   s9   Iterate over all residue groups (by model and then chain)N(   R§   R­   t   residue_groups(   R$   R   R   R   (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyR®   …  s    c         c   se   x^ |  j  ƒ  D]P } xG | j ƒ  D]9 } x0 | j ƒ  D]" } x | j ƒ  D] } | VqF Wq3 Wq  Wq Wd S(   sQ   
    Iterate over all atom groups (by model, then chain, then residue group)
    N(   R§   R­   R®   Ro   (   R$   R   R   R   Rq   (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyRo   Œ  s
    c         C   s&   |  j  ƒ  d k s t ‚ |  j ƒ  d S(   Ni   i    (   t   models_sizeR¡   R§   (   R$   (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyt
   only_model–  s    c         C   s   |  j  ƒ  j ƒ  S(   N(   R°   t
   only_chain(   R$   (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyR±   š  s    c         C   s   |  j  ƒ  j ƒ  S(   N(   R±   t   only_residue_group(   R$   (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyR²   �  s    c         C   s   |  j  ƒ  j ƒ  S(   N(   R±   t   only_conformer(   R$   (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyR³      s    c         C   s   |  j  ƒ  j ƒ  S(   N(   R²   t   only_atom_group(   R$   (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyR´   £  s    c         C   s   |  j  ƒ  j ƒ  S(   N(   R³   t   only_residue(   R$   (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyRµ   ¦  s    c         C   s   |  j  ƒ  j ƒ  S(   N(   R´   t	   only_atom(   R$   (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyR¶   ©  s    c         C   s   t  ƒ  } |  j | ƒ | S(   s¯   
    Calculate basic statistics for contents of the PDB hierarchy, including
    number of residues of each type.

    :returns: iotbx.pdb.hierarchy.overall_counts object
    (   R!   t   get_overall_counts(   R$   t   result(    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyR!   ¬  s    	R&   c      
   C   s;  | d k r d } n  y t j | ƒ } Wn! t k
 rK | d | ƒ ‚ n X| d k rd t j } n  |  j ƒ  d k r‡ | | d IJn  t ƒ  } x' |  j ƒ  D] } | | j	 c d 7<q� Wxz|  j ƒ  D]l} | j
 ƒ  } | | j	 d k rõ d }	 n d }	 | | d | j	 Id	 t | ƒ |	 f IJ| d k r8qÇ n  | j ƒ  d k r[| | d
 IJn  t ƒ  }
 x! | D] } |
 | j	 c d 7<qkWx¨| D] } | j ƒ  } |
 | j	 d k r½d }	 n d }	 | | d | j	 Id t | ƒ |	 f IJ| d k r q�n  | j ƒ  d k r#| | d IJn  t } d } xý| D]õ} | j r^| r^| | d IJn  t } | j ƒ  } t ƒ  } x$ | j ƒ  D] } | j | j ƒ q†Wg  } t | ƒ d k rÈ| j d ƒ n  | j ƒ  } | | k rð| j d ƒ n  | } t | ƒ d k rd d j | ƒ }	 n d }	 | | d | Id t | ƒ |	 f IJ| d k r^q6n  | j ƒ  d k r�| | d IJn  x§ | D]Ÿ } | j ƒ  } | | d | j Id | j Id t | ƒ IJ| d k rÞqˆn  | j ƒ  d k r| | d IJn  x# | D] } | | d | j IJqWqˆWq6Wq�WqÇ Wd S(   s2   
    Display a summary of hierarchy contents.
    R   s   Unknown level_id="%s"i    s    ### WARNING: empty hierarchy ###i   s#     ### ERROR: duplicate model id ###R&   s   model id="%s"s   #chains=%d%ss     ### WARNING: empty model ###s%     ### WARNING: duplicate chain id ###s     chain id="%s"s   #residue_groups=%d%ss        ### WARNING: empty chain ###s       ### chain break ###s   with mixed residue namess   same as previous resids     ### Info: %s ###s   ; s       resid="%s"s   #atom_groups=%d%si   s*         ### WARNING: empty residue_group ###s         altloc="%s"s   resname="%s"s	   #atoms=%di   s)           ### WARNING: empty atom_group ###s           "%s"N(   R   t	   level_idst   indext
   ValueErrorR9   R:   R¯   R	   R§   R   R­   R;   t   chains_sizeR®   t   residue_groups_sizeR†   t   link_to_previousRŒ   Ro   t   sett   addt   resnameR(   R   RA   t   atom_groups_sizeR   t   altloct
   atoms_sizeR6   (   R$   R   R   t   level_idt   level_id_exceptiont   level_not	   model_idsR   R­   t   st   model_chain_idsR   R   t   suppress_chain_breakt
   prev_residR   t   agsRX   Rq   Rb   R   R   R   (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyRe   ·  s–     	  		 		 	     c      	   C   s5   t  ƒ  } |  j d | d | d | d | ƒ | j ƒ  S(   s   
    Alias for show().
    R   R   RÅ   RÆ   (   R
   Re   Rf   (   R$   R   RÅ   RÆ   R   (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyRg     s    		i    c         C   sà   | d k r- t ƒ  } | t k rB t } qB n | t k rB t } n  | d k	 sZ | d k	 rŒ d d l m } | | d | d | d | ƒ IJn  |  j d | d | d | d	 | d
 | d | d |	 d |
 d | ƒ 	| rÖ | S| j ƒ  S(   sL  
    Generate complete PDB-format string representation.  External crystal
    symmetry is strongly recommended if this is being output to a file.

    :param crystal_symmetry: cctbx.crystal.symmetry object or equivalent (such
      as an xray.structure object or Miller array)
    :param write_scale_records: write fractional scaling records (SCALE) if
      crystal symmetry is provided
    :param anisou: write ANISOU records for anisotropic atoms
    :param sigatm: write SIGATM records if applicable
    :param siguij: write SIGUIJ records if applicable
    :returns: Python str
    iÿÿÿÿ(   t   format_cryst1_and_scale_recordst   crystal_symmetryt   cryst1_zt   write_scale_recordsR�   R‘   R’   R“   R”   R•   R–   R—   t   output_break_recordsN(	   R   R
   R   RŒ   R†   R8   RÎ   R˜   Rf   (   R$   RÏ   RÐ   RÑ   R‘   R’   R“   R”   R•   R–   R—   RÒ   R�   t   return_cstringioRÎ   (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyt   as_pdb_string  s2    		
	c         C   sF   d d l  } |  j d | ƒ } | j j d d d t j | ƒ ƒ } | S(   s2   
    Generate corresponding pdb.input object.
    iÿÿÿÿNRÏ   R�   t   pdb_hierarchyRŸ   (   R8   RÔ   R£   R¤   R   R¥   (   R$   RÏ   R«   t   pdb_strt   pdb_inp(    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyt   as_pdb_inputE  s    c         C   s`   d d l  } d d l m } |  j d | ƒ } | j j j ƒ  } | | d <| j d | ƒ } | S(   s4   
    Generate corresponding mmcif input object.
    iÿÿÿÿN(   t   mmcifRÏ   RÕ   t
   cif_object(   t   iotbx.cif.modelR8   RÙ   t   as_cif_blockt   cifR   t	   cif_input(   R$   RÏ   R«   RÙ   t	   cif_blockt	   cif_modelRÞ   (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyt   as_cif_inputP  s    
c         C   s   |  j  | ƒ j ƒ  S(   s  
    Generate the equivalent cctbx.xray.structure object.  If the crystal
    symmetry is not provided, this will be placed in a P1 box.  In practice it
    is usually best to keep the original xray structure object around, but this
    method is helpful in corner cases.
    (   RØ   t   xray_structure_simple(   R$   RÏ   (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyt   extract_xray_structure\  s    c            sÿ  d d l  m } d d l m ‰  |  j ƒ  j ƒ  | j ƒ  j ƒ  k rS t d ƒ ‚ n  |  j ƒ  } | j ƒ  } | j	 ƒ  ‰ ˆ j
 ‰ ‡  ‡ ‡ f d †  } xct | | ƒ D]R\ } } | j ƒ  }	 |	 d d !}
 | |
 ƒ } | | j ƒ } | | g j d ƒ d	 k s|	 j ƒ  d
 k rU| d k rU| j j ƒ  j ƒ  d k s?t ‚ | d | d | ƒ q¥ | rä| j d	  d k rä| j j d d
 ƒ j d d
 ƒ } | j ƒ  j d d
 ƒ j d d
 ƒ } | | k rät d | j | j ƒ  f ƒ ‚ qän  | d | d | ƒ q¥ Wd S(   sÕ   
    Apply the current (refined) atomic parameters from the cctbx.xray.structure
    object to the atoms in the PDB hierarchy.  This will fail if the labels of
    the scatterers do not match the atom labels.
    iÿÿÿÿ(   R'   (   t   adptbxs4   Incompatible size of hierarchy and scatterers array.c            sá   | j  d ˆ |  j ƒ ƒ | j d |  j ƒ |  j d k rZ | j d ˆ  j |  j ƒ ƒ n  |  j j ƒ  rš |  j	 d	 k rš | j
 d ˆ  j ˆ |  j	 ƒ ƒ n
 | j ƒ  | j d |  j ƒ | j d |  j ƒ | j |  j ƒ  ƒ d  S(
   Nt   new_xyzt   new_occiÿÿÿÿt   new_bg      ð¿t   new_uijt   new_fpt   new_fdp(   g      ð¿g      ð¿g      ð¿g      ð¿g      ð¿g      ð¿(   t   set_xyzt   sitet   set_occt	   occupancyt   u_isot   set_bt   u_as_bt   flagst   use_u_anisot   u_start   set_uijt   u_star_as_u_cartt	   uij_eraset   set_fpt   fpt   set_fdpt   fdpt   set_elementt   element_symbol(   t   sct   a(   Rä   t   ortht   uc(    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyt   set_attrs  s    "
i
   i   R1   i   R&   t   ot   ht   dRþ   Rÿ   t   ISs   pdb=t    s   Mismatch: 
 %s 
 %s 
N(   R  R  R  (   R8   R'   t   cctbxRä   R   R   t
   scatterersR¢   t   atoms_with_labelst	   unit_cellt   orthogonalizeRz   t   id_strRÁ   t   countR)   t   scattering_typet   lowerR¡   Rp   t   replace(   R$   t   xray_structuret   assert_identical_id_strt   gct   awlR	  R  Rþ   Rÿ   R  t   resname_from_sct   cl1t   cl2t   l1t   l2(    (   Rä   R   R  sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyt   adopt_xray_structuree  s0    $	!!$%c         C   s²   | d  k	 s | d  k	 rn d d l m } | r7 d } n d } t | | ƒ | d | d | d | ƒ IJt } n  |  j d | d	 | d
 | d | d | d |	 d |
 d | d | ƒ 	d  S(   Niÿÿÿÿ(   RÎ   t   abt   wbRÏ   RÐ   RÑ   t	   file_namet   open_appendR‘   R’   R“   R”   R•   R–   R—   (   R   R8   RÎ   t   openR†   t   _write_pdb_file(   R$   R  R  RÏ   RÐ   RÑ   R‘   R’   R“   R”   R•   R–   R—   RÎ   t   mode(    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyt   write_pdb_file‘  s(     				c         C   s#   d d l  m } | |  d | ƒj S(   Niÿÿÿÿ(   t   pdb_hierarchy_as_cif_blockRÏ   (   t   iotbx.pdb.mmcifR$  Rß   (   R$   RÏ   R$  (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyRÜ   ²  s    c         C   sp   d d  l  } | j j j ƒ  } | d  k r3 d } n  |  j d | ƒ | | <t | d ƒ } | | IJ| j ƒ  d  S(   Niÿÿÿÿt   phenixRÏ   R  (   RÛ   RÝ   R   R   RÜ   R   t   close(   R$   R  RÏ   t   data_block_nameR«   RÚ   t   f(    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyt   write_mmcif_file·  s    		
c         c   sé   xâ |  j  ƒ  D]Ô } xË | j ƒ  D]½ } t } x® | j ƒ  D]  } | pK | j } x‡ | j ƒ  D]y } xp | j ƒ  D]b } t d | d | j d | j d | j	 d | j
 d | j d | j d | d	 | ƒ 	Vt } t } qo Wq\ Wq9 Wq  Wq Wd
 S(   s~   
    Generator for atom_with_labels objects, presented in the same order as
    the array returned by the atoms() method.
    R   t   model_idt   chain_idt   resseqt   icodeRÃ   RÁ   t   is_first_in_chaint   is_first_after_breakN(   R§   R­   R†   R®   R¾   Ro   R   t   atom_with_labelsR   R-  R.  RÃ   RÁ   RŒ   (   R$   R   R   R/  R   R0  Rq   R   (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyR
  Å  s&    						c         C   s¢   |  j  ƒ  } t j | d ƒ } |  j ƒ  } d | k r? d } n d } t | j ƒ  ƒ } xD t | ƒ D]6 \ } } | d k r‚ qd n  | j | | | | ƒ qd W| S(   Ni    R&   i   (   RÄ   R   t   size_tt   altloc_indicest   sortedRY   t	   enumeratet   set_selected(   R$   t   n_seqt   conformer_indicesR3  t   pt   altlocst   iRÃ   (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyt   get_conformer_indicesÞ  s     	 c   	      C   s  d d l  m } d } | j ƒ  } xU t |  j ƒ  | ƒ D]> \ } } | d 7} | d d d | ƒ | _ | j d | ƒ q8 W|  j ƒ  | j ƒ  } } | | k rÿ x] | | D]N } | d 7} t d	 | d d d | ƒ ƒ } | j d | ƒ |  j d
 | ƒ qª Wn  d  S(   Niÿÿÿÿ(   t
   hy36encodei    i   t   widthi   t   valueR4   R   R   (	   R8   R=  R§   Rz   R   t   transfer_chains_from_otherR¯   R   R©   (	   R$   R4   R=  t   i_modelt   other_modelst   mdt   other_mdt   mszt   omsz(    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyR@  ê  s    "

c         C   s#   d d l  m } | d |  d | ƒ S(   Niÿÿÿÿ(   t   cachet   roott   special_position_settings(   t   iotbx.pdb.atom_selectionRG  (   R$   RI  RG  (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyt   atom_selection_cacheú  s    c         C   sµ   | r |  j  ƒ  j ƒ  } n |  j  ƒ  j d d d d ƒ } g  } xl |  j ƒ  D]^ } | d  k r‹ | j ƒ  rs d } n  | j ƒ  r‹ d } q‹ n  | j | j d | d | ƒ ƒ qL W~ | S(	   Nt   first_valuei    t	   incrementi   R/   R0   t   common_residue_name_class_onlyt   always_group_adjacent(	   R   t%   reset_tmp_for_occupancy_groups_simplet	   reset_tmpR­   R   t
   is_proteint   is_nat   extendt   occupancy_groups_simple(   R$   RN  RO  t   ignore_hydrogenst   sentinelR¸   R   (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyRU  ÿ  s    	c   
      C   s(  g  } | d k  r | Sx|  j  ƒ  D]ý } xô | j ƒ  D]æ } t j ƒ  } d } xŠ | j ƒ  D]| } | j ƒ  j ƒ  } t }	 | | k r› | j | ƒ t	 }	 n2 | j
 | ƒ t j ƒ  } | j | ƒ d } t	 }	 | d 7} q[ Wt | ƒ d k sô |	 r6 | j ƒ  d k st ‚ | j
 | ƒ q6 q6 Wq# W| S(   Ni   i    (   R§   R­   R   R2  R®   R   t   extract_i_seqR†   RT  RŒ   R(   R;   R   R¡   (
   R$   t   residues_per_chunkR¸   R   R   t   residue_range_selt   cntrR   t   i_seqst
   last_added(    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyt   chunk_selections  s.     	gffffffö?g      @c         C   sx   d d l  m } |  j ƒ  j ƒ  } | j ƒ  | j ƒ  } | j ƒ  } |  j ƒ  } | j d | d | d | d | d | ƒ S(   Niÿÿÿÿ(   t   distance_based_connectivityt
   sites_cartt   elementsR8  t   fallback_expected_bond_lengtht   fallback_search_max_distance(	   t   cctbx.crystalR_  R   t	   deep_copyt(   set_chemical_element_simple_if_necessaryt   extract_xyzt   extract_elementR<  t   build_simple_two_way_bond_sets(   R$   Rb  Rc  R_  R   R`  Ra  R8  (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyt'   distance_based_simple_two_way_bond_sets,  s    
	c         C   s8   |  j  ƒ  } | j ƒ  } | j d ƒ r4 | j ƒ  n  d  S(   Ni    (   R   RX  t   all_eqt   reset_i_seq(   R$   R   R\  (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyt   reset_i_seq_if_necessary<  s    c   
      C   s  t  j ƒ  } d d l } | j j } |  j ƒ  j ƒ  } | j ƒ  d k rd | d j d ƒ sd t	 ‚ n  x° |  j
 ƒ  D]¢ } x™ | j ƒ  D]‹ } x‚ | j ƒ  D]t } xk | j ƒ  D]] } | | j ƒ d k rª x? | j ƒ  D]. }	 |	 j j ƒ  d k rÒ | j |	 j ƒ qÒ qÒ Wqª qª Wq— Wq„ Wqq W| S(   sI   
    Extract atom selection (flex.size_t) for protein C-alpha atoms.
    iÿÿÿÿNi   i    R/   t   CA(   R   R2  R8   R£   R'   R   RX  R   t   all_neR¡   R§   R­   R®   Ro   RÁ   R6   R)   R(   t   i_seq(
   R$   R¸   R«   t	   get_classR\  R   R   R   Rq   R   (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyt   get_peptide_c_alpha_selectionB  s     *c         C   sB   x; |  j  ƒ  D]- } x$ |  j ƒ  D] } | j ƒ  r  t Sq  Wq Wt S(   sk   
    Inspect residue names (stored in atom_group objects) to determine if any of
    them are protein.
    (   R§   R­   RR  R†   RŒ   (   R$   R   R   (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyt   contains_proteinU  s
     c         C   sN   d d l  } x; |  j ƒ  D]- } x$ |  j ƒ  D] } | j ƒ  r, t Sq, Wq Wt S(   sn   
    Inspect residue names (stored in atom_group objects) to determine if any of
    them are RNA or DNA.
    iÿÿÿÿN(   R8   R§   R­   RS  R†   RŒ   (   R$   R«   R   R   (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyt   contains_nucleic_acid_  s     c         C   s¦   d d l  } | j j } x‡ |  j ƒ  D]y } xp | j ƒ  D]b } xY | j ƒ  D]K } xB | j ƒ  D]4 } | | j ƒ d k r^ d | j j ƒ  k r^ t	 Sq^ WqK Wq8 Wq% Wt
 S(   sg   
    Inspect residue names (stored in atom_group objects) to determine if any of
    them are RNA.
    iÿÿÿÿNR0   t   D(   R8   R£   R'   R§   R­   R®   Ro   RÁ   t   upperR†   RŒ   (   R$   R«   Rq  R   R   R   Rq   (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyt   contains_rnaj  s    c         C   sS  d } x-|  j  ƒ  D]} xô | j ƒ  D]æ } x» | j ƒ  D]­ } x‚ | j ƒ  D]t } xI | j ƒ  D]; } | j j ƒ  j ƒ  d k r_ | j | ƒ | d 7} q_ q_ W| j	 ƒ  d k rL | j
 | ƒ qL qL W| j ƒ  d k r9 | j | ƒ q9 q9 W| j ƒ  d k r& | j | ƒ q& q& W| j ƒ  d k r |  j | ƒ q q W| rO|  j ƒ  j ƒ  n  | S(   sa   
    Remove all hydrogen/deuterium atoms in-place.  Returns the number of atoms
    deleted.
    i    t   HRu  i   (   Rx  Ru  (   R§   R­   R®   Ro   R   t   elementR)   Rv  t   remove_atomRÄ   t   remove_atom_groupRÂ   t   remove_residue_groupR½   t   remove_chainR¼   t   remove_modelRl  (   R$   Rl  t	   n_removedt	   pdb_modelt	   pdb_chaint   pdb_residue_groupt   pdb_atom_groupt   pdb_atom(    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyt	   remove_hdz  s(    N(,   R   R   t   __doc__Rœ   R¬   R­   R®   Ro   R°   R±   R²   R³   R´   Rµ   R¶   R!   R   R»   Re   Rg   R†   RŒ   R   RÔ   RØ   Rá   Rã   R  R#  RÜ   R*  R
  R<  R@  RK  RU  R^  Rj  Rm  Rr  Rs  Rt  Rw  R…  (    (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyR�   Q  sˆ   					
								G(	.							
		c           B   sV   e  Z d  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z	 d „  Z
 RS(	   s‰  
  Class representing MODEL blocks in a PDB file (or equivalent mmCIF).  There
  will always be at least one of these in a hierarchy root extracted from a
  PDB file even if no MODEL records are present.

  Example
  -------
  >>> hierarchy = iotbx.pdb.hierarchy.root()
  >>> model = iotbx.pdb.hierarchy.model(id="1")
  >>> hierarchy.append_model(model)
  >>> model = hierarchy.only_model()
  c         c   s7   x0 |  j  ƒ  D]" } x | j ƒ  D] } | Vq  Wq Wd  S(   N(   R­   R®   (   R$   R   R   (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyR®   ¢  s    c         c   sN   xG |  j  ƒ  D]9 } x0 | j ƒ  D]" } x | j ƒ  D] } | Vq3 Wq  Wq Wd  S(   N(   R­   R®   Ro   (   R$   R   R   Rq   (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyRo   §  s    c         C   s&   |  j  ƒ  d k s t ‚ |  j ƒ  d S(   Ni   i    (   R¼   R¡   R­   (   R$   (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyR±   ­  s    c         C   s   |  j  ƒ  j ƒ  S(   N(   R±   R²   (   R$   (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyR²   ±  s    c         C   s   |  j  ƒ  j ƒ  S(   N(   R±   R³   (   R$   (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyR³   ´  s    c         C   s   |  j  ƒ  j ƒ  S(   N(   R²   R´   (   R$   (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyR´   ·  s    c         C   s   |  j  ƒ  j ƒ  S(   N(   R³   Rµ   (   R$   (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyRµ   º  s    c         C   s   |  j  ƒ  j ƒ  S(   N(   R´   R¶   (   R$   (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyR¶   ½  s    (   R   R   R†  R®   Ro   R±   R²   R³   R´   Rµ   R¶   (    (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyR�   ”  s   							c           B   sË   e  Z d  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z	 d e d „ Z d	 „  Z d
 d „ Z d
 e e d
 e d „ Z e e e d „ Z e e e d „ Z d e d „ Z d e d „ Z RS(   s­  
  Class representing a continuous chain of atoms, as defined by the combination
  of chain ID field and TER records (or the chain index in mmCIF format).  Note
  that this does not necessarily correspond to a covalently linked entity, as
  it may be used to group various heteroatoms (including water), but
  chemically distinct protein or nucleic acid chains will typically be
  grouped into exactly one chain object apiece.
  c         c   s7   x0 |  j  ƒ  D]" } x | j ƒ  D] } | Vq  Wq Wd  S(   N(   R®   Ro   (   R$   R   Rq   (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyRo   Ê  s    c         C   s&   |  j  ƒ  d k s t ‚ |  j ƒ  d S(   Ni   i    (   R½   R¡   R®   (   R$   (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyR²   Ï  s    c         C   s,   |  j  ƒ  } t | ƒ d k s$ t ‚ | d S(   Ni   i    (   t
   conformersR;   R¡   (   R$   R‡  (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyR³   Ó  s    c         C   s   |  j  ƒ  j ƒ  S(   N(   R²   R´   (   R$   (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyR´   Ø  s    c         C   s   |  j  ƒ  j ƒ  S(   N(   R³   Rµ   (   R$   (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyRµ   Û  s    c         C   s   |  j  ƒ  j ƒ  S(   N(   R´   R¶   (   R$   (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyR¶   Þ  s    c         C   s   |  j  ƒ  j ƒ  S(   N(   R³   t   residues(   R$   (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyRˆ  á  s    c            sQ  g  ‰ |  j  ƒ  ‰ t ˆ ƒ } t g | ‰  ‡  ‡ ‡ f d †  } x¼ |  j d | ƒ D]¨ \ } } t } d  } xa t | | ƒ D]P }	 ˆ |	 }
 t ˆ |	 j ƒ  ƒ } | d  k r¶ | } q{ | | k r{ t } q{ q{ W| rå | | | ƒ qS | rS | | | ƒ qS qS Wx5 t | ƒ D]' }	 ˆ  |	 r"qn  | |	 |	 d ƒ qWd „  } ˆ j | ƒ ˆ S(   Nc            sÁ  g  } i  } x+t  |  | ƒ D]} t ˆ  | <ˆ | } xý ˆ | j ƒ  D]ë } | j } | d k rÂ xÍ | j ƒ  D]L } | j d k  rŠ qo n  | j d k ro | j d k  ro | j | j ƒ qo qo WqG g  }	 x9 | j ƒ  D]+ } | j d k  rð qÕ n  |	 j | j ƒ qÕ Wt |	 ƒ d k rG | j	 | g  ƒ j
 |	 ƒ qG qG Wq W| j ƒ  } t | ƒ d k r™x | D] }	 |	 j ƒ  q_Wd „  }
 | j |
 ƒ ˆ j | ƒ n  x! | D] } ˆ j | g g ƒ q Wd  S(   NR&   i    i   c         S   s   t  |  d | d ƒ S(   Ni    (   t   cmp(   Rÿ   t   b(    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyt	   group_cmp  s    (   t   xrangeR†   Ro   RÃ   R   t   tmpt   occR(   R;   t
   setdefaultRT  t   valuest   sort(   t   i_begint   i_endt   isolated_var_occt   groupst   i_rgR   Rq   RÃ   R   t   groupR‹  R;  (   t   doneR®   R¸   (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyt   process_rangeê  s:    

	  $ 	RN  i   c         S   s   t  |  d d | d d ƒ S(   Ni    (   R‰  (   Rÿ   RŠ  (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyt
   groups_cmp  s    (	   R®   R;   RŒ   t   find_pure_altloc_rangesR†   R   RŒ  R‡  R‘  (   R$   RN  RO  t   n_rgR™  R’  R“  t   do_this_stept   ncR–  R   t   n_confRš  (    (   R˜  R®   R¸   sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyRU  ä  s6    
 	
 	c         C   sÞ   d d l  m } d d l  m } g  } t ƒ  } x¢ |  j ƒ  D]” } | j ƒ  d } | d | j d g  | j ƒ  D] } | j ^ qn ƒ } | j	 }	 | j
 |	 ƒ |	 d	 k r± d	 }
 n | d |	 ƒ }
 | |
 c d 7<q< W| | f S(
   så   
    Extract the residue names and counts of each residue type (protein,
    nucleic acid, etc) within the chain.

    :returns: a tuple containing a list of residue names, and a dictionary of
      residue type frequencies.
    iÿÿÿÿ(   R'   (   t(   residue_name_plus_atom_names_interpreteri    t   residue_namet
   atom_namesR6   i   N(   R8   R'   R   R	   R®   Ro   RÁ   R   R6   t   work_residue_nameR(   R   (   R$   R'   R   t   rn_seqt   residue_classesR   R   R   t   rnpanit   rnRc   (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyt   get_residue_names_and_classes   s     		%		t   Xc         C   sK  t  | t ƒ r! t | ƒ d k s' t ‚ |  j ƒ  \ } } | d } | d } g  } | | k rÖ d d l m } | j } | j }	 xÃ | D]G }
 |
 |	 k r¶ | j	 |	 j
 |
 | ƒ ƒ qˆ | j	 | j
 |
 | ƒ ƒ qˆ Wnq | d k rGxb | D]W }
 | j	 i d d 6d d 6d	 d	 6d
 d
 6d d 6d d 6d	 d 6d d 6j
 |
 d ƒ ƒ qé Wn  | S(   sË   
    Naively extract single-character protein or nucleic acid sequence, without
    accounting for residue numbering.

    :param substitute_unknown: character to use for unrecognized 3-letter codes
    i   R/   R0   iÿÿÿÿ(   t   amino_acid_codesi    t   At   Ct   Gt   Ut   DAt   DCt   DGt   Tt   DTt   N(   RŠ   R<   R;   R¡   R¨  R8   Rª  t   one_letter_given_three_lettert)   one_letter_given_three_letter_modified_aaR(   t   get(   R$   t   substitute_unknownR¤  R¥  t   n_aat   n_nat   seqRª  t	   aa_3_as_1t   aa_3_as_1_modR§  (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyt   as_sequence<  s4    

		 	c         C   sî   |  j  ƒ  } g  } d } d }	 d }
 xº t |  j ƒ  ƒ D]¦ \ }
 } | r^ | j d k r^ q7 n  | j ƒ  } | rÆ | | d k rÆ xC t | | d ƒ D]* } | d k r² | r² Pn  | j | ƒ q• Wn  | } | j | |
 ƒ q7 Wd j | ƒ S(   sž   
    Extract protein or nucleic acid sequence, taking residue numbering into
    account so that apparent gaps will be filled with substitute characters.
    i    R  i   R&   (   R¾  R5  R®   R.  t   resseq_as_intt   rangeR(   RA   (   R$   t   missing_chart   skip_insertionst   padR¸  t   pad_at_startR»  t
   padded_seqt   last_resseqt
   last_icodeR;  R   R-  t   x(    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyt   as_padded_sequence`  s"     c         C   sÕ   g  } d } d } x¼ t  |  j ƒ  ƒ D]¨ \ } } | rL t j d k rL q% n  | j ƒ  }	 | r´ |	 | d k r´ xC t |	 | d ƒ D]* }
 | d k r  | r  Pn  | j d  ƒ qƒ Wn  |	 } | j | j ƒ  ƒ q% W| S(   Ni    R  i   (	   R5  R®   t   residueR.  R¿  RÀ  R(   R   R   (   R$   RÂ  RÃ  RÄ  t   residsRÆ  RÇ  R;  R   R-  RÈ  (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyt   get_residue_idsw  s     c         C   sÙ   g  } d } d } xÀ t  |  j ƒ  ƒ D]¬ \ } } | rL t j d k rL q% n  | j ƒ  }	 | r´ |	 | d k r´ xC t |	 | d ƒ D]* }
 | d k r  | r  Pn  | j d  ƒ qƒ Wn  |	 } | j | j ƒ  d ƒ q% W| S(   Ni    R  i   (	   R5  R®   RÊ  R.  R¿  RÀ  R(   R   t   unique_resnames(   R$   RÂ  RÃ  RÄ  RX   RÆ  RÇ  R;  R   R-  RÈ  (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyt   get_residue_names_padded‡  s     gš™™™™™é?c         C   sµ   |  j  ƒ  \ } } | d } | d } | rX x) | j d ƒ d k rT | j d ƒ q/ Wn  t | ƒ d k rn t S| | k r” | t | ƒ | k r” t S| d g t | ƒ k r± t St S(   st   
    Determine whether the chain represents an amino acid polymer, based on the
    frequency of residue names.
    R/   R0   t   HOHi    t   UNK(   R¨  R  t   removeR;   RŒ   R†   (   R$   t   min_contentt   ignore_waterR¤  R¥  R¹  Rº  (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyRR  ˜  s    

"c         C   s˜   |  j  ƒ  \ } } | d } | d } | rX x) | j d ƒ d k rT | j d ƒ q/ Wn  t | ƒ d k rn t S| | k r” | t | ƒ | k r” t St S(   sr   
    Determine whether the chain represents a nucleic acid polymer, based on the
    frequency of base names.
    R/   R0   RÏ  i    (   R¨  R  RÑ  R;   RŒ   R†   (   R$   RÒ  RÓ  R¤  R¥  R¹  Rº  (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyRS  «  s    

"N(   R   R   R†  Ro   R²   R³   R´   Rµ   R¶   Rˆ  R   R†   RU  R¨  R¾  RŒ   RÉ  RÌ  RÎ  RR  RS  (    (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyR�   À  s$   							;	$c           B   s#   e  Z d  „  Z d „  Z d „  Z RS(   c         C   s&   |  j  ƒ  d k s t ‚ |  j ƒ  d S(   Ni   i    (   RÂ   R¡   Ro   (   R$   (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyR´   ¾  s    c         C   s   |  j  ƒ  j ƒ  S(   N(   R´   R¶   (   R$   (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyR¶   Â  s    c         C   sA   d } |  j  ƒ  } | d  k	 r* | j } n  d | |  j |  j f S(   NR&   s	   %2s%4s%1s(   R   R   R   R-  R.  (   R$   R,  R   (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyR  Å  s
    (   R   R   R´   R¶   R  (    (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyR�   ¼  s   		c           B   s2   e  Z d  „  Z d „  Z d d „ Z e d „ Z RS(   c         C   s&   |  j  ƒ  d k s t ‚ |  j ƒ  d S(   Ni   i    (   RÄ   R¡   R   (   R$   (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyR¶   Î  s    c         C   s4   x- |  j  ƒ  D] } | j j ƒ  | k r | Sq Wd S(   s®   
    Extract the child atom with the given (unaligned) name.

    :param name: atom name, explicit case but no spaces.
    :returns: atom object if found, otherwise None
    N(   R   R6   R)   R   (   R$   R6   R   (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyt   get_atomÒ  s    c         C   sq   d } d } |  j  ƒ  } | d  k	 rW | j ƒ  } | j  ƒ  } | d  k	 rW | j } qW n  d |  j |  j | | f S(   NR&   s   %1s%3s%2s%5s(   R   R   R   R   RÃ   RÁ   (   R$   t   suppress_segidR,  R   R   R   (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyR  ß  s    c         C   s„   |  j  ƒ  j ƒ  } t | ƒ d k s* t ‚ | j ƒ  } | j | j k r} | r} t d d |  j ƒ  | j | j f ƒ ‚ q} n  | j	 S(   su   
    Calculate the mean occupancy for atoms in this group, with option of
    raising ValueError if they differ.
    i    s*   Non-uniform occupancies for atom group %s s   (range: %.2f - %.2f).(
   R   t   extract_occR;   R¡   t   min_max_meant   minRR   R»   R  t   mean(   R$   t   raise_error_if_non_uniformt   atom_occupanciesR×  (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyRî   ê  s    N(   R   R   R¶   RÔ  R   R  RŒ   Rî   (    (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyR�   Ì  s   		c           B   s2   e  Z d  Z d „  Z d „  Z d „  Z d „  Z RS(   s  
  The basic unit of the PDB hierarchy (or the PDB input object in general),
  representing a single point scatterer corresponding to an ATOM or HETATM
  record in PDB format (plus associated ANISOU or related records if present).
  Note that this does not directly store attributes of higher-level entities
  whose identity is also recorded in ATOM records, such as the chain ID or
  residue name.  These may be retrieved either by walking up the hierarchy
  starting with atom.parent(), or by calling atom.fetch_labels().
  c         C   sA   |  j  ƒ  } | d k	 r= | j  ƒ  } | d k	 r= | j  ƒ  Sn  d S(   sr   
    Convenience method for fetching the chain object associated with this
    atom (or None of not defined).
    N(   R   R   (   R$   Rq   R   (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyR     s    c   	      C   s¡   |  j  d t ƒ } | j  d t ƒ } | j } | j } t | ƒ d k rj t | ƒ d k rj | | k rj t Sd „  } | | ƒ } | | ƒ } | j ƒ  | j ƒ  k S(   s²   
    Indicate whether two atoms are part of the same conformer and thus are
    capable of interacting directly, as defined by the parent atom_group and
    model object(s).
    t   optionali    c         S   s(   |  j  d t ƒ j  d t ƒ j  d t ƒ S(   NRÜ  (   R   RŒ   (   Rq   (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyt   p3  s    (   R   RŒ   RÃ   R;   R{   (	   R$   R4   t   ag_it   ag_jt   altloc_it   altloc_jRÝ  t   model_it   model_j(    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyt   is_in_same_conformer_as  s    			c         C   sÓ   d d l  m } | d | d t ƒ \ } } |  j j ƒ  |  j j ƒ  } t | ƒ d k r¯ | d k ru | d k ru t S| d | d t ƒ \ } } | | k r¯ | | k r¯ t Sn  d | j ƒ  |  _ d | |  _ t S(	   Niÿÿÿÿ(   t   get_element_and_charge_symbolsR  t   exacti    R&   s   %2ss   %-2s(	   t   cctbx.eltbx.xray_scatteringRå  RŒ   Ry  R)   t   chargeR;   Rv  R†   (   R$   R  t   gect   sct_et   sct_ct   pdb_ect   pdb_et   pdb_c(    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyt8   set_element_and_charge_from_scattering_type_if_necessary%  s    c         C   sk   |  j  ƒ  } | d k r d S| j d ƒ r4 d } n d } | j d ƒ } | d k rc | t | ƒ Sd Sd S(   sq   
    Extract the atomic charge from the (string) charge field.

    :returns: Python int, defaulting to zero
    i    Ry   iÿÿÿÿi   s    -+R&   N(   t   charge_tidyR   t   endswithR)   t   int(   R$   Rè  t   sign(    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyt   charge_as_int7  s    	(   R   R   R†  R   Rä  Rï  Rô  (    (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyR�   ù  s
   				c           B   s§   e  Z d  Z d „  Z d „  Z d „  Z d d „ Z d d „ Z d d „ Z d	 d
 „ Z	 d e
 e d e d „ Z d e e d „ Z e
 e e d „ Z e
 e e d „ Z RS(   s¸   
  Alternate view into a chain object, grouping sequential residues with
  equivalent altlocs.  As a general rule it is preferrable to iterate over
  chain.residue_groups() instead.
  c         C   s,   |  j  ƒ  } t | ƒ d k s$ t ‚ | d S(   Ni   i    (   Rˆ  R;   R¡   (   R$   Rˆ  (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyRµ   P  s    c         C   s   |  j  ƒ  j ƒ  S(   N(   Rµ   R¶   (   R$   (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyR¶   U  s    c         C   s–   d d l  m } g  } t ƒ  } xj |  j ƒ  D]\ } | j ƒ  } | j } | j | ƒ | d  k ri d  } n | d | ƒ } | | c d 7<q, W| | f S(   Niÿÿÿÿ(   R'   R6   i   (   R8   R'   R	   Rˆ  R   R£  R(   R   (   R$   R'   R¤  R¥  RÊ  R¦  R§  Rc   (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyR¨  X  s    			gš™™™™™é?c         C   sP   |  j  ƒ  \ } } | d } | d } | | k rL | t | ƒ | k rL t St S(   NR/   R0   (   R¨  R;   R†   RŒ   (   R$   RÒ  R¤  R¥  R¹  Rº  (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyRR  j  s    

"c         C   sP   |  j  ƒ  \ } } | d } | d } | | k rL | t | ƒ | k rL t St S(   NR/   R0   (   R¨  R;   R†   RŒ   (   R$   RÒ  R¤  R¥  R¹  Rº  (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyRS  s  s    

"R©  c         C   sK  t  | t ƒ r! t | ƒ d k s' t ‚ |  j ƒ  \ } } | d } | d } g  } | | k rÖ d d l m } | j } | j }	 xÃ | D]G }
 |
 |	 k r¶ | j	 |	 j
 |
 | ƒ ƒ qˆ | j	 | j
 |
 | ƒ ƒ qˆ Wnq | d k rGxb | D]W }
 | j	 i d d 6d d 6d	 d	 6d
 d
 6d d 6d d 6d	 d 6d d 6j
 |
 d ƒ ƒ qé Wn  | S(   Ni   R/   R0   iÿÿÿÿ(   Rª  i    R«  R¬  R­  R®  R¯  R°  R±  R²  R³  R´  (   RŠ   R<   R;   R¡   R¨  R8   Rª  Rµ  R¶  R(   R·  (   R$   R¸  R¤  R¥  R¹  Rº  R»  Rª  R¼  R½  R§  (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyR¾  |  s4    

		 	iO   c   	      C   sã   |  j  ƒ  } t | ƒ } | d k r( d  Sd g } |  j ƒ  } | d  k	 r` | j d | j ƒ n  | j d |  j ƒ d j | ƒ g } d } xP t rÞ t	 | | | ƒ } | | k r¸ Pn  | j d j | | | !ƒ ƒ | } q� W| S(   Ni    t   >s   chain "%2s"s   conformer "%s"R  R&   (
   R¾  R;   R   R   R(   R   RÃ   RA   R†   RØ  (	   R$   t   max_line_lengthR»  Rw   t   commentR9  R¸   R;  t   j(    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyt   format_fasta�  s$     		 
c         C   sî   |  j  ƒ  } g  } d } d }	 d }
 xº t |  j ƒ  ƒ D]¦ \ }
 } | r^ | j d k r^ q7 n  | j ƒ  } | rÆ | | d k rÆ xC t | | d ƒ D]* } | d k r² | r² Pn  | j | ƒ q• Wn  | } | j | |
 ƒ q7 Wd j | ƒ S(   Ni    R  i   R&   (   R¾  R5  Rˆ  R.  R¿  RÀ  R(   RA   (   R$   RÁ  RÂ  RÃ  R¸  RÄ  R»  RÅ  RÆ  RÇ  R;  RÊ  R-  RÈ  (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyRÉ  ¯  s"     c         C   s%  g  } d } x	t  |  j ƒ  ƒ D]õ \ } }	 |	 j ƒ  }
 | r“ |
 | d k r“ xC t |
 | d ƒ D]* } | d k r | r Pn  | j | ƒ qb Wn  t } x\ |	 j ƒ  D]N } | | j rÐ | j d ƒ t } Pq¦ | | j r¦ | j d ƒ t } Pq¦ q¦ W| s| j d ƒ n  |
 } q Wd j	 | ƒ S(   Ni    i   Rx  t   St   LR&   (
   R5  Rˆ  R¿  RÀ  R(   RŒ   R   Rp  R†   RA   (   R$   t
   helix_selet
   sheet_seleRÁ  RÃ  RÄ  t   ss_seqRÆ  R;  RÊ  R-  RÈ  t   foundR   (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyt   as_sec_str_sequenceÅ  s.     
c         C   sÕ   g  } d } d } x¼ t  |  j ƒ  ƒ D]¨ \ } } | rL | j d k rL q% n  | j ƒ  }	 | r´ |	 | d k r´ xC t |	 | d ƒ D]* }
 | d k r  | r  Pn  | j d  ƒ qƒ Wn  |	 } | j | j ƒ  ƒ q% W| S(   Ni    R  i   (   R5  Rˆ  R.  R¿  RÀ  R(   R   R   (   R$   RÂ  RÃ  RÄ  RË  RÆ  RÇ  R;  RÊ  R-  RÈ  (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyRÌ  Þ  s     c         C   sÒ   g  } d } d } x¹ t  |  j ƒ  ƒ D]¥ \ } } | rL | j d k rL q% n  | j ƒ  }	 | r´ |	 | d k r´ xC t |	 | d ƒ D]* }
 | d k r  | r  Pn  | j d  ƒ qƒ Wn  |	 } | j | j ƒ q% W| S(   Ni    R  i   (   R5  Rˆ  R.  R¿  RÀ  R(   R   RÁ   (   R$   RÂ  RÃ  RÄ  RX   RÆ  RÇ  R;  RÊ  R-  RÈ  (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyRÎ  ñ  s     (   R   R   R†  Rµ   R¶   R¨  RR  RS  R¾  Rù  RŒ   R†   RÉ  R   RÌ  RÎ  (    (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyR�   J  s   					!c           B   s2   e  Z d  „  Z d „  Z d „  Z d e d „ Z RS(   c   
      C   s=  |  j  ƒ  } | d  k r6|  j ƒ  } | d  k	 s6 t ‚ | j ƒ  } | d  k	 sT t ‚ | j ƒ  } | d  k	 sr t ‚ t d | j d |  j ƒ } t d |  j d |  j	 ƒ } t
 d | j ƒ } t d | j ƒ } t  ƒ  } | j | ƒ | j | ƒ | j | ƒ | j | ƒ x* |  j ƒ  D] }	 | j |	 j ƒ  ƒ qWn  | f S(   NRÃ   RÁ   R-  R.  R   (   RH  R   R   R¡   R   RÃ   RÁ   R   R-  R.  R   R   R   R©   t   append_chaint   append_residue_groupt   append_atom_groupR   t   append_atomt   detached_copy(
   R$   t   result_roott   orig_conformert
   orig_chaint
   orig_modelt   result_atom_groupt   result_residue_groupt   result_chaint   result_modelR   (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyt   __getinitargs__	  s,    	c         C   s   t  d |  j ƒ  d ƒ S(   NRH  i    (   RÊ  R  (   R$   (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyt   standalone_copy!  s    c         C   s&   |  j  ƒ  d k s t ‚ |  j ƒ  d S(   Ni   i    (   RÄ   R¡   R   (   R$   (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyR¶   $  s    c      	   C   sN   d d l  m } | d |  j d g  |  j ƒ  D] } | j ^ q, d | d | ƒ S(   Niÿÿÿÿ(   R   R¡  R¢  t#   translate_cns_dna_rna_residue_namest   return_mon_lib_dna_name(   R8   R   RÁ   R   R6   (   R$   R  R  R   R   (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyR   (  s    	"N(   R   R   R  R  R¶   R   RŒ   R   (    (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyR�     s
   			c           B   s)   e  Z d  Z d „  Z d „  Z d „  Z RS(   s“   
  Stand-in for atom object, which explicitly records the attributes normally
  reserved for parent classes such as residue name, chain ID, etc.
  c         C   sm   i  } x` d d d d d d d d d	 d
 d d d d d d d d d d g D] } t  |  | d  ƒ | | <qI W| S(   Nt   xyzt   sigxyzRŽ  t   sigoccRŠ  t   sigbt   uijR—   t   heterot   serialR6   t   segidRy  Rè  R+  R,  R-  R.  RÃ   RÁ   (   t   getattrR   (   R$   t   labels_dictt   attr(    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyRœ   7  s    c         C   s-   d d l  m } t | ƒ } | |  | � d  S(   Niÿÿÿÿ(   t   make_atom_with_labels(   R8   R  t   dict(   R$   Rª   R  (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyR¬   @  s    c         C   s   |  S(   N(    (   R$   (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyt   fetch_labelsE  s    (   R   R   R†  Rœ   R¬   R  (    (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyR�   2  s   			t   input_hierarchy_pairc           B   sJ   e  Z d d  „ Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z	 RS(   c         C   s:   | |  _  | d  k r- |  j  j d t ƒ } n  | |  _ d  S(   Nt   set_atom_i_seq(   R¤   R   R¦   R†   t	   hierarchy(   R$   R¤   R"  (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyR%   J  s    	c         C   s   d d l  m } | ‚ d  S(   Niÿÿÿÿ(   t   PicklingError(   Rž   R#  (   R$   R#  (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyR  P  s    c         C   s:   |  j  j ƒ  } | j d d d d ƒ } |  j j ƒ  j ƒ  S(   sÁ   
    Return the permutation selection
    (:py:class:`scitbx.array_family.flex.size_t`) mapping the atoms as ordered
    by the hierarchy to their original positions in the PDB/mmCIF file.
    RL  i    RM  i   (   R"  R   RQ  R¤   t   extract_tmp_as_size_t(   R$   t   h_atomsRW  (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyt#   hierarchy_to_input_atom_permutationT  s    c         C   s:   |  j  j ƒ  } | j d d d d ƒ } |  j j ƒ  j ƒ  S(   sÁ   
    Return the permutation selection
    (:py:class:`scitbx.array_family.flex.size_t`) mapping the atoms as ordered
    in the original PDB/mmCIF file to their positions in the hierarchy.
    RL  i    RM  i   (   R¤   R   RQ  R"  R$  (   R$   t   i_atomsRW  (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyt#   input_to_hierarchy_atom_permutation^  s    c         O   s.   |  j  ƒ  } |  j j | | Ž  } | j | ƒ S(   s®   
    Wrapper for the equivalent method of the input object - extracts the
    :py:class:`cctbx.xray.structure` with scatterers in the same order as in
    the hierarchy.
    (   R(  R¤   Râ   t   select(   R$   t   argst   kwdst   permt   xrs(    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyRâ   h  s    c         O   s   t  j d t ƒ |  j S(   s•   
    Returns a reference to the existing hierarchy.  For backwards compatibility
    only, and issues a :py:class:`warnings.DeprecationWarning`.
    s'   Please access input.hierarchy directly.(   Ri   t   warnt   DeprecationWarningR"  (   R$   R*  R+  (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyR¦   r  s    	c         O   s   |  j  j | | Ž  S(   N(   R¤   RÏ   (   R$   R*  R+  (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyRÏ   {  s    N(
   R   R   R   R%   R  R&  R(  Râ   R¦   RÏ   (    (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyR   H  s   		
	
	
		R¤   c           B   s    e  Z d  Z d d e d „ Z RS(   s  
  Class used for reading a PDB hierarchy from a file or string.

  Attributes
  ----------
  input : iotbx.pdb.pdb_input_from_any
  hierarchy : iotbx.pdb.hierarchy.root

  Examples
  --------
  >>> import iotbx.pdb.hierarchy
  >>> pdb_in = iotbx.pdb.hierarchy.input(pdb_string='''
  ... ATOM      1  N   ASP A  37      10.710  14.456   9.568  1.00 15.78           N
  ... ATOM      2  CA  ASP A  37       9.318  14.587   9.999  1.00 18.38           C
  ... ''')
  >>> print pdb_in.hierarchy.atoms_size()
  2
  "")
  c         C   s¹   | | g j  d ƒ d k s! t ‚ d d l } | d k	 rc | t k sK t ‚ | j j d | ƒ } n9 | t k rx d } n  | j j d | d t j | ƒ ƒ } t	 t |  ƒ j
 d | ƒ d S(	   sì   
    Initializes an input from a file or string.

    Parameters
    ----------
    file_name : str, optional
    pdb_string : str, optional
    source_info : str, optional
        Indicates where this PDB came from (i.e. "string")
    i   iÿÿÿÿNR  t   stringR�   RŸ   R¤   (   R  R   R¡   R8   R   R£   R¤   R   R¥   t   superR%   (   R$   R  R›   R�   R«   R×   (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyR%   “  s    ! 	N(   R   R   R†  R   R   R%   (    (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyR¤   ~  s   t   show_summaryc           B   s/   e  Z d d d d  e e d d d e d „
 Z RS(   R&   i
   c      	   C   s§   t  j |  d | d | ƒ| | |  j  j ƒ  IJ|  j j ƒ  |  _ |  j j d | d | d d | d | ƒ |	 d  k	 r£ |  j j d | d | d d |	 d	 |
 ƒ n  d  S(
   NR  R›   R   R   s     R_   R`   RÅ   RÆ   (   R¤   R%   R�   R"  R!   Re   R   (   R$   R  R›   R   R   R+   R-   R_   R`   RÅ   RÆ   (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyR%   «  s    

N(   R   R   R   R†   R»   R%   (    (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyR2  ©  s   c         C   s¯   | t  k r d } n  t |  ƒ t | ƒ k s3 t ‚ xu t |  | ƒ D]d \ } } xU | j ƒ  D]G } x> | j ƒ  D]0 } t | j ƒ d k s� t ‚ | j | 7_ qo Wq\ WqC Wd  S(   Nt=   123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzi   (   R   R;   R¡   Rz   R§   R­   R   (   t   rootst   suffixesRH  t   suffixR   R   (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyt   append_chain_id_suffixesÅ  s    	c         C   sP   | d k	 r" t d |  d | ƒ n  t ƒ  } x |  D] } | j d | ƒ q2 W| S(   s   
  Combine two root objects.
  R4  R5  R4   N(   R   R7  RH  R@  (   R4  t   chain_id_suffixesR¸   t   rt(    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyt
   join_rootsÑ  s    	c         C   sT   d d l  } | j j j ƒ  } | j j j ƒ  } | j |  j ƒ  ƒ | j | ƒ | S(   ss   
  Given a chain object, create an entirely new hierarchy object contaning only
  this chain (using a new copy).
  iÿÿÿÿN(   t   iotbx.pdb.hierarchyR£   R"  RH  R   R  R  R©   (   R   R«   R"  R   (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyt   new_hierarchy_from_chainÝ  s    c   	      C   s  x|  j  ƒ  D]ö } xí | j  ƒ  D]ß } | j | j k r  d } x¾ | t | j ƒ  ƒ k  rû | j ƒ  | } d } x| | t | j ƒ  ƒ k  rí | j ƒ  | } | j | j k rà | j | ƒ | j | | j ƒ  ƒ | j | ƒ Pn  | d 7} qr W| d 7} qA Wq  q  Wq Wd S(   s‚  
  Delete and replace the first chain in the original hierarchy corresponding
  to each model/ID combination in the partial hierarchy.  Note that this means
  that if waters and heteroatoms are given the same ID as a protein chain
  (separated by other chains or TER record(s)), but the partial hierarchy only
  contains a substitute protein chain, the heteroatom chain will be kept.
  i    i   N(   R§   R   R;   R­   R}  t   insert_chainR  (	   t   original_hierarchyt   partial_hierarchyt   logt   original_modelt   partial_modelR;  t   original_chainRø  t   partial_chain(    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyt   find_and_replace_chainsé  s     	c         C   s£  t  |  j ƒ  ƒ d k s t ‚ g  } xx|  j ƒ  d j ƒ  D]`} g  } d  } d  } t j } xš | j ƒ  D]Œ } | j ƒ  } | j	 ƒ  }	 | | k rÕ | | d k rÕ | d  k	 rÆ | j
 | | f ƒ n  |	 } |	 } n | d  k rê |	 } n  |	 } | } qj W| d  k	 r| j
 | | f ƒ n  g  }
 xK | D]C \ } } | | k rU|
 j
 d | ƒ q)|
 j
 d | | f ƒ q)Wd d j |
 ƒ d | j } | j
 | ƒ q; W| S(   Ni   i    s   resid %ss   resid %s through %ss   chain '%s' and ((s   ) or (s   ))(   R;   R§   R¡   R­   R   R9   t   maxintR®   R¿  R   R(   RA   R   (   R"  t   chain_clausesR   t   resid_rangest   start_residt
   last_residRÆ  R   R-  R   t   resid_clausest   r1t   r2t   sele(    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyt   get_contiguous_ranges  s<    
		

c         C   sè  d d l  m } d d  l  } d d l m } | j j ƒ  } | j | j j j ƒ  ƒ |  d  k	 rÄ t
 j ƒ  } | j d |  ƒ } | j t
 j | j ƒ  ƒ ƒ | j j d |  d | ƒ } | j ƒ  } n  | d  k	 sÖ t ‚ | j ƒ  }	 t |	 ƒ d k rø d S|	 d j ƒ  }
 t |
 ƒ d k rd Sd } d } d } x¨ |
 D]  } d } x‘ | j ƒ  d j ƒ  D]y } | j j ƒ  | k r±| d	 7} | j ƒ  } | | d	 k r¨| d	 7} n  | } qZ| j j ƒ  d k rZ| d	 7} qZqZWq7W| | | f S(   Niÿÿÿÿ(   Rª  (   t
   smart_openR  R�   RŸ   i    iüÿÿi   RÏ  t   WATt   H2O(   i    i    i    (   i    i    i    (   s   HOHRQ  RR  (   R8   Rª  t   libtbxRP  Rµ  RY   RT  R£   t   cns_dna_rna_residue_namesR   R   t
   std_stringt   for_readingR¥   t   readR¤   R¦   R¡   R§   R;   R­   R‡  Rˆ  RÁ   R)   R¿  (   t   pdb_fileRÕ   Rª  R«   RP  t   covalent_residuest   raw_recordsR)  t   pdb_inR§   R­   t   n_rest   n_fragt   n_h2oR   R;  t   resR-  (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyt   get_residue_and_fragment_count)  sB    
	c         C   sŠ  | d k r t ƒ  } n  i  } t j | j ƒ  j ƒ  d ƒ } xc |  j ƒ  D]U } | j d k rj | rj qI n  | j ƒ  } | | k r‘ t	 d ƒ ‚ n  | j
 | | <qI Wx´ t | j ƒ  ƒ D]  \ }	 } | j d k rÜ | rÜ qµ n  | j ƒ  } | | k rµ | | \ }
 } } | j
 \ } } } t j | |
 d | | d | | d ƒ } | | |	 <qµ qµ W| r‚| j ƒ  } | j ƒ  j | ƒ | S| Sd S(	   sÑ   
  Given two PDB hierarchies, calculate the shift of each atom (accounting for
  possible insertions/deletions) and (optionally) apply it to the B-factor for
  display in PyMOL, plotting in PHENIX GUI, etc.
  g      ð¿RÏ  RQ  s.   Duplicate atom ID - can't extract coordinates.i   N(   s   HOHs   WAT(   s   HOHs   WAT(   R   R   R   t   doubleR   R   R
  RÁ   R  R¢   R  R5  t   matht   sqrtRe  Rð   (   t   hierarchy_1t   hierarchy_2t   exclude_waterst   return_hierarchyR@  t   atom_lookupt   deltasR   t   atom_idRp  t   x1t   y1t   z1t   x2t   y2t   z2t   deltat   hierarchy_new(    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyt
   sites_diffL  s2    
 /c         C   s  | } | d  k r t ƒ  } n  t | j ƒ t | j ƒ k sB t ‚ t | j ƒ d k rf t d ƒ ‚ n  t |  j ƒ  ƒ d k r� t d ƒ ‚ n  t ƒ  } t	 ƒ  } | j
 | ƒ xj |  j ƒ  d j ƒ  D]R } | j ƒ  } | j ƒ  }	 | rx |	 D] }
 |
 j d ƒ qî Wn  | j | ƒ qÃ W| d t | j ƒ IJxä t | j | j | j | j ƒ D]Á \ } } } } | r~| d | IJqRn  x’ |  j ƒ  d j ƒ  D]z } | j ƒ  } | j ƒ  }	 | rÞx" |	 D] }
 |
 j d | ƒ qÀWn  |	 j ƒ  } |	 j | j | | ƒ | j | ƒ q•WqRW| S(	   Ni    s#   No MTRIX records found in PDB file!i   s$   Multi-MODEL PDB files not supported.t   0s   Applying %d MTRIX records...s1     skipping matrix %s, coordinates already presents   %s(   R   R   R;   t   rt   tR¡   R   R§   RH  R   R©   R­   R  R   t	   set_segidR  Rz   t   serial_numbert   coordinates_presentRg  Rë   t   elems(   RÕ   t   processed_mtrix_recordst   write_segidR@  t   pmrRr  t	   model_newt   chain_t	   chain_newt	   atoms_tmpR   t   rmt   tvt   snt   cpfR  (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyt
   expand_ncsp  sD     $		c         C   sþ  | d k r t ƒ  } n  d d l m } d d l m } | j ƒ  j ƒ  }	 t j	 ƒ  }
 t j	 ƒ  } | |  j
 ƒ } | t k rŒ | d k } n  d d d d g } x± t |  j ƒ  ƒ D]� \ } } | j d	 k rØ | rØ q± n  | rü | rü | j | k rü q± qü n  xO t | j ƒ  ƒ D]; \ } } | j | j k r|
 j | ƒ | j | ƒ qqWq± W|  j ƒ  j ƒ  j |
 ƒ } |	 j ƒ  j | ƒ } t | ƒ t | ƒ k s t ‚ | j d
 | d | ƒ } |	 j ƒ  } | j j | | j j } |	 j | ƒ g  } | r| r| d g } n  i  } t j |  j ƒ  j ƒ  ƒ } xC |  j ƒ  D]5 } | j | k r;|  j | ƒ | j | | j <q;q;Wxw |	 D]o } | j | k r{| j d k s¦| r{| sÚ| j | k rÎ| | j | _ qÚ| | _ n  |  j | ƒ q{q{W| j
 |  _
 |  S(   sƒ   
  Substitute the sidechain atoms from one residue for another, using
  least-squares superposition to align the backbone atoms.
  iÿÿÿÿ(   R'   (   t	   superposeR/   s    CA s    C  s    N  s    CB s    Ht   reference_sitest   other_sitess    O  s   H N(   R   R   R8   R'   t   scitbx.mathR‡  R  R   R   R2  RÁ   R   R5  Ry  R6   R(   Rg  R)  R;   R¡   t   least_squares_fitRu  Rz  Rv  Rë   RR   t	   extract_bRz  RŠ  R  (   t   current_groupt	   new_groupt   backbone_onlyt   exclude_hydrogenst   ignore_b_factorst   is_amino_acidR@  R'   R‡  t	   new_atomst   selection_fixedt   selection_movingt	   res_classt   backbone_atomsRp  R   t   j_seqt
   other_atomt   sites_fixedt   sites_movingt   lsq_fitt	   sites_newt
   keep_atomst
   atom_b_isot   max_b(    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyt   substitute_atom_group—  sb     			(9   t
   __future__R    t   boost.pythont   boostt   pythont
   import_extt   extR   t   cctbx.array_familyR   t   libtbx.str_utilsR   t   libtbx.utilsR   R   R   RS  R   R	   t	   cStringIOR
   Ri   Rb  R9   t   objectR   R¹   R    R!   R‡   t   injectorRH  R�   R   R   R   R   R   t	   conformerRÊ  R1  R   R¤   R2  R7  R:  R<  R:   RE  RO  R   R`  R†   Rs  R†  RŒ   R¡  (    (    (    sA   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/pdb/hierarchy.pyt   <module>   s^   
	ÿ %ÿ ÿ E%,%ü%%-%Q"½"+"6+		#%#&