ó
»™xTc           @   sŸ  d  d l  m Z d  d l Z d  d l m Z d  d l m Z d  d l m Z d  d l m	 Z	 d  d l
 m Z d  d l m Z d  d	 l m Z d  d l Z d  d
 l m Z d  d l Z d  d l 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" m# Z# e$ Z% e j& j' d ƒ Z( d e) f d „  ƒ  YZ* d e) f d „  ƒ  YZ+ e, e, d „ Z- d e) f d „  ƒ  YZ. d S(   iÿÿÿÿ(   t   divisionN(   t   rotalyze(   t   ramalyze(   t   analyze_peptides(   t   SidechainAngles(   t   rotamer_eval(   t   fit_rotamers(   t   flex(   t   make_sub_header(   t
   restraints(   t   Sorry(   t   utilst   rotamer_search(   t   c_beta(   t   ncs(   t   Autos  
 sigma = 2.5
   .type = float
   .short_caption = Restraint sigma (degrees)
 limit = 15.0
   .type = float
   .short_caption = Restraint limit (degrees)
 similarity = .80
   .type = float
   .short_caption = Sequence similarity cutoff
 fix_outliers = Auto
   .type = bool
   .short_caption = Fix rotamer outliers first
 check_rotamer_consistency = Auto
   .type = bool
   .short_caption = Check for consistency between NCS-related sidechains
   .help = Check for rotamer differences between NCS matched      sidechains and search for best fit amongst candidate rotamers
 target_damping = False
   .type = bool
   .expert_level = 1
 damping_limit = 10.0
   .type = float
   .expert_level = 1
 verbose = True
   .type = bool
 filter_phi_psi_outliers = True
   .type = bool
   .expert_level = 4
 remove_conflicting_torsion_restraints = False
   .type = bool
   .expert_level = 4
 restrain_to_master_chain = False
   .type = bool
   .expert_level = 4
 silence_warnings = False
   .type = bool
   .expert_level = 4
 restraint_group
  .multiple=True
  .optional=True
  .caption = These atom selections define groups of residues whose dihedral     angles will be restrained to be similar.  This is normally done     automatically, and the restraints are designed to release dihedral angles     which are genuinely different.  You do not have to enter groups now     unless you wish to view and/or edit them prior to running phenix.refine.
  .short_caption=Torsion NCS restraint group
  .style = noauto box caption_img:icons/custom/ncs_tb.png
 {
  selection=None
    .type=atom_selection
    .short_caption=Restrained selection
    .multiple=True
    .input_size = 540
    .style = use_list
  b_factor_weight=10
    .type=float
    .short_caption = B factor weight
  coordinate_sigma=0.5
      .type = float
 }
t   torsion_ncsc           B   s@  e  Z d d d d d d d d d d d  „
 Z d „  Z d „  Z d „  Z d d „ Z d „  Z d „  Z	 d „  Z
 d „  Z d	 „  Z d
 „  Z d „  Z d d „ Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z e d e d „ Z d „  Z d „  Z d e d „ Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z  RS(   c         C   sØ  |
 d  k r t j }
 n  | d  k r3 t j ƒ  } n  | j d  k sQ | j d k  r` t d ƒ ‚ n  | j |  _ | j d  k sŠ | j d k  r™ t d ƒ ‚ n  | j |  _ | |  _ d |  _	 | j
 |  _
 | j |  _ | j |  _ | |  _ | |  _ | |  _ | |  _ |
 |  _ | |  _ d  |  _ d  |  _ |	 |  _ | |  _ | |  _ t t ƒ |  _ t j ƒ  |  _ t j ƒ  |  _ | d  k	 r„| j ƒ  n  |  j d  k s¢|  j d  k rµ|  j  d | ƒ n  | d  k	 rÔ|  j! d | ƒ n  d  S(   Ni    s*   torsion NCS sigma parameter must be >= 0.0s*   torsion NCS limit parameter must be >= 0.0g        t   pdb_hierarchy("   t   Nonet   syst   stdoutt   torsion_ncs_paramst   extractt   sigmaR
   t   limitt	   selectiont   slackt   filter_phi_psi_outlierst%   remove_conflicting_torsion_restraintst   restrain_to_master_chaint   b_factor_weightt   coordinate_sigmat   fmodelt
   ncs_groupst   logt   paramst   dp_ncst   rotamer_search_managert   ncs_dihedral_proxiest
   alignmentsR   t   Falset   saR   t	   RotamerIDt
   rotamer_idt   RotamerEvalt   rotamer_evaluatort   reset_i_seq_if_necessaryt   find_ncs_groupst   find_ncs_matches_from_hierarchy(   t   selfR   R    R#   R   R   R   R!   R'   R&   R"   (    (    sR   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/torsion_restraints/torsion_ncs.pyt   __init__Y   sF     													c   $      C   sê  |  j  d IJg  |  _ d  |  _ t |  _ | j ƒ  d j ƒ  } d } x‡ t |  j	 j
 ƒ D]s \ } } d } x* | j D] } | d  k	 rs | d 7} qs qs W| d k r± t d ƒ ‚ qW | d k rW | d 7} qW qW W| d k rfi  } i  }	 i  }
 i  } t g t |  j	 j
 ƒ } xt |  j	 j
 ƒ D]ó \ } } xä | j D]Ù } t j d | j ƒ  d | g ƒ } t j d | d | ƒ \ } } } t | ƒ d k rï|  j  J|  j  d	 IJ|  j  d
 | IJ|  j  d IJ|  j  d IJ|  j  d IJ|  j  Jt | | <Pn  | | | <| |	 | <| |
 | <q4WqWg  } x: t | ƒ D], \ } } | r(| j |  j	 j
 | ƒ q(q(W| |  j	 _
 xó |  j	 j
 D]å } g  } xÆ | j D]» } | j | ƒ x¥ | j D]š } | | k r¼q¤n  | | | | f } |	 | |	 | f } |
 | |
 | f } t j d |  j	 d | d | d | d |  j  ƒ } | | f } | | | <q¤Wq‡W|  j j | ƒ qqW| |  _ n€t | j ƒ  ƒ } t j g  | D] } | j ^ q…ƒ } | j d ƒ |  _ t d | d |  j d |  j	 d |  j  ƒ }  |  j |  _ |  j |  _ d  }! d „  }" |  j j d |" ƒ t |  j ƒ d k rÝd }! xž |  j D]“ } |! d 7}! x | D] }# |! d |# 7}! qPW|  j d  k	 r‹|! d |  j 7}! n
 |! d 7}! |  j d  k	 r¸|! d |  j 7}! n
 |! d 7}! |! d 7}! q9W|! d 7}! n  |! |  _ d  S(    Ns   Determining NCS matches...i    i   s:   Torsion NCS restraint_groups require at least 2 selectionst   cachet   string_listR   R   s   *** WARNING ***s   selection = %ss-   specifies no protein or nucleic acid torsionss   REMOVED RESTRAINT GROUP!!!s   ***************R#   t	   sequencest   padded_sequencest
   structuresR"   s       t	   use_segidc         S   s   |  j  ƒ  |  d S(   Ni    (   t   sort(   t
   match_list(    (    sR   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/torsion_restraints/torsion_ncs.pyt   selection_sortã   s    
t   keys    refinement {
 ncs {
  torsion {
s      restraint_group {
s       selection = %s
s       b_factor_weight = %.1f
s       b_factor_weight = None
s       coordinate_sigma = %.1f
s       coordinate_sigma = None
s      }
s     }
 }
}(    R"   R!   R   t	   found_ncsR(   R8   t   modelst   chainst	   enumerateR#   t   restraint_groupR   R
   t   Truet   lenR   t'   phil_atom_selections_as_i_seqs_multiplet   atom_selection_cachet   extract_sequence_and_sitest   appendt
   _alignmentR'   t   listt   atoms_with_labelsR   t
   std_stringt   segidt   all_eqt   get_ncs_groupsR9   R   R   ($   R1   R   R?   t   n_ncs_groupst   i_seqt   groupt   n_selectionsR   R5   R6   R7   R'   t   restraint_group_checkt   iRA   t   selection_it   sel_atoms_it   sel_seqt   sel_seq_paddedt   sel_structurest   cleaned_restraint_groupst   checkt   ncs_sett   selection_jt   seq_pairt   seq_pair_paddedt   struct_pairt   residue_match_mapR<   t   atom_labelst   at   segidst   ncs_groups_managert   new_ncs_groupsR;   t   chain(    (    sR   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/torsion_restraints/torsion_ncs.pyR/   Œ   sÎ    					


		%			
c   ;      C   sH  g  |  _  g  |  _ g  |  _ g  |  _ g  |  _ d  |  _ t j | ƒ |  _	 t j
 | ƒ |  _ t j | ƒ |  _ d |  _ d |  _ t t ƒ |  _ |  j ƒ  |  _ t j d | ƒ |  _ d  |  _ | j ƒ  j ƒ  } |  j d  k rù t j t | ƒ t ƒ |  _ n  t j d | ƒ } t |  j  ƒ d k r$t j! | ƒ } t j" | ƒ } i  } x� | D]ˆ } t } x* | j# D] }	 | |	 d k rat } qaqaW| sKt }
 x' | j# D] }	 |  j |	 sšt }
 qšqšW|
 rÓ| | | j# <qÓqKqKWi  } i  } i  } xHt$ |  j  ƒ D]7\ } } x(| D] } t j d | d | j% ƒ  ƒ } | j& | ƒ j ƒ  } xä| D]Ü} xÓ| D]Ë} | | k rqqYn  |  j	 | j' d } |  j	 | j' d d !} d  } | | f } |  j( j) | ƒ } | d  k	 rÞ| j) | ƒ } n  | d  k	 rY| j) | | ƒ } | d  k rqYn  | j) | j' ƒ d  k r:t* ƒ  | | j' <n  | j) | ƒ d  k r_t* ƒ  | | <n  | | | j' | <| j' | | | <| j) | ƒ d  k r£g  | | <n  | j) | ƒ d  k rÅg  | | <n  | | | k ré| | j+ | ƒ n  | | | k r| | j+ | ƒ n  | | | <| | | <qYqYWqLWqWqùW| |  _, d  } d  } x²| D]ª} t* ƒ  } g  } xM | j# D]B }	 |  j	 |	 d  } | j+ | ƒ d	 j- | ƒ } |  j. | ƒ } qoW| d  k	 r´| j/ ƒ  d
 k rå| d k råqPq´| j/ ƒ  d k r| d k sP| d k rqPq´| j/ ƒ  d k r9| d k r9qPq´| j/ ƒ  d k r]| d k r]qPq´| j/ ƒ  d k r�| d k r�qPq´| j/ ƒ  d k r´| d k sP| d k r´qPq´n  x• | j# D]Š }	 | j) |	 ƒ } | d  k råq¾n  x` | j0 ƒ  D]R } y | | j+ | | ƒ Wqòt1 k
 rCg  | | <| | j+ | | ƒ qòXqòWq¾Wt2 j3 j4 ƒ  }  |  j+ | ƒ x] | j0 ƒ  D]O } | j) t5 | | ƒ ƒ }! |! d  k	 ru|  j+ |! ƒ d  | t5 | | ƒ <ququWd  | | j# <t |  ƒ d k rP|  j  j+ |  ƒ qPqPWxÁ |  j  D]¶ }" x­ |" D]¥ } |  j6 | ƒ }# |  j. | ƒ }$ t j7 d | d |  j	 ƒ }% |# d- k rv|  j j+ | j# ƒ q|# d0 k r˜|  j j+ | j# ƒ q|# d3 k r|  j j+ | j# ƒ qqWqWi  }& i  }' xB |  j  D]7 } t | ƒ }( x" | D] }) |( |& |) <g  |' |) <qñWqØWg  }* i  }+ x¦|  j  D]›}" g  }, xœ |" D]” } t |" ƒ d k  rZq<n  d }- x" | j# D] }	 |- |  j	 |	 7}- qjW|- d d !|- d  d! !k r<|- d d !|- d" d# !k r<|, j+ |- d d !ƒ q<q<Wt |" ƒ t |, ƒ k r)|, j8 ƒ  d  }. t }/ x¿ t$ |, ƒ D]® \ } } | d k r–	| }. |. |* k rB	t }/ q½	|+ j) | ƒ d  k rd	g  |+ | <q½	t |, ƒ t |+ | ƒ k r‰	t }/ q½	g  |+ | <q	|/ s	|+ |. j+ | ƒ |* j+ | ƒ q	q	Wq)q)W|+ |  _9 |  j: ƒ  xµ |  j9 j0 ƒ  D]¤ }0 |0 d$ d !}1 | |0 }2 |& |2 }( t |  j9 |0 ƒ |( d k rë	|' |2 j+ t; |1 ƒ ƒ xF |  j9 |0 D]4 }3 |3 d$ d !}4 | |3 }2 |' |2 j+ t; |4 ƒ ƒ qT
