ó
»™xTc           @   sw  d  d l  m Z d  d l m Z m Z d  d l m Z d  d l m Z d  d l	 m
 Z
 d  d l m Z m Z d  d l m Z d  d l m Z d  d	 l Z d  d	 l Z d  d	 l Z d  d	 l Z d
 e f d „  ƒ  YZ d	 d „ Z d	 d „ Z d	 d	 d	 d	 d „ Z d	 d	 d	 d	 d	 d	 d	 d „ Z d „  Z d	 d „ Z e e e 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" „  Z0 d# „  Z1 d	 d$ „ Z2 d% „  Z3 d& „  Z4 d' „  Z5 d( „  Z6 d) „  Z7 d* „  Z8 e e e d+ „ Z9 d	 d	 d, „ Z: d- d. d/ „ Z; d0 „  Z< e d1 „ Z= d	 e d2 „ Z> d	 S(3   iÿÿÿÿ(   t   division(   t   format_exceptiont   Sorry(   t   Auto(   t   common_residue_names_get_class(   t   c_beta(   t   amino_acid_codest   input(   t   flex(   t
   group_argsNt   alignment_managerc           B   s   e  Z e d d  „ Z RS(   c         C   s€  | d  k r t j } n  i  |  _ i  |  _ i  |  _ | j ƒ  } | j ƒ  d j ƒ  } x$t	 | ƒ D]\ } } t
 } x: | j ƒ  D], }	 |	 j ƒ  r§ |	 j ƒ  r§ q� q� t } q� W| s½ qb n  t | ƒ }
 |
 d  k rì | d | j IJqb n  | rd | j |
 f } n d | j } | g } t d | d | ƒ } t d | d | ƒ \ } } } | |  j | <| |  j | <| |  j | <qb Wd  S(	   Ni    s0   chain %s has conflicting segid values - skippings   chain '%s' and segid '%s's
   chain '%s't   cachet   string_listt   pdb_hierarchyt	   selection(   t   Nonet   syst   stdoutt	   sequencest   padded_sequencest
   structurest   atom_selection_cachet   modelst   chainst	   enumeratet   Falset
   conformerst
   is_proteint   is_nat   Truet   get_unique_segidt   idt'   phil_atom_selections_as_i_seqs_multiplet   extract_sequence_and_sites(   t   selfR   t	   use_segidt   logt	   sel_cacheR   t   it   chain_it   found_conformert	   conformert   segidt   chain_i_strt   chain_i_listt   sel_atoms_it	   chain_seqt   chain_seq_paddedt   chain_structures(    (    sL   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/torsion_restraints/utils.pyt   __init__   sD     			
		N(   t   __name__t
   __module__R   R   R1   (    (    (    sL   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/torsion_restraints/utils.pyR
      s   c         C   s„   | d  k r t j } n  |  j j d  k r€ | d IJt j d | ƒ } | |  j _ t |  j j _ | d It	 |  j j ƒ IJn  d  S(   Ns#   Adding C-beta torsion restraints...R   s   num c-beta restraints: (
   R   R   R   t   generic_restraints_managert   c_beta_dihedral_proxiesR   t   get_c_beta_torsion_proxiesR   t   flagst   len(   t   geometryR   R$   t   c_beta_torsion_proxies(    (    sL   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/torsion_restraints/utils.pyt   add_c_beta_restraints;   s    

c         C   s–   | d  k r t j } n  g  } xq |  D]i } t | ƒ } | j ƒ  } | j ƒ  | j ƒ  } | d  k	 r� t d | d | d | ƒ n  | j | ƒ q% W| S(   NR   t   ter_indicest	   file_name(	   R   R   R   R   t   construct_hierarchyt   reset_i_seq_if_necessaryR<   t$   check_for_internal_chain_ter_recordst   append(   t   reference_file_listR$   t   reference_hierarchy_listt   filet   pdb_iot   cur_hierarchyR<   (    (    sL   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/torsion_restraints/utils.pyt   process_reference_filesk   s    

c         C   s¹   d d l  m } | d  k r( t j } n  | d  k rC | j ƒ  } n  | d  k r^ | j ƒ  } n  i  } xN t | |  ƒ D]= \ } }	 t d |	 d | d | d | d | ƒ }
 |
 | | <qt W| S(   Niÿÿÿÿ(   t   serverR   t   mon_lib_srvt   ener_libt   crystal_symmetryR$   (   t   mmtbx.monomer_libraryRH   R   R   R   RJ   t   zipt   get_complete_dihedral_proxies(   RC   RB   RI   RJ   RK   R$   RH   t   reference_dihedral_proxiesR=   R   t   dihedral_proxies(    (    sL   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/torsion_restraints/utils.pyt   get_reference_dihedral_proxies~   s$    		c         C   s@  |  | | g j  d  ƒ d k s$ t ‚ d d l m } m } d d  l }	 | d  k r^ t j } n  | d  k ry | j ƒ  } n  | d  k r” | j	 ƒ  } n  |  d  k	 r¯ |  j
 ƒ  } n  | d  k	 rß t | t ƒ rß t j | ƒ } qß n  | j d | d | d | d | d t d	 | d
 t d |	 j ƒ  d t d t ƒ 
}
 |
 j ƒ  } | j S(   Ni   iÿÿÿÿ(   RH   t   pdb_interpretationRI   RJ   R=   t   raw_recordst   strict_conflict_handlingRK   t   force_symmetryR$   t   for_dihedral_referencet6   substitute_non_crystallographic_unit_cell_if_necessary(   t   countR   t   AssertionErrorRL   RH   RR   t	   cStringIOR   R   RJ   t   as_pdb_stringt
   isinstancet   strR   t   split_linest   processR   R   t   StringIOt   geometry_restraints_managerRP   (   R   R=   RS   RI   RJ   RK   R$   RH   RR   RZ   t   processed_pdb_file_localt   grm(    (    sL   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/torsion_restraints/utils.pyRN   ˜   s:    		c         C   s   | j  d |  ƒ S(   Nt   string(   R   (   Rd   R   (    (    sL   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/torsion_restraints/utils.pyR   ¿   s    	c         C   s   t  d |  d | ƒ j ƒ  S(   NRd   R   (   R   t
   iselection(   Rd   R   (    (    sL   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/torsion_restraints/utils.pyRe   Ã   s    c   	      C   s
  g  } xý | D]õ } | d  k r8 | r) d  St d ƒ ‚ n% | t k r] | rN t St d ƒ ‚ n  y& | j t d | d |  ƒ j ƒ  ƒ WnH t k
 r™ ‚  n5 t k
 rÍ } t ƒ  } t d d | | f ƒ ‚ n X| r | j	 t
 ƒ d k r t d d | f ƒ ‚ q q W| S(	   Ns&   Atom selection cannot be None:
  =Nones(   Atom selection cannot be Auto:
  %s=AutoRd   R   s&   Invalid atom selection:
  %s=%s
  (%s)t   reference_groupi    s   Empty atom selection:
  %s=%s(   R   R   R   RA   R   Re   t   KeyboardInterruptt	   ExceptionR   RX   R   (	   R   R   t
   allow_nonet
   allow_autot   raise_if_empty_selectiont   resultRd   t   et   fe(    (    sL   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/torsion_restraints/utils.pyt   phil_atom_selection_multipleÆ   s,      & 	c         C   su   g  } t  d |  d | d t ƒ } xM | D]E } | j ƒ  d k rO t d ƒ ‚ n  x | D] } | j | ƒ qV Wq( W| S(   NR   R   Rk   i    s   No atom selected(   Ro   R   t   sizeR   RA   (   R   R   Rl   Re   R&   t   atom(    (    sL   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/torsion_restraints/utils.pyR    à   s    	c         C   s%   x |  D] } | | k r t  Sq Wt S(   N(   R   R   (   t   i_seqsR   t   i_seq(    (    sL   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/torsion_restraints/utils.pyt   is_residue_in_selectionî   s    c         C   s+   g  } x |  D] } | j  | j ƒ q W| S(   N(   RA   Rs   (   t   atomsRr   Rq   (    (    sL   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/torsion_restraints/utils.pyt
   get_i_seqsô   s    c         C   s  t  |  d t ƒd k s0 t  |  d t ƒd k r|  j ƒ  } t | ƒ d k rV d | St | ƒ d k rè | d d !j ƒ  d k r� d	 | j ƒ  S| d j ƒ  d k rº d
 | d d !j ƒ  S| d j ƒ  d k r	d | d d !j ƒ  Sq| d k rd | d d !j ƒ  Sn  |  S(   Nt   consider_ccp4_mon_lib_rna_dnat   common_rna_dnat   ccp4_mon_lib_rna_dnai   s     i   i    t   Dt    s    Dt   Rt   ADEt   CYTt   GUAt   URI(   R}   R~   R   R€   (   R   R   t   stripR8   t   upper(   t   resnamet   tmp_resname(    (    sL   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/torsion_restraints/utils.pyt   modernize_rna_resnameú   s"    		c         C   s@   |  j  d d ƒ } | d k r' d } n | d k r< d } n  | S(   Nt   *t   's    O1Ps    OP1s    O2Ps    OP2(   t   replace(   Rq   t   new_atom(    (    sL   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/torsion_restraints/utils.pyt   modernize_rna_atom_name  s    		c         C   s½   t  ƒ  } x­ |  j ƒ  D]Ÿ } | j ƒ  d d !} | j ƒ  d d !} t | ƒ } t | ƒ d k rr t d | ƒ } n | } | | j ƒ  d d !| | j ƒ  d | j } | | | j <q W| S(   Ni    i   i   i   Rx   Rq   (   t   dictRu   t   pdb_label_columnsR…   R   RŠ   R*   Rs   (   R   t   i_seq_name_hashRq   t	   atom_nameRƒ   t   updated_resnamet   updated_atomt   key(    (    sL   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/torsion_restraints/utils.pyt   build_name_hash  s    	&
c         C   s½   t  ƒ  } x­ |  j ƒ  D]Ÿ } | j ƒ  d d !} | j ƒ  d d !} t | ƒ } t | ƒ d k rr t d | ƒ } n | } | | j ƒ  d d !| | j ƒ  d | j } | j | | <q W| S(   Ni    i   i   i   Rx   Rq   (   R‹   Ru   RŒ   R…   R   RŠ   R*   Rs   (   R   t   name_i_seq_hashRq   RŽ   Rƒ   R�   R�   R‘   (    (    sL   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/torsion_restraints/utils.pyt   build_i_seq_hash%  s    	&
c         C   s7   t  ƒ  } x' |  j ƒ  D] } | j | | j ƒ  <q W| S(   N(   R‹   Ru   t   xyzRŒ   (   R   t   name_xyz_hashRq   (    (    sL   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/torsion_restraints/utils.pyt   build_xyz_hash5  s    	c         C   sT   t  ƒ  } xD |  j ƒ  D]6 } | j ƒ  } x! | j ƒ  D] } | | | j <q5 Wq W| S(   N(   R‹   t   residue_groupst   resseq_as_intRu   Rs   (   R   t
   resid_hasht   rgt   residRq   (    (    sL   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/torsion_restraints/utils.pyt   build_resid_hash;  s    	c         C   s4   t  ƒ  } x$ |  j ƒ  D] } | j | | j <q W| S(   N(   R‹   Ru   R•   Rs   (   R   t   i_seq_xyz_hashRq   (    (    sL   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/torsion_restraints/utils.pyt   build_i_seq_xyz_hashC  s    	c         C   s4   t  ƒ  } x$ |  j ƒ  D] } | j | | j <q W| S(   N(   R‹   Ru   t   elementRs   (   R   t   i_seq_element_hashRq   (    (    sL   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/torsion_restraints/utils.pyt   build_element_hashI  s    	c         C   sK   t  ƒ  } x; |  j ƒ  D]- } x$ | j ƒ  D] } | j | | j <q) Wq W| S(   N(   R‹   R   Ru   R   Rs   (   R   t
   chain_hasht   chainRq   (    (    sL   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/torsion_restraints/utils.pyt   build_chain_hashO  s
    	c         C   s4   t  ƒ  } x$ |  j ƒ  D] } | j | | j <q W| S(   N(   R‹   Ru   R*   Rs   (   R   t
   segid_hashRq   (    (    sL   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/torsion_restraints/utils.pyt   build_segid_hashV  s    	c      	   C   su  t  ƒ  } xe|  j ƒ  D]W} xN| j ƒ  D]@} x7| j ƒ  D])} x | j ƒ  D]} | j j ƒ  d k rO | j j ƒ  d k rŽ d } d } nH | j j ƒ  d k r² d } d } n$ | j j ƒ  d k rÖ d	 } d
 } n  d  } d  }	 xJ | j ƒ  D]< }
 |
 j	 | k r|
 j
 } qï |
 j	 | k rï |
 j
 }	 qï qï W| d  k ra|	 d  k ra|	 | | <| | |	 <qaqO qO Wq< Wq) Wq W| S(   Nt   ASPt   GLUt   PHEt   TYRs    OD1s    OD2s    OE1s    OE2s    CD1s    CD2(   R¨   R©   Rª   R«   (   Rª   R«   (   R‹   R   R   R   t   residuesRƒ   R‚   R   Ru   t   nameRs   (   R   t   sym_atom_hasht   modelR¤   R)   t   residuet   atom1t   atom2t   atom1_i_seqt   atom2_i_seqRq   (    (    sL   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/torsion_restraints/utils.pyt   build_sym_atom_hash\  s4    				
 c         C   s9   t  j |  | ƒ } | d k r, | d 8} n  t  j | ƒ S(   Ng     €f@g     €v@(   t   matht   fabs(   t   angle1t   angle2t   distance(    (    sL   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/torsion_restraints/utils.pyt   angle_distancex  s    c         C   s  g  } x* |  D]" } | d  k	 r | j | ƒ q q Wt | ƒ } | d k  rO d  Sd } | d } | d k rx | d 8} n | d k  r‘ | d 7} n  | | 7} x\ | d D]P } | } | | d k rÏ | d 7} n | | d k  rì | d 8} n  | | 7} q¦ W| | } | S(   Ni   g        i    g     €f@g     €v@g     €fÀ(   R   RA   R8   (   t   anglest   local_anglest   anglet   n_anglest   sumt   a1t   a2t   average(    (    sL   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/torsion_restraints/utils.pyt   get_angle_average~  s.    


c         C   s7   t  j d |  d | ƒ } t  j j d | ƒ } | | f S(   Nt	   referencet   movingt   match(   t   ccp4io_adaptbxt   SecondaryStructureMatchingt   SSMAlignmentR˜   (   t   reference_chaint   moving_chaint   ssmt   ssm_alignment(    (    sL   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/torsion_restraints/utils.pyt
   _ssm_align—  s
    		c         C   s  | d  k r t j } n  i  } i  } i  } | d } | d }	 | d }
 | d } | d } | d } xµ |
 D]­ } | j j ƒ  d j ƒ  d d !} | j ƒ  d k r® d } n  t | ƒ } | j j ƒ  d j ƒ  d d !| | j j ƒ  d j ƒ  d | j j ƒ  d j } | | | j	 <qm Wxµ | D]­ } | j j ƒ  d j ƒ  d d !} | j ƒ  d k rfd } n  t | ƒ } | j j ƒ  d j ƒ  d d !| | j j ƒ  d j ƒ  d | j j ƒ  d j } | | | j	 <q%W| | k rút
 j j | | ƒ } n t
 j j |	 | ƒ } d } d } d } d } | j | } xÙ| j D]Î} | j | } | | k r¦| d k r¦| d k r¦| | | | | | | <| d 7} | d 7} q>| d k ré| d k ré| d 7} | d 7} | d 7} | d 7} q>| d k r| d	 k s| d	 k rD| d k rD| d 7} | d 7} | d 7} | d 7} q>| d k rq| d 7} | d 7} | d 7} q>| d k rž| d 7} | d 7} | d 7} q>| d	 k rË| d 7} | d 7} | d 7} q>| d	 k rø| d 7} | d 7} | d 7} q>| d 7} | d 7} q>W| S(
   Ni    i   i   i   t   MSEt   METi   t   Xt   -(   R   R   R   R›   Ru   RŒ   R‚   R…   R*   Rs   t   mmtbxt	   alignmentt   pairwise_globalt   result2t   result1(   t   paramsR   R   R   R$   t   res_match_hasht   model_mseq_res_hasht   ref_mseq_res_hasht	   model_seqt   model_seq_paddedt   model_structurest   ref_seqt   ref_seq_paddedt   ref_structurest   structRƒ   R�   R‘   t   pgt   offset_it   offset_jR&   t   jt   seq_jt   seq_i(    (    sL   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/torsion_restraints/utils.pyt
   _alignmentŸ  s–     





 	< 	<			$















c         C   s,   d d l  m } | d |  ƒ j | ƒ } d  S(   Niÿÿÿÿ(   t   new_hierarchy_from_chainR¤   (   t   iotbx.pdb.hierarchyRë   t   select(   R¤   R   Rë   t   new_hierarchy(    (    sL   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/torsion_restraints/utils.pyt   chain_from_selectionõ  s    c   
      C   s  d d  l  } |  j | ƒ } d  } | j j j ƒ  } | j j j ƒ  } x– | j ƒ  D]ˆ } x | j ƒ  D]q }	 |	 j	 ƒ  r‹ |	 j
 ƒ  r‹ qe qe | d  k s¦ |	 j | k rÅ | j | j ƒ  ƒ |	 j } qe | d | IJqe qe WqR Wt | j ƒ  ƒ d k rt d ƒ ‚ n  | j | ƒ | S(   Niÿÿÿÿs:   * Multiple alternate conformations found, using altid %s *i   s    more than one chain in selection(   Rì   Rí   R   t   pdbt	   hierarchyt   rootR¯   R   R   R   R   t   altloct   append_chaint   detached_copyR8   R   t   append_model(
   R   R   R$   t   iotbxt   temp_hierarchyRó   Rñ   R¯   R¤   R)   (    (    sL   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/torsion_restraints/utils.pyt   hierarchy_from_selectionù  s(    c      	   C   sÐ  g  } g  } g  } d } d } x�|  j  ƒ  D]‚} xy| j ƒ  D]k} t }	 x) | j ƒ  D] }
 |
 j ƒ  rW t }	 qW qW Wx0| j ƒ  D]"} t | j ƒ  ƒ d k rƒ | j ƒ  d } |	 rÆ t	 | ƒ } n t
 j j | d ƒ } | j ƒ  } t | ƒ } | d k r¥t | | ƒ r¥| j | ƒ | j ƒ  } | | d k rfx, t | | d ƒ D] } | j d ƒ qLWn  | } | j t d | d | ƒ ƒ | j | ƒ | d 7} q¥qƒ qƒ Wq> Wq+ Wd j | ƒ d j | ƒ | f S(   Ni    i   RÒ   Rs   R›   t    (   R   R   R   R   R   R   R˜   R8   t   unique_resnamest    get_nucleic_acid_one_letter_codeR   t   one_letter_given_three_lettert   getRu   Rv   Rt   RA   R™   t   rangeR	   t   join(   R   R   t   seqRl   t
   padded_seqt   last_resseqt   counterR¯   R¤   R   R)   R›   Rƒ   t   olcRu   Rr   t   resseqt   x(    (    sL   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/torsion_restraints/utils.pyR!     s<    c         C   s„   t  j j |  d ƒ } | d k r% d S|  d d !d k r@ |  d S|  d d k rx |  d d k sp |  d d k rx |  d S|  d Sd  S(	   NRÒ   i    i   s     R{   i   Rz   t   d(   R   Rý   Rþ   (   Rƒ   R  (    (    sL   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/torsion_restraints/utils.pyRü   2  s    0c         C   sL   d  } x? |  j ƒ  D]1 } | d  k r1 | j } q | | j k r d  Sq W| S(   N(   R   Ru   R*   (   R¤   R*   Rq   (    (    sL   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/torsion_restraints/utils.pyR   =  s    c         C   sn  |  j  ƒ  } |  j ƒ  } i  } i  } x(| D] } t } x: | j ƒ  D], }	 |	 j ƒ  rj |	 j ƒ  rj qD qD t } qD W| s€ q+ n  d  }
 d  } xz | j ƒ  D]l } |
 d  k	 rÉ | j |
 k  rÒ | j }
 qÒ n	 | j }
 | d  k	 rü | j | k r| j } qq™ | j } q™ W| j	 | j
 ƒ d  k r1g  | | j
 <n  | | j
 j |
 | f ƒ q+ Wi  } x¥ | j ƒ  D]— } d  } d  } | | } xh | D]` \ }
 } | d  k	 rµ|
 | k  r»|
 } q»n |
 } | d  k	 rß| | k rå| } qåq…| } q…W| | f | | <qbWxj | D]b } xY | j ƒ  D]K } | | \ }
 } | |
 k r| | k  rt d | | f d ƒ ‚ qqWqWd  S(   Ns&   chain '%s' in %s contains one or more s.   errant TER cards.
Please remove and try again.(   R   Ru   R   R   R   R   R   R   Rs   Rþ   R   RA   t   keysR   (   R   R<   R=   R   Ru   t   chain_ter_matchest   chain_rangesR¤   R(   R)   t   mint   maxRq   t   reduced_chain_rangesR‘   t   min_allt   max_allt   rangest   ter_id(    (    sL   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/torsion_restraints/utils.pyR@   F  s^    
	

c         C   sI  d  } t } g  } d  } | r1 | |  j d d S| r_ | |  j d d | |  j d d f SxÒ |  j D]Ç }	 | |	 d }
 | |	 d  } | j | ƒ | |	 d d !} | d  k r¾ |
 } n  | d k rÙ | rÙ | } n |
 | k ré d  S|
 d d !} t | d t ƒd k rd  S| ri | d k r0t } q0qi qi W| rE| rEd  S| S(   Ni   i   i    i   i   R{   Rw   t   common_amino_acids    N  s    CA s    C  s    O  s    CB s    OXT(   s    N  s    CA s    C  s    O  s    CB s    OXT(   R   R   Rr   RA   R   R   (   t   dpt	   name_hasht   phi_psit   chi_onlyt   omegaR   t	   chi_atomst	   atom_listRó   Rs   t   cur_idRq   t
   cur_altlocRƒ   (    (    sL   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/torsion_restraints/utils.pyt   get_torsion_id�  s<    			c         C   s^  g  } i  } | d  k	 r' | j ƒ  } n |  j ƒ  j ƒ  } | d  k r` t j t | ƒ t ƒ } n  x»|  j ƒ  D]­} x¤| j	 ƒ  D]–} x�| j
 ƒ  D]} xv| j ƒ  D]h}	 d  }
 d  } d  } d  } d  } xŒ |	 j ƒ  D]~ } | j d k rõ | }
 q× | j d k r| } q× | j d k r%| } q× | j d k r=| } q× | j d k r× | } q× q× W|
 d  k	 r¦ | d  k	 r¦ | d  k	 r¦ | d  k	 r¦ | |
 j s¦ | | j s¦ | | j s¦ | | j rÇq¦ n  | | | f } | d  k	 rø| t | g ƒ 7} n  | j |
 | f ƒ q¦ q¦ Wq“ Wq€ Wqm Wx9t | ƒ D]+\ } } | d k  s+| t | ƒ d k r_q+n  | } | | d } | | d } t | d | d ƒ } t | d | d ƒ } | r+| r+| d j | d j f } | d d j | d d j | d d j f } t | d ƒ d	 k r<| t | d d	 j g ƒ 7} n  | | g | | d j <q+q+W| S(
   Ns    CA s    C  s    N  s    O  s    H  i   i    i   i   (   R   t
   sites_cartRu   t   extract_xyzR   t   boolR8   R   R   R   R˜   t   atom_groupsR­   Rs   t   tupleRA   R   t   check_residues_are_connected(   R   t   xray_structureR   t   c_alphast   c_alpha_hingesR  R¯   R¤   t   residue_groupt
   atom_groupt   cur_cat   cur_ct   cur_ot   cur_nt   cur_hRq   t
   moving_tplR&   t   cat   currentt   previoust   nextt   prev_connectedt   next_connectedt   nodesRÆ   (    (    sL   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/torsion_restraints/utils.pyt   get_c_alpha_hinges¦  sj    				&"0!g      @g        c         C   sd   d d l  m } | j |  j ƒ } | j | j ƒ } | | j ƒ  } | | k s\ | | k  r` t St S(   Niÿÿÿÿ(   t   matrix(   t   scitbxR7  t   colR•   t   lengthR   R   (   t   ca_1t   ca_2t   max_sept   min_sepR7  t   ca_1_matt   ca_2_matt   dist(    (    sL   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/torsion_restraints/utils.pyR#  à  s    c         C   s+   x$ |  j  ƒ  D] } | j ƒ  s t Sq Wt S(   N(   R   R   R   R   (   R¤   R)   (    (    sL   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/torsion_restraints/utils.pyt   is_protein_chainé  s    c         C   s€   |  j  ƒ  } | j d d d d d | ƒ } | j ƒ  | j ƒ  } | j d d	 d d d | ƒ } | j ƒ  | j ƒ  } | | f S(
   Nt   resolution_factorg      ð?i   t   map_types   2mFo-DFct   use_all_datas   mFo-DFcg      Ð?g      Ð?(   t   electron_density_mapt   fft_mapt   apply_sigma_scalingt   real_map_unpadded(   t   fmodelt   exclude_free_r_reflectionst   map_objRG  t   target_map_datat   residual_map_data(    (    sL   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/torsion_restraints/utils.pyt   prepare_mapï  s    



c         C   sc   d |  | | f } | s* | d | 7} n
 | d 7} | d | 7} | d  k	 r_ | d | 7} n  | S(   Ns	   %2s%4s%1ss   %1sR{   s   %3ss    segid='%4s'(   R   (   t   chain_idR  Rƒ   t   icodeRó   R*   t   ignore_altloct   base(    (    sL   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/torsion_restraints/utils.pyt   id_strÿ  s    
(?   t
   __future__R    t   libtbx.utilsR   R   t   libtbxR   t	   iotbx.pdbR   t   mmtbx.geometry_restraintsR   R   R   t   cctbx.array_familyR   R	   RÈ   R¶   t   mmtbx.alignmentRÔ   R   t   objectR
   R   R;   RG   RQ   RN   R   Re   R   R   Ro   R    Rt   Rv   R…   RŠ   R’   R”   R—   R�   RŸ   R¢   R¥   R§   Rµ   R»   RÄ   RÏ   Rê   Rï   Rù   R!   Rü   R   R@   R  R6  R#  RB  RO  RT  (    (    (    sL   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/torsion_restraints/utils.pyt   <module>   s€   /0 																		R			"				="8		