Wqë	që	Wi  |  _< xñ |' j0 ƒ  D]ã } d  }5 d  }6 d  }7 d  }8 g  |  j< | <|' | j8 ƒ  xx |' | D]l }9 |6 d  k r|9 }7 |9 }6 qí
|9 |6 d k rS|6 }: |  j< | j+ |7 |: f ƒ |9 }7 d  }: |9 }6 qí
|9 }6 qí
W|6 d  k r©
|6 }: |  j< | j+ |7 |: f ƒ q©
q©
W|  j= j> rÁ|  j? d  k rÁ|  j@ d% |  jA ƒ n  |  j? d  k rà|  jA d& IJn |  jA d' IJtB jB d | ƒ |  _C |  jD d( | d | d% |  jA ƒ n  |  j= jE sD|  jA d) d* IJn  d  S(4   Ni   i
   R   i    s    Ht   stringR3   i   t   ,t   args    CD , NE , CZ , NH2t   tyrs    CD1, CE1, CZ , OH s    CE1, CZ , OH , HH t   sers    CA , CB , OG , HG t   thrs    CA , CB , OG1, HG1t   cyss    CA , CB , SG , HG t   mets    CG , SD , CE ,1HE s    CG , SD , CE , HE1t   dpt	   name_hashs    C  s    N  s    CA i   t    i   i   i&   i*   i9   i   R"   s&   Initializing torsion NCS restraints...s#   Verifying torsion NCS restraints...t
   sites_carts"   ** WARNING: No torsion NCS found!!s     Please check parameters. **s    C   N  s    C   N   CA s    C   N   CA  C  s    N   CA s    N   CA  C  s    N   CA  C   N  s    CA  C  s    CA  C   N  s    CA  C   N   CA (F   R$   t	   cb_dp_ncst   phi_listt   psi_listt
   omega_listR   t   dihedral_proxies_backupR   t   build_name_hashRq   t   build_segid_hasht
   segid_hasht   build_sym_atom_hasht   sym_atom_hasht   njumpt
   min_lengthR   R(   R)   t   build_sidechain_angle_hasht   sidechain_angle_hashR   t   rt	   unit_cellt   atomst   extract_xyzR   R   t   boolRC   RB   t   get_complete_dihedral_proxiesR!   t   build_element_hasht   build_i_seq_hasht   i_seqsR@   RE   t   selectRP   R'   t   gett   dictRG   t   res_match_mastert   joint   get_torsion_resnamet   lowert   keyst	   Exceptiont   cctbxt   geometry_restraintst   shared_dihedral_proxyt   tuplet   get_torsion_atomst   get_torsion_idR9   t   ncs_match_hasht   reduce_redundanciest   intt   master_rangesR#   t   verboseR&   t   show_ncs_summaryR"   R   t   ramat    generate_dihedral_ncs_restraintst   silence_warnings(;   R1   R   Rs   t   complete_dihedral_proxiest   element_hasht
   i_seq_hasht   dp_hashRp   t   h_atomRP   t   completet
   super_hashRŽ   t   res_to_selection_hashRT   RQ   t   chain_iR   t   c_atomst   atomt   chain_jt   res_keyt   atom_keyt   j_matchR<   t	   cur_alignt   j_i_seqt   resnamet	   atoms_keyt   tempR„   t   cur_matchest   dp_matcht   cur_dp_hasht   dp_sett   angle_atomst   angle_resnamet   angle_idt   match_countert   inclusive_ranget   cur_lenRg   t   matchedRš   t   key_sett   cur_keyt
   master_keyt   skipt   rest   resnumt   hash_keyt   res2t   resnum2t   currentt   previoust   startt   stopt   numt   finish(    (    sR   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/torsion_restraints/torsion_ncs.pyR0   ý   sÀ   												
			
!

			



"			
!	c         C   sr   | j  j d  k rn |  j d IJt j d | ƒ } | | j  _ t | j  j _ |  j d It | j  j ƒ IJn  d  S(   Ns#   Adding C-beta torsion restraints...R   s   num c-beta restraints: (	   t   generic_restraints_managert   c_beta_dihedral_proxiesR   R"   R   t   get_c_beta_torsion_proxiesRB   t   flagsRC   (   R1   t   geometryR   t   c_beta_torsion_proxies(    (    sR   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/torsion_restraints/torsion_ncs.pyt   add_c_beta_restraintsò  s    c         C   sß   | d  k r t j } n  d „  } t |  j d | ƒ} | d IJ| d IJx„ | D]| } | j d ƒ rs | d  } n | } xG |  j | D]8 } | j d ƒ r± | d | d  7} q‡ | d | 7} q‡ W| | IJqQ W| d IJd  S(   Nc         S   s   |  d S(   Ni   (    (   RÆ   (    (    sR   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/torsion_restraints/torsion_ncs.pyt   get_key_chain_num  s    R<   s8   --------------------------------------------------------s   Torsion NCS Matching Summary:s       iüÿÿÿs    <=> %s(   R   R   R   t   sortedRš   t   endswith(   R1   R"   RØ   t   sorted_keysR<   t
   print_linet   match(    (    sR   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/torsion_restraints/torsion_ncs.pyRŸ   ÿ  s      	

c         C   sj   xc |  j  j ƒ  D]R } xI |  j  j ƒ  D]8 } | | k r> q& n  | |  j  | k r& |  j  | =q& q& Wq Wd  S(   N(   Rš   R’   (   R1   R<   t   key2(    (    sR   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/torsion_restraints/torsion_ncs.pyR›     s    c         C   s<   d } x/ | j  D]$ } |  j | d d !} | | 7} q W| S(   NRr   i    i   (   RŠ   Rq   (   R1   Rp   R„   RP   t	   atom_name(    (    sR   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/torsion_restraints/torsion_ncs.pyR˜     s
    c         C   sW   d  } xJ | j D]? } |  j | d d !} | d  k r? | } q | | k r d  Sq W| S(   Ni   i   (   R   RŠ   Rq   (   R1   Rp   R´   RP   t   cur_resname(    (    sR   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/torsion_restraints/torsion_ncs.pyR�   #  s    	c   	      C   s™   g  } x/ | j  D]$ } |  j | d  } | j | ƒ q Wd j | ƒ } |  j | ƒ } |  j j j | j ƒ  ƒ } | d  k r† d  } n | j | ƒ } | S(   Ni   Ri   (
   RŠ   Rq   RG   R�   R�   R)   t   resAtomsToChiRŒ   R‘   R   (	   R1   Rp   R„   RP   R­   Rµ   R´   Rá   t   chi_id(    (    sR   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/torsion_restraints/torsion_ncs.pyt
   get_chi_id-  s    	c         C   sN  i  |  _  |  j d | ƒ \ } } } } i  |  _ x* |  j j D] } | j |  j | j ƒ  <q= Wxê |  j j ƒ  D]Ù } | d d !| d d !} |  j j	 | ƒ }	 |	 d  k	 rË t j d |	 ƒ }
 |
 |  j  | <n  |  j j	 | ƒ } xf | D]^ } | d d !| d d !} |  j j	 | ƒ }	 |	 d  k	 rä t j d |	 ƒ }
 |
 |  j  | <qä qä Wqm Wd  S(   NR   i   i   i    t   rotamer(   t   current_chi_restraintst   get_rotamer_datat   current_rotamersR‚   t   resultst   rotamer_namet   id_strRš   R’   RŒ   R   R   t   split_rotamer_names(   R1   R   t
   model_hasht   model_scoret   all_rotamerst
   model_chist   rotR<   t
   search_keyRä   t   split_rotamert   key_listRÞ   t   search_key2(    (    sR   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/torsion_restraints/torsion_ncs.pyt   build_chi_tracker;  s$    		c   ,      C   s%  |  j  | ƒ t j j ƒ  |  _ d  } |  j d | ƒ \ } } } } g  }	 |  j rs |  j | ƒ }
 |  j	 | ƒ }	 n  d } xY|  j
 D]N} t | ƒ d k  r¡ qƒ n  g  } g  } g  } g  } g  } i  } x#t | ƒ D]\ } } t j j d | d | ƒ } | j } |  j | ƒ } | r| d k s/| d k  r| j d } |  j j | ƒ } | d  k	 rö| j d | j d	 | j d | f } t j j d
 | d d d d	 |  j d d |  j d t d |  j ƒ } | | | <t j j d | d | ƒ } | j } qÿd  } qn  | j | ƒ t } | j |  j k s9| j |  j k rŠt j d | d |  j d t ƒ } | d d !| d d !} | |
 k rŠt } qŠn  | j | ƒ t } | j |  j  k r`t j d | d |  j d t ƒ } | d d d !j! ƒ  | d d d !d | d d d !}  | d	 d d !j! ƒ  | d	 d d !d | d	 d d !}! |  |! f |	 k r`t } q`n  | j | ƒ t j d | d |  j d t ƒ } | d  k	 rÒ |  j" j | ƒ }" |  j# | ƒ }# | j |" ƒ |# d  k	 rç| j |# ƒ qçqÒ qÒ W|  j$ d | d | d | d | d | ƒ }$ x¹t | ƒ D]«\ } } |$ | }% |  j% | ƒ }& |  j& | ƒ }' t j d | d |  j ƒ } |  j' j |' ƒ }( d  }) |( d  k r§|( j |& ƒ }) n  |% d  k	 r"|  j% | ƒ }& |  j& | ƒ }' t j d | d |  j ƒ } |  j' j |' ƒ }( d  }) | j | ƒ }* |* d  k	 rit j j d
 |* j d |% d d	 |  j d d |  j d t d |  j ƒ }+ nG t j j d
 | j d |% d d	 |  j d d |  j d t d |  j ƒ }+ |  j j |+ ƒ | d	 7} q"q"Wqƒ Wt |  j ƒ d k r
|  j( j) s!| d  d! IJq!n | d" t |  j ƒ IJd  S(#   NR   i    i   Rs   t   proxyg     €V@g     €VÀi   i   RŠ   t   angle_idealg        t   weightR   t   top_outR   Rp   Rq   t   phi_psii   i   t   omegai   i
   t    t   chi_onlyt   anglest   is_rama_outliert   is_omega_outliert   rotamer_statet   chi_idss"   ** WARNING: No torsion NCS found!!s     Please check parameters. **s%   Number of torsion NCS restraints: %d
(*   Rõ   R”   R•   R–   R&   R   Ræ   R   t   get_ramachandran_outlierst   get_omega_outliersR$   RC   R@   t   dihedralt   angle_modelt   is_symmetric_torsionRŠ   R}   RŒ   t   dihedral_proxyR   R   t   TOP_OUT_FLAGR   RG   R(   Ru   Rv   R   R™   Rq   RB   Rw   t   stripRå   Rã   t   get_target_anglesR˜   R�   R�   R#   R¢   (,   R1   Rs   R   R"   t   target_map_dataRì   Rí   Rî   Rï   t   omega_outlier_listt   rama_outlier_listt   torsion_counterRº   Rþ   Rÿ   R   R  R  t	   wrap_hashRT   Rp   t   dit   anglet	   wrap_chist	   sym_i_seqt
   swap_i_seqt   swap_i_seqst   dp_tempt   rama_outR½   R<   t	   omega_outt   key1RÞ   t   split_rotamer_listt	   which_chit   target_anglest   target_angleR»   R¼   t   cur_dictt
   angle_namet   dp_symt   dp_add(    (    sR   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/torsion_restraints/torsion_ncs.pyR¡   Q  sö    		


		
$						99					
				c         C   s   d  S(   N(    (   R1   RÕ   (    (    sR   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/torsion_restraints/torsion_ncs.pyt   sync_dihedral_restraintsü  s    c         C   s–   | d  k r t j } n  t d d | ƒ|  j d  k rJ |  j d | ƒ n |  j d | d | d | ƒ |  j d | ƒ |  j r’ |  j	 d | ƒ n  d  S(   Ns   Updating torsion NCS restraintst   outR   Rs   R"   RÕ   (
   R   R   R   R   R$   R0   R¡   t   add_ncs_dihedral_proxiesR   R#  (   R1   RÕ   Rs   R   R"   (    (    sR   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/torsion_restraints/torsion_ncs.pyt   update_dihedral_ncs_restraints  s    	c         C   sN  | j  } |  j | d d d !j ƒ  } | d k r7 t Sg  } x5 | D]- } |  j | } | d d !} | j | ƒ qD W| d k r¸ | d	 d
 d d g k s± | d	 d
 d d g k rJt Sn’ | d k rû | d
 d d d g k sô | d
 d d d g k rJt SnO | d k s| d k rJ| d	 d
 d d g k sC| d	 d
 d d g k rJt Sn  t S(   Ni    i   i   t   ASPt   GLUt   PHEt   TYRi   s    CA s    CB s    CG s    OD1s    OD2s    CD s    OE1s    OE2s    CD1s    CD2(   R'  R(  R)  R*  (   RŠ   Rq   t   upperR(   RG   RB   (   R1   Rp   RŠ   R´   t   torsion_atomsRP   t   nameR­   (    (    sR   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/torsion_restraints/torsion_ncs.pyR  (  s.    		c         C   sk  t  | ƒ t  | ƒ k s0 t  | ƒ d k s0 t ‚ d  } t  | ƒ d k r¥ t  | ƒ | j | d ƒ k sm t ‚ d | k r¥ d | k r¥ d | k r¥ | d d } q¥ n  i  } g  } d  g t  | ƒ }	 | j t ƒ d k s| j t ƒ d k st  | ƒ | j d  ƒ d k  rJt  | ƒ d k rJx$ t |	 ƒ D] \ }
 } d  |	 |
 <q,W|	 Sd  } x�t | ƒ D]‚\ }
 } |
 | k r{q]n  | d  k r�q]n  x6t | ƒ D](\ } } |
 | k r¸qšqš| | k rÊqšqš| d  k rÜqšqšt  | ƒ d k r| |
 d  k rqšq| | d  k rqšqn  t } t } t } t  | ƒ d k r¯| |
 d d k r^t } n | | d d k r{t } n  | |
 d d k s£| | d d k r¯t } q¯n  | d  k	 r| rt | ƒ } xJ | d k r| |
 | d | | | d k r
t } n  | d 8} qÑWn  | s'qšn  | rO| |
 d | | d k rOqšn  |
 | k r¤g  | |
 <| |
 j |
 ƒ | |
 j | ƒ | j |
 ƒ | j | ƒ qš| |
 j | ƒ | j | ƒ qšW|
 | k r]d  | |
 <q]q]Wx�| j	 ƒ  D]s} | | } | d  k rd  |	 | <qðg  } d } x§ | D]Ÿ }
 | |
 rL| j d  ƒ q,| |
 rf| j d  ƒ q,t  | ƒ d k rº| |
 d d k r¦| j d  ƒ | d 7} qË| j | |
 ƒ q,| j | |
 ƒ q,W| d  k	 rè| | } n t
 j | ƒ } |  j j rˆxò | D]w } | d  k r)d  |	 | <q
t
 j | | | ƒ } | |  j j k rwt
 j | | | g ƒ } | |	 | <q
| |	 | <q
Wnp t  | ƒ | d k rÝxW | D]1 } | | d d k rÌ| |	 | <q¥d  |	 | <q¥Wn x | D] } | |	 | <qäW|  j rð|	 | d d  k	 rcxH t | ƒ D]7 \ }
 } |
 d k rGd  |	 | <q"| | d |	 | <q"WqcqðqðW|	 S(   Ni    t   oht   sht   meiÿÿÿÿi   t   UNCLASSIFIEDt   OUTLIERt   Cg_exot   Cg_endoi   (   R1  R2  R3  R4  (   R1  R2  R3  R4  (   R3  R4  (   R3  R4  (   RC   t   AssertionErrorR   t   countR(   R@   RB   Rœ   RG   R’   R   t   get_angle_averageR#   t   target_dampingt   angle_distancet   damping_limitR   (   R1   Rþ   Rÿ   R   R  R  t   chi_numt   clusterst   usedR  RT   t   targett   max_it   ang_it   jt   ang_jt   nonstandard_chit
   is_prolinet   chi_matchingt   chi_counterR<   t   clustert   cluster_anglest   cluster_outliersR  t   ct   c_distt   d_target(    (    sR   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/torsion_restraints/torsion_ncs.pyR  M  sæ    %						



	 c         C   s   |  j  | _  d  S(   N(   R&   (   R1   RÕ   (    (    sR   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/torsion_restraints/torsion_ncs.pyR%  á  s    c         C   sO   g  } t  j  d | d t ƒ |  _ x' |  j j D] } | j | j ƒ  ƒ q. W| S(   NR   t   outliers_only(   R   RB   R    Rè   RG   Rê   (   R1   R   t   rama_outliersR‚   (    (    sR   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/torsion_restraints/torsion_ncs.pyR  å  s    c         C   s   t  j d | ƒ \ } } } | S(   NR   (   R   t   analyze(   R1   R   t   cis_peptidest   trans_peptidest   omega_outliers(    (    sR   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/torsion_restraints/torsion_ncs.pyR  í  s    c         C   s[  t  j  d | ƒ |  _ i  } i  } i  } i  } x: |  j j D], } | j | | j ƒ  <| j | | j ƒ  <q: Wxú |  j j ƒ  D]é } | d d !d | d d !} g  | | <| j | ƒ }	 |	 d  k	 rá |	 d k rá | | j
 |	 ƒ n  x |  j | D]p }
 |
 d d !d |
 d d !} | j | ƒ } | d  k	 rï | d k rï | | | k r_| | j
 | ƒ q_qï qï Wqz Wxá | j ƒ  D]Ó } xÊ | j ƒ  D]¼ } x³ | j ƒ  D]¥ } t  j | ƒ } x� | j ƒ  D] } | j | j ƒ } |  j j | | ƒ } | d  k	 r¼t j d | j d | j d	 | j d
 | j d | j ƒ } | | | <q¼q¼WqšWq‡WqtW| | | | f S(   NR   i   i
   Rü   i    R2  t   chain_idt   resseqR´   t   icodet   altloc(   R   R‚   Rè   Ré   Rê   t   scoreRŽ   R’   RŒ   R   RG   R>   R?   t   residue_groupst   construct_complete_sidechaint   atom_groupsRV  R)   t   measureChiAnglesR   t   idRT  R´   RU  (   R1   R   Rì   Rí   Rî   Rï   Rð   R<   R¯   t	   model_rott	   match_rest   j_keyt   j_rott   modelRg   t   residue_groupt   all_dictt
   atom_groupt	   atom_dictt   chis(    (    sR   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/torsion_restraints/torsion_ncs.pyRæ   ò  sH    
					c   )      C   sQ  d |  _  |  j d  k rQ t j d | d | d |  j d |  j d |  j ƒ |  _ n  |  j d  k rr | j ƒ  |  _ n  | j	 ƒ  } x* | j
 ƒ  D] } | j }	 | |	 | _ q‹ Wd }
 |  j } | d  k rÒ |  j } n  t d d	 | ƒ|  j j d
 | ƒ |  j d | ƒ \ } } } } i  } i  } x6|  j j ƒ  D]%} | d d !| d d !} | j | ƒ } | d k r/d  } d } x· |  j | D]¨ } | d d !| d d !} | j | ƒ } | j | ƒ } | d  k	 r‚| d  k	 r‚| d k r*| d  k r| } | } | } q'| | k r'| } | } | } q'q*q‚q‚W| d  k rT| | | <| | | <qTq/q/W| j	 ƒ  } | j ƒ  } xÚ| j ƒ  D]Ì} xÃ| j ƒ  D]µ} t j d | ƒ s®q�n  x”| j ƒ  D]†}  t j |  ƒ }! xn|  j ƒ  D]`}" |" j d' k røqÝn  t j d | j d |  j  d |" j d |  j! d |" j" ƒ } | | j ƒ  k rÝt j# d |" d |  j$ d |  j% d |  j& d |! d | ƒ \ } }# }$ | d }% | | }& |  j$ j' d |% d |& ƒ }' |# d  k	 r=|' d  k	 r=|  j j( d |" d |! d  |# d! |' d" |& d# | d | d$ | ƒ }( |( r:| d% | |& f IJ|  j  d& 7_  q:q=qÝqÝWq»Wq�Wq}Wd  S((   Ni    R   t   xray_structureRq   R   R"   i   s   Correcting NCS rotamer outliersR$  R    i   i   R2  g        Rg   t   PROt   GLYRS  RT  R´   RU  RV  Rd  t   sidechain_anglesR-   R+   Rc  Rs   iýÿÿÿt   residue_nameRé   t   m_chist   r_chisRä   t   sites_cart_movingR<   s   Set %s to %s rotameri   (   Rh  Ri  ()   t   last_round_outlier_fixesR%   R   R   t   managerRq   R   R"   Rƒ   Rs   R„   RP   t   xyzR    R   t   prepare_mapRæ   RŽ   R’   RŒ   t	   deep_copyR>   R?   R   t   is_protein_chainRX  R   RY  RZ  R´   Rê   R\  RT  RU  RV  t   evaluate_rotamerR)   R-   R+   t   get_rotamer_anglest   search()   R1   Rg  t   geometry_restraints_managerR   RM  R"   t   quietRs   R­   RP   t   selection_radiusR    Rì   Rí   Rî   Rï   t   fix_listt   rotamer_targetsR<   R¯   R]  Rä   RW  R^  R_  R`  t   j_scoreR>  Rn  t   sites_cart_backupRa  Rg   Rb  Rc  Rd  Rl  t   valueRk  t   cur_rotamerRm  t   status(    (    sR   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/torsion_restraints/torsion_ncs.pyt   fix_rotamer_outliers  s¸    						 	
									

		c         C   s   t  j | |  j | ƒ } | S(   N(   R   R>  Rƒ   (   R1   Rs   R  t   t(    (    sR   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/torsion_restraints/torsion_ncs.pyt   get_sites_cc�  s    		c      
   C   sé  i  } i  } |  j  } t j d | ƒ \ } } | j ƒ  } x£| j ƒ  D]•}	 xŒ|	 j ƒ  D]~}
 t j d |
 ƒ sw qY n  x]|
 j ƒ  D]O} t j	 | ƒ } x7| j
 ƒ  D])} | j d k rÁ q¦ n  | j ƒ  d j ƒ  d | j ƒ  d j } | j ƒ  j ƒ  } | j ƒ  j ƒ  } t j ƒ  } x` t | ƒ D]R \ } } |  j | d d !} | d k r)| | j ƒ  d k r)| j | ƒ q)q)W| j | ƒ } |  j | | ƒ } | | | <t j | |  j | d ƒ } | | | <q¦ Wq„ WqY WqF W| | f S(   NR    Rg   Rh  Ri  i    i   s    N  s    CA s    C  s    O  t   Ht   Dg      ð?(   s   PROs   GLY(   s    N  s    CA s    C  s    O  (   R…  R†  (   R    R   Rr  Rs   R>   R?   Rt  RX  R   RY  RZ  R´   R„   t   pdb_label_columnsRL   t   extract_i_seqt   extract_elementR   t   size_tR@   Rq   R
  RG   R‹   R„  R   t   all_sites_above_sigma_cutoffRƒ   (   R1   Rg  R   t   map_cc_hasht   sigma_cutoff_hashR    R  t   residual_map_dataRn  Ra  Rg   Rb  Rc  Rd  R<   t   residue_iselectiont   residue_elementst   sidechain_only_iselectionRT   RP   Rß   t   sites_cart_residuet   t_testt   sigma_state(    (    sR   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/torsion_restraints/torsion_ncs.pyt   get_sidechain_map_correlation–  sF    			
	c   -      C   sç  d |  _  |  j d  k rQ t j d | d | d |  j d |  j d |  j ƒ |  _ n  |  j d  k rr | j ƒ  |  _ n  | j	 ƒ  } x* | j
 ƒ  D] } | j } | | | _ q‹ W|  j }	 | d  k rÌ |  j } n  t d d | ƒ|  j j d	 |	 ƒ |  j d | ƒ \ }
 } } } | j	 ƒ  } |  j | | ƒ \ } } g  } xt|  j j ƒ  D]c} g  } | j | ƒ } d  } d  } | d  k	 rœ| j | | f ƒ | } | } n  x| |  j | D]m } | j | ƒ } | d  k	 rª| j | | f ƒ | d  k rù| } | } q| | k r| } | } qqªqªW| d  k sG| d
 k r9qGn  xn | D]f } | d } | d } | d
 k rod } n  | | | } | d k r@| | s¦| j | ƒ q¦q@q@WqGWx2| j ƒ  D]$} x| j ƒ  D]} t j d | ƒ sìqÎn  xì| j ƒ  D]Þ} t j | ƒ } xÆ| j ƒ  D]¸}  |  j d) k r6qn  t j d | j  d | j! d |  j d | j" d |  j# ƒ } | | k rt$ | | ƒ d k rÓ|  j
 ƒ  d j% ƒ  d |  j
 ƒ  d j& }! |! | k rÎqn  t j' d |  d |  j( d |  j) d |  j* d | d | ƒ \ }" }# } | d }$ |" d k r,qn  |" }% d  }& x/ |  j
 ƒ  D]! } | j+ d  k rE| j }& qEqEWx× | j | ƒ D]Æ }' |' |" k r’qzn  |  j( j, d! |$ d" |' ƒ }( |# d  k	 rz|( d  k	 rz|  j j- d |  d | d# |# d$ |( d% |' d& | d | d' | ƒ }) |) r@|' }% | j |  j# ƒ }* |  j( j. |  |* | ƒ }# q@qzqzW|% |" k ry|  j d( | |% f IJ|  j  d 7_  qÐt j' d |  d |  j( d |  j) d |  j* d | d | ƒ \ }+ }, } |+ |" k sÐt/ ‚ qÓqqWqùWqÎWq»Wd  S(*   Ni    R   Rg  Rq   R   R"   s    Checking NCS rotamer consistencyR$  R    g        i   g-Cëâ6?gš™™™™™É?Rg   Rh  Ri  RS  RT  R´   RU  RV  i   i   Rd  Rj  R-   R+   Rc  Rs   iýÿÿÿR2  s    CA Rk  Ré   Rl  Rm  Rä   Rn  R<   s   Set %s to %s rotamer(   s   PROs   GLY(0   t   last_round_rotamer_changesR%   R   R   Rp  Rq   R   R"   Rƒ   Rs   R„   RP   Rq  R    R   Rr  Ræ   R•  Rš   R’   RŒ   RG   R>   R?   R   Rt  RX  R   RY  RZ  R´   Rê   R\  RT  RU  RV  RC   R‡  RL   Ru  R)   R-   R+   R-  Rv  Rw  R[  R5  (-   R1   Rg  Rx  R   R"   Ry  Rs   R­   RP   R    Rì   Rí   Rî   Rï   Rn  RŒ  R�  t   cc_candidate_listR<   t	   whole_setR  t   maxt   max_keyt   membert   setRÃ   t	   cur_valuet
   percentageRa  Rg   Rb  Rc  Rd  t   cc_keyR]  Rl  Rk  t   current_bestt   cur_caR€  Rm  R�  Re  Rä   Rf  (    (    sR   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/torsion_restraints/torsion_ncs.pyt   fix_rotamer_consistencyÀ  sü    						 		

	
									
		

				c         C   sí  |  j  } t j j ƒ  } d  } x–|  j j D]ˆ} | j d } g  } t }	 d }
 xX |  j	 | D]I } |
 d k r‹ d | d | d f }
 q^ |
 d | d | d f 7}
 q^ W|
 d 7}
 | d |
 } x› | j d D]Œ } d }
 xX |  j	 | D]I } |
 d k rd | d | d f }
 që |
 d | d | d f 7}
 që W|
 d 7}
 | d |
 } | j
 | ƒ qÑ Wt j j j d | d	 | d
 | d | j d | j d t d | ƒ } | j j
 | ƒ q+ Wt | j ƒ d k rÝ| d IJ| Jn | | j _ d  S(   Ni    Rr   s   (resseq %d:%di   s    or resseq %d:%dt   )s    and t   processed_pdbt   reference_selection_stringt   selection_stringsR   R   t   special_position_warnings_onlyR"   s"   No NCS restraint groups specified.(   R"   R   R	   t   groupsR   R#   RA   R   R(   R�   RG   RQ   t   from_atom_selectionsR   R   RB   t   membersRC   t   restraints_managert   torsion_ncs_groups(   R1   Ra  t   processed_pdb_fileR"   R!   Rs   t   param_groupt   masterR¦  t   found_offsett
   range_textt   rangeR   t   temp_selectionRQ   (    (    sR   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/torsion_restraints/torsion_ncs.pyt   process_ncs_restraint_groupsS  sH    	 
 
			
c         C   sÉ   i  } x’ |  j  j j ƒ  D]~ } | d d !j ƒ  } | j | ƒ d  k rT i  | | <n  d } x" |  j  j | D] } | | 7} qk W| d } | | | | <q Wd | d d <d | d d <d | d	 d <| S(
   Ni    i   Rr   i   t   chi1t   ILEs    N   CA  CB  CG2t   THRt   VAL(   R)   t   atomsForAngleR’   R+  RŒ   R   (   R1   R�   R<   R´   t   new_keyR­   t	   new_value(    (    sR   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/torsion_restraints/torsion_ncs.pyR€   ~  s    
c         C   sš   i  } | j  ƒ  } x� |  j D]v } xm | D]e } t j d | d | g ƒ } d | | <x7 |  j D], } | j d | k r^ | | c d 7<q^ q^ Wq) Wq W| S(   NR3   R4   i    i   (   RE   R!   R   RD   R&   RŠ   (   R1   R   t   torsion_countst	   sel_cacheRQ   R   RV   Rp   (    (    sR   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/torsion_restraints/torsion_ncs.pyt"   get_number_of_restraints_per_group�  s    	
c   
   
   C   sú  d  |  _ d  |  _ d  |  _ d  |  _ t j j ƒ  } t j j ƒ  } xg |  j D]\ } t j j	 d | d | ƒ } t
 | j ƒ } | |  j k r› | j | ƒ qL | j | ƒ qL Wt j j d | d | ƒ } t j j d | d | ƒ } t j j d | d |  j ƒ }	 t | ƒ d k r]t j d t j
 | ƒ d d d |  j d	 d
 ƒ |  _ |  j d | ƒ |  _ n  t | ƒ d k rÌ|  j d k  rÌt j d t j
 | ƒ d |  j d t j t t j
 | ƒ ƒ ƒ d	 d
 ƒ |  _ n  t |	 ƒ d k rö|  j d |	 ƒ |  _ n  d  S(   NRs   Rö   t   proxiesi    t   datat   data_ming        t   data_maxt   n_slotsi
   t   deltasg     €f@(   R   t   histogram_under_limitt   histogram_over_limitt   torsion_rmsdt   all_torsion_rmsdR”   R•   R–   R&   R  t   abst   deltaR   RG   t   dihedral_deltasRC   R   t	   histogramt   calculate_torsion_rmsdt   matht   ceilR™  (
   R1   Rs   t   dp_proxies_under_limitt   dp_proxies_over_limitRp   R  RÊ  t   torsion_deltas_under_limitt   torsion_deltas_over_limitt   torsion_deltas_all(    (    sR   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/torsion_restraints/torsion_ncs.pyt   get_torsion_rmsd�  sR    												c         C   sZ   t  | ƒ d k s t ‚ d } x" | D] } | t | ƒ d 7} q% Wt j | t  | ƒ ƒ S(   Ni    g        i   (   RC   R5  RÉ  RÎ  t   sqrt(   R1   RÄ  t   delta_sq_sumRÊ  (    (    sR   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/torsion_restraints/torsion_ncs.pyRÍ  Ë  s
    c         C   sv   |  j  d  k	 s t ‚ t d |  j d |  j d |  j d |  j d d  d |  j d |  j	 d |  j  j
 | | ƒ d	 |  j ƒ 	S(
   NR    R#   R   R   R   R!   R'   R&   R"   (   R&   R   R5  R   R    R#   R   R   R!   R'   t   proxy_selectR"   (   R1   t   nseqt
   iselection(    (    sR   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/torsion_restraints/torsion_ncs.pyR‹   Ò  s    						N(!   t   __name__t
   __module__R   R2   R/   R0   R×   RŸ   R›   R˜   R�   Rã   Rõ   R¡   R#  R&  R  R  R%  R  R  Ræ   R(   R‚  R„  R•  R¢  R´  R€   R¾  RÕ  RÍ  R‹   (    (    (    sR   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/torsion_restraints/torsion_ncs.pyR   X   sR   )	q	õ					
			«		%	”				1h			.Ž	+			.	RN   c           B   s   e  Z d  „  Z RS(   c          C   s†  g  } i  } g  } i  } | j  ƒ  d j ƒ  }	 t j | | | ƒ }
 xst |	 ƒ D]e\ } } t } x: | j ƒ  D], } | j ƒ  r• | j ƒ  r• qo qo t	 } qo W| s« qP n  t j
 | ƒ } | d  k rÌ qP n  | rè d | j | f } n d | j } x½|	 | d D]­} t } x: | j ƒ  D], } | j ƒ  rC| j ƒ  rCqqt	 } qW| sYqn  t j
 | ƒ } | d  k rzqn  | r–d | j | f } n d | j } |
 j | |
 j | f } |
 j | |
 j | f } |
 j | |
 j | f } t | d ƒ d k rt | d ƒ d k st | d ƒ d k rOt | d ƒ d k rOqn  t j d | d | d | d | d	 | ƒ } | | f } | | | <t t | ƒ | j ƒ  | j ƒ  ƒ t t | ƒ | j ƒ  | j ƒ  ƒ | j k r| j | f } | j | f } | d  k	 r| | k rqqn  d  } | | k rbx0 | j ƒ  D] } | | | k r<| } q<q<Wn  | d  k rw| } n  | | k r�g  | | <n  | | j | ƒ | j | ƒ qqWqP Wx´ | j ƒ  D]¦ } g  } | ród | d | d f } n d | d } | j | ƒ xN | | D]B } | r@d | d | d f } n d | d } | j | ƒ qW| j | ƒ qÆW| |  _ | |  _ d  S(
   Ni    s   chain '%s' and segid '%s's
   chain '%s'i   R#   R5   R6   R7   R"   (   R>   R?   R   t   alignment_managerR@   R(   t
   conformerst
   is_proteint   is_naRB   t   get_unique_segidR   R\  R5   R6   R7   RC   RH   t   mint   residue_groups_sizeR™  t
   similarityR’   RG   R'   R!   (    R1   R   R8   R#   R"   R!   R'   t   used_chainst	   pair_hashR?   t   amRT   R«   t   found_conformert	   conformert   segid_it   chain_i_strR®   t   segid_jt   chain_j_strR^   R_   R`   Ra   R<   t   pair_keyt	   match_keyt
   assign_keyt	   group_keyR\   t	   chain_strt	   add_chain(    (    sR   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/torsion_restraints/torsion_ncs.pyR2   â  s´    




,,		
					(   RÛ  RÜ  R2   (    (    (    sR   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/torsion_restraints/torsion_ncs.pyRN   á  s   c      	   C   s¬   |  j  ƒ  | d  k r% t j ƒ  } n  | d  k r= t j } n  t |  j ƒ  ƒ } t j	 g  | D] } | j
 ^ q\ ƒ } | j d ƒ } t d |  d | d | d | ƒ } | j S(   Ns       R   R8   R#   R"   (   R.   R   R   R   R   R   RI   RJ   R   RK   RL   RM   RN   R!   (   R   R#   R"   Rb   Rc   Rd   R8   Re   (    (    sR   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/torsion_restraints/torsion_ncs.pyt   determine_ncs_groupsL  s    
%	t   _run_determine_ncs_groupsc           B   s   e  Z d  „  Z d „  Z RS(   c         C   s   | |  _  | |  _ d  S(   N(   R#   R   (   R1   R#   R   (    (    sR   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/torsion_restraints/torsion_ncs.pyR2   `  s    	c         O   s   t  d |  j d |  j ƒ S(   NR#   R   (   Rô  R#   R   (   R1   t   argst   kwds(    (    sR   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/torsion_restraints/torsion_ncs.pyt   __call__d  s    	(   RÛ  RÜ  R2   Rø  (    (    (    sR   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/torsion_restraints/torsion_ncs.pyRõ  _  s   	(/   t
   __future__R    t   cctbx.geometry_restraintsR”   t   mmtbx.validationR   R   R   t   mmtbx.rotamer.sidechain_anglesR   t   mmtbx.rotamerR   t   mmtbx.refinementR   t   cctbx.array_familyR   t
   iotbx.philt   iotbxt   libtbx.str_utilsR   R   RÎ  t	   mmtbx.ncsR	   t   libtbx.utilsR
   t   mmtbx.torsion_restraintsR   R   t   mmtbx.geometry_restraintsR   t   mmtbxR   t   mmtbx.utilst   libtbxR   RB   R	  t   philt   parseR   t   objectR   RN   R   Rô  Rõ  (    (    (    sR   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/torsion_restraints/torsion_ncs.pyt   <module>   s>   	=	ÿ ÿ ÿ ÿ ÿ Žl