ó
±™xTc           @   sx  d  d l  m Z d  d l m 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 Z d  d l Z d  d l 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  d l Z e j j d
 ƒ Z d d „ Z  d „  Z! d „  Z" d „  Z# d „  Z$ d d „ Z% d „  Z& d d d „ Z' d d „ Z( d „  Z) d d e* d d „ Z+ d „  Z, d d d d „ Z- d „  Z. d „  Z/ d e0 f d „  ƒ  YZ1 d, d d d d d „ Z2 d  „  Z3 d d! „ Z4 d" d d# „ Z5 d d d$ „ Z6 e* e* d d% „ Z7 d& e0 f d' „  ƒ  YZ8 e9 d( k rte j ƒ  Z: e2 d) e j; d* ƒ d+ e j ƒ  e: GHn  d S(-   iÿÿÿÿ(   t   division(   t   tools(   t   print_statisticsN(   t   adptbx(   t   flex(   t   Sorry(   t   Auto(   t   deepcopysh   
  pdb_file = None
    .type = path
  nproc = 1
    .type = int
  random_seed = 4865136
    .type = int
c         #   sÉ  t  |  ƒ ‰  t ˆ  ƒ } | d  k r* | n | } | | k r@ d  St | ƒ } t | | | d ƒ } t  ‡  f d †  | |  Dƒ ƒ VxA| rÄx4t t | ƒ ƒ D]} | | c d 8<| | d k rõ | | d | | | d !| | )| | | | <q� | | } | | | | | | <| | <g  } t } xc | |  D]W }	 ˆ  |	 }
 t | ƒ } | d k r| | d |
 d k rt } Pn  | j |
 ƒ q5W| r¸t  ‡  f d †  | |  Dƒ ƒ Vn  Pq� Wd  Sq„ Wd  S(   Niÿÿÿÿc         3   s   |  ] } ˆ  | Vq d  S(   N(    (   t   .0t   i(   t   pool(    sP   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/command_line/find_tls_groups.pys	   <genexpr>'   s    i   i    c         3   s   |  ] } ˆ  | Vq d  S(   N(    (   R   R	   (   R
   (    sP   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/command_line/find_tls_groups.pys	   <genexpr>:   s    (   t   tuplet   lent   Nonet   ranget   reversedt   Truet   Falset   append(   t   iterablet   rt   nt   indicest   cyclesR	   t   jt   tmpt   goodt   kt   xt   ltmp(    (   R
   sP   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/command_line/find_tls_groups.pyt   consequtive_permutations    s:     	!

$ "c         C   sñ  t  t |  ƒ ƒ } g  | D] } | g ^ q } t  t d |  ƒ ƒ } | j ƒ  d „  } d „  } | g } x½| D]µ} x¬t |  ƒ D]ž}	 g  }
 g  } xƒ t | ƒ D]u \ } } | |	 k râ | |	 | d k râ | j | d ƒ n |
 j | ƒ t | ƒ | k r¢ |
 j | ƒ g  } q¢ q¢ Wg  } | |
 | ƒ rƒ | j |
 ƒ | j |
 ƒ xÔ t |
 ƒ D]Ã \ } } g  } xv t |
 ƒ D]h \ } } | | k rÂt | | ƒ d k rÂ| j | d | d g ƒ qv| | k rv| j | ƒ qvqvW| | k rW| | | ƒ rW| j | ƒ | j | ƒ qWqWWqƒ qƒ Wqp Wd „  } xñ t | ƒ D]ã \ } } xÔ t | ƒ D]Æ \ } } | | k rXx« | D]  } g  }
 |
 j | ƒ | |
 ƒ } xx | D]p } | | k r£| | | ƒ r£|
 j | ƒ | |
 | ƒ r|
 j ƒ  |
 | k r| j |
 ƒ g  }
 Pqqq£q£WqwWqXqXWq?Wg  } xS | D]K } g  } x% | D] } | j ƒ  | j | ƒ qFW| j ƒ  | j | ƒ q3W| } | j ƒ  xX t | ƒ D]J \ } } x; t | ƒ D]- \ } } | | k r¸| | k såt	 ‚ q¸q¸WqŸW| S(   Ni   c         S   sX   g  } x; |  D]3 } x* | D]" } | | k r | j  | ƒ q q Wq W| j ƒ  | | k S(   N(   R   t   sort(   R   t   usR   R	   R   (    (    sP   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/command_line/find_tls_groups.pyt   is_allD   s     
c         S   s%   x |  D] } | | k r t  Sq Wt S(   N(   R   R   (   t   vt   tR	   (    (    sP   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/command_line/find_tls_groups.pyt   not_inK   s    i   i    c         S   sH   g  } x; |  D]3 } x* | D]" } | | k r | j  | ƒ q q Wq W| S(   N(   R   (   R   R   R	   R   (    (    sP   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/command_line/find_tls_groups.pyt   h1k   s     (
   t   listt   xrangeR   t   reverset	   enumerateR   R   t   absR   t   AssertionError(   t   Nt
   unique_setR	   t   arrayt   gssR!   R$   t   resultt   gst   start_indexR   t   tmp_t   at   tmp__t   tit   ztmpR   t   tjR%   t   xtmp_t   ytmp_t   xtmp__t   tmplt   ytmp__R   t   r_t   n_t   r__t   rit   rj(    (    sP   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/command_line/find_tls_groups.pyt   all_permutations?   s€    
		
 "  	



 c         C   s±  g  g  } } d } d } d } xt  |  ƒ D]\ } } | | d j ƒ  7} | d } | t |  ƒ k  râ | d |  | d k r� | j | ƒ q1| j | ƒ | j | ƒ x" | D] }	 | |	 d j ƒ  7} q± Wg  } | d 7} q, | j | ƒ | j | ƒ x" | D] }	 | |	 d j ƒ  7} qWg  } | d 7} q, Wd }
 x? t  | ƒ D]1 \ } } x" | D] } |
 | d j ƒ  7}
 q[WqHWt | |
 | g ƒ t | |
 | g ƒ k s­t ‚ | S(   Ni    i   (   R)   t   sizeR   R   t   mint   maxR+   (   t   residuest   selst   selt   cntrt   chs1t   cntr3R	   R   t   nextt   sst   chs2t   st   s_(    (    sP   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/command_line/find_tls_groups.pyt   group_residues”   s8    
   0c         C   s]  g  } d } d  } d } xQ t |  ƒ D]C \ } }	 | t |	 ƒ 7} t |	 ƒ | k  r% | } t |	 ƒ } q% q% Wx™t |  ƒ | k s� | | k  rg  }
 d } d  } xA t |  ƒ D]3 \ } }	 t |	 ƒ | k  r¬ | } t |	 ƒ } q¬ q¬ W| | k  st |  ƒ | k ro d \ } } | d d k r.|  | d } n  | d t |  ƒ k  rU|  | d } n  | | g j d  ƒ d k r8t | ƒ t | ƒ k  ràt |  | d ƒ } t |  | ƒ } | j | ƒ | |  | d <|  |  |  | d }  qt |  | ƒ } t |  | d ƒ } | j | ƒ | |  | <|  | d  |  | d }  q| d  k	 rœt |  | d ƒ } t |  | ƒ } | j | ƒ | |  | d <|  |  |  | d }  q| d  k	 r t |  | ƒ } t |  | d ƒ } | j | ƒ | |  | <|  | d  |  | d }  qPqo qo Wd } x* t |  ƒ D] \ } }	 | t |	 ƒ 7} qW| | k sYt | | g ƒ ‚ |  S(   Ng    €„.Ai    i   i   (   NN(   R   R)   R   t   countR   t   extendR+   (   RH   RG   t   fragment_sizet   max_selsRI   t   min_sizet   i_mint   chsum1t   i_seqRP   t   new_selst   lR   R   t   yt   chsum2(    (    sP   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/command_line/find_tls_groups.pyt   regroup_groups´   sj    !  

c         C   sà   g  } xÓ |  D]Ë } t  | ƒ | d k rË d } x% | D] } | d r6 | d 7} q6 q6 W| d t  | ƒ d k  r» d } g  } xH | t  | ƒ k  r· | j | | | | !ƒ | | 7} q€ WqØ | j | ƒ q | j | ƒ q W| S(   Ni   i    i   g      Y@g      I@(   R   R   (   RH   RU   R[   RI   t
   is_ss_cntrRQ   t   nct   new_sel(    (    sP   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/command_line/find_tls_groups.pyt   split_groupsë   s     
 c         C   sŽ   | d  k r t j } n  d } xi t |  ƒ D][ \ } } d } x% | D] } | d rD | d 7} qD qD Wt | ƒ | k  r+ t | ƒ } q+ q+ W| S(   Ng    €„.Ai    i   (   R   t   syst   stdoutR)   R   (   RH   t   outt   min_group_sizeR	   RP   R`   RQ   (    (    sP   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/command_line/find_tls_groups.pyt   show_groups   s    
  c         C   sk   g  } x^ |  D]V } t  j ƒ  } x | D] } | j | d ƒ q& W| j ƒ  d k r | j | ƒ q q W| S(   Ni    (   R   t   size_tRT   RD   R   (   RH   R0   RP   R>   RQ   (    (    sP   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/command_line/find_tls_groups.pyt   sels_as_selection_arrays  s     i   c         C   s‡  | d  k r t j } n  d } | d IJt |  ƒ } | d I| IJ| d IJt d | ƒ } | d It | ƒ IJ| d IJ| d It | ƒ IJt d | d | ƒ } t d | ƒ t | ƒ | k så | | k  r*t | ƒ d	 k r*| d
 IJt | |  | | ƒ } | d It | ƒ IJt d | ƒ n  t | ƒ } | d k r^d d l m	 } | j
 }	 n| d k r†d d l m }
 |
 j
 }	 n÷ | d k r®d d l m } | j
 }	 nÏ | d k rÖd d l m } | j
 }	 n§ | d k rþd d l m } | j
 }	 n | d k r&d d l m } | j
 }	 nW | d	 k rDd g g g }	 n9 | d k  rqt t t t | ƒ ƒ ƒ ƒ }	 n t d ƒ ‚ | |	 f S(   Ni   s-     Grouping residues by secondary structure...s     Fragment size:s       Initial groups...RH   s         n_groups=s#       Splitting groups is necesary...RU   i   s<     Re-grouping to achieve maximum possible nuber of groups...s       n_groups=i
   iÿÿÿÿ(   t   perm10i   (   t   perm11i   (   t   perm12i   (   t   perm13i   (   t   perm14i   (   t   perm15i    s   Too many permutations.(   R   Rd   Re   RR   Rh   R   Rc   R_   t	   mmtbx.tlsRk   t   resRl   Rm   Rn   Ro   Rp   RC   R&   R'   t   RuntimeError(   RG   t   secondary_structure_selectionRV   Rf   RU   RH   Rg   t   len_new_selsRk   t   permsRl   Rm   Rn   Ro   Rp   (    (    sP   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/command_line/find_tls_groups.pyt   get_model_partitioning  sV    


0
!c         C   sÚ  | d  k r t j } n  t j ƒ  } t j j } g  } xZ|  j ƒ  D]L} xC| j	 ƒ  D]5} g  } xû | j
 ƒ  D]í }	 t j ƒ  }
 t } x˜ |	 j ƒ  D]Š } | d | j ƒ d k sÊ | d | j ƒ d k r” xQ | j ƒ  D]@ } |
 j | j ƒ | s| | j } n  | j | | j ƒ q× Wq” q” W|
 j ƒ  d k ro | j |
 | |	 j ƒ  |	 j ƒ  g ƒ qo qo Wt | ƒ d k rV | j | j | g ƒ qV qV WqC W| d IJx0 | D]( } | d | d t | d ƒ f IJq¤W| | f S(   Nt   namet   common_amino_acidt   common_rna_dnai    s   Considering these chains:s.     chain '%s' (number of residues selected: %d)i   (   R   Rd   Re   R   t   boolt   iotbxt   pdbt   common_residue_names_get_classt   modelst   chainst   residue_groupsRi   R   t   atom_groupst   resnamet   atomsR   RZ   RD   t   residt   unique_resnamesR   t   id(   t   pdb_hierarchyRt   Rf   t!   new_secondary_structure_selectiont	   get_classt   chains_and_residue_selectionst   modelt   chainR0   t   rgt   result_t   is_secondary_structuret   agt   atomt   ch(    (    sP   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/command_line/find_tls_groups.pyt   chains_and_atomsI  s:    &!
&c         C   sk   g  } x^ | D]V } t  j ƒ  } x4 | D], } x# |  | D] } | j | d ƒ q7 Wq& W| j | ƒ q W| S(   Ni    (   R   Ri   RT   R   (   t   groupst   permR0   t   pt	   one_groupt   p_t   g(    (    sP   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/command_line/find_tls_groups.pyt   tls_group_selectionsk  s    id   c            s!  |  j  | ƒ } | j d t j | j ƒ  d ƒ ƒ } | | g j d  ƒ d k sT t ‚ | st j	 d | d | d | j  | ƒ ƒ ‰  t
 ‡  f d † } | ƒ  }	 t j d |	 d d	 t |	 d d
 !ƒ d t |	 d
 ƒ d | d | d | j  | ƒ ƒ }
 d d d „  ƒ  Y} |
 | _ | S| d  k	 rªt j d | j  | ƒ d d d d d d d g d d d d d d d g d d d d d d d d d d g	 d t
 d t
 d t
 d | d | d | ƒ 
St j d | j  | ƒ d d g d d d d d d d g d d d d g d t
 d t
 d t
 d | d | d | ƒ 
} | Sd  S(   Nt   weightsi   t   origint
   sites_cartt   u_isoc            sz   |  s+ ˆ  j  j ƒ  ˆ  j  j ˆ  j ƒ } nK t j j j d ˆ  j  d d d d ƒ } | j ƒ  j	 ƒ  } | j ˆ  j ƒ } | S(   Nt   mt   relative_epsilongê-�™—q=t   absolute_epsiloni    (
   R4   t   matrix_inversion_in_placet   matrix_multiplyt   bt   scitbxt   linalgt   eigensystemt   real_symmetrict   generalized_inverse_as_packed_ut   matrix_packed_u_as_symmetric(   t   use_generalized_inverseRr   t   esR4   (   t   obj(    sP   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/command_line/find_tls_groups.pyt   s1  s    		R#   i    R\   i   RP   t   u_isost   fooc           B   s   e  Z RS(    (   t   __name__t
   __module__(    (    (    sP   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/command_line/find_tls_groups.pyR±   ”  s    t   uanisot	   T_initialt	   L_initialt	   S_initialt   refine_Tt   refine_Lt   refine_St   sitest   max_iterationst   uiso(    (   t   selectt   mean_weightedR   t   doubleRD   RS   R   R+   R   t   tls_ls_derivative_coefficientsR   t   ls_target_from_iso_tlsR   t   ft   tls_from_uaniso_minimizert   tls_from_uiso_minimizer(   Rž   t	   selectiont   u_cartRŸ   t   use_minimizerR¼   t   sites_cart_t   cmR¯   R0   t   targetR±   t	   minimized(    (   R®   sP   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/command_line/find_tls_groups.pyt   tls_refineryu  sX    $!			
		!			c         C   sp  t  t |  ƒ ƒ } |  | } | } d } d } g  } d } xª| |  k ræ| d 7} | t j d d ƒ t d | ƒ }	 | |	 }
 | d k s¥ | |
 k s¥ |
 |  k rÖ |  | } | } d } d } g  } d } d } n  |
 |  k sò |
 |	 |  k rû |  }
 n  | | k r| |	 |  k rPn  t | ƒ | d k r5Pn  t j | |
 ƒ } y. |  d | d k oq| t | ƒ d k } Wn1 t k
 r¨|  d | d k o¢| | k } n X| r= | j | ƒ | |	 7} t | ƒ | d k rãPqãq= q= Wg  } x‡ t	 | ƒ D]y \ } } | d k r(| j d | g ƒ qú| t | ƒ k rP| j | |  g ƒ qú| j | | d d | | g ƒ qúW| j | t | ƒ d d |  d g ƒ g  } xŠ | D]‚ } | d } | d } | d k rÜ| } n  | d } t
 j t | | ƒ ƒ } | j ƒ  d k s"t | | g ƒ ‚ | j | ƒ q­Wd } x | D] } | | j ƒ  7} q@W| |  k slt ‚ | S(   Ni    i   iÿÿÿÿi   g      à?id   (   R&   R'   t   randomt	   randranget   intR   RF   t	   ExceptionR   R)   R   Ri   R   RD   R+   (   RD   t   n_groupst   rpt
   chunk_sizeRa   t   countert   sum_sizeRr   t   checkt   chunk_size_RM   R   t   evR0   R	   R   R4   R¥   R>   RJ   RP   (    (    sP   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/command_line/find_tls_groups.pyt   chunks¸  st    

$
$
	 	   . $
   ')

 	
$i2   c   
      C   sÛ   | | g j  d  ƒ d k s! t ‚ d } x© t | ƒ D]› } x; t rw t d |  j ƒ  d | ƒ } t | ƒ | k r= Pq= q= Wt | ƒ | k s� t ‚ x< | D]4 } t d | d | d |  d | ƒ }	 | |	 j	 7} q— Wq4 W| | S(	   Ni   i    RD   RÒ   RÇ   RŸ   Rž   RÆ   (
   RS   R   R+   R'   R   RÚ   RD   R   RÍ   RÃ   (
   Rž   RÒ   RÇ   RŸ   t   n_runsR#   t   trt
   selectionsRÆ   t   mo(    (    sP   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/command_line/find_tls_groups.pyt   tls_refinery_random_groupsï  s    !	 !c         C   s2   t  j ƒ  } x |  D] } | j | d ƒ q W| S(   Ni    (   R   Ri   RT   (   RG   t   chain_selectionR   (    (    sP   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/command_line/find_tls_groups.pyt   chain_selection_from_residuesý  s    c         C   s‡   g  } xz | D]r } g  } x4 | D], } x# |  | D] } | j  | d ƒ q1 Wq  Wd | d | t | ƒ d f } | j  | ƒ q W| S(   Ni   s   resid %s through %si    i   (   R   R   (   R•   R–   R0   R—   R˜   R™   Rš   R…   (    (    sP   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/command_line/find_tls_groups.pyt%   permutations_as_atom_selection_string  s    
t   analyze_permutationsc           B   s   e  Z d  „  Z d „  Z RS(   c         C   s(   | |  _  | |  _ | |  _ | |  _ d  S(   N(   R•   Rž   RÇ   RŸ   (   t   selfR•   Rž   RÇ   RŸ   (    (    sP   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/command_line/find_tls_groups.pyt   __init__  s    			c      
   C   sd   t  |  j | ƒ } d } xE | D]= } t d |  j d |  j d |  j d | ƒ } | | j 7} q W| S(   Ni    RÇ   RŸ   Rž   RÆ   (   R›   R•   RÍ   RÇ   RŸ   Rž   RÃ   (   Rä   R–   RÝ   RË   RÆ   RÞ   (    (    sP   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/command_line/find_tls_groups.pyt   __call__  s    				(   R²   R³   Rå   Ræ   (    (    (    sP   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/command_line/find_tls_groups.pyRã     s   	c         C   s  | d  k r t j } n  t j d d | ƒd } t |  ƒ d k rL | GHd  Sg  } xø |  D]ð } t j j | ƒ rt	 j
 j | ƒ rµ t j j d t j j | ƒ ƒ } | j | ƒ qIy t j j d | ƒ }	 Wn! t k
 rñ t d | ƒ ‚ n X| j |	 ƒ qY y t j j | ƒ }
 Wn! t k
 r;t d | ƒ ‚ n X| j |
 ƒ qY Wt j d	 | ƒ } | j ƒ  } | j } | d  k s“t	 j
 j | ƒ rœd
 GHd  S| j d  k r·d | _ n  t	 j
 j d | ƒ } | j ƒ  } | j ƒ  } | j ƒ  | j ƒ  } t d | d | d | d | d | ƒ S(   Ns   phenix.find_tls_groupsRf   s‰   
phenix.find_tls_groups: Tool for automated partitioning a model into TLS groups.

Usage:
  phenix.find_tls_groups model.pdb [nproc=...]
i    s   pdb_file=%st	   file_names   Bad parameter file: %ss   Bad parameter: %st   sourcess   A model file is required.i   t   paramst   pdb_inpRˆ   t   xray_structure(   R   Rd   Re   R   t   make_headerR   t   ost   patht   isfileR|   R}   t   is_pdb_filet   libtbxt   philt   parset   abspathR   RÑ   R   t   master_philt   fetcht   extractt   pdb_filet   nproct   inputt   construct_hierarchyR„   t   reset_i_seqt   xray_structure_simplet   find_tls(   t   argsRé   Rˆ   Rë   Rf   t   default_messaget   cmdline_philt   argt   pdb_philt	   file_philt   arg_philt   working_philt   pdb_file_nameRê   t	   pdb_atoms(    (    sP   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/command_line/find_tls_groups.pyt   run#  sT    "    	
c      	   C   s(  | j  ƒ  | j  ƒ  k s t ‚ d } g  } x÷ | D]ï } d | } |  j ƒ  j d | j d d ƒ ƒ } xP t | ƒ D]B \ }	 }
 | |
 @j t ƒ d k rr t d | | |	 f ƒ ‚ qr qr W| j	 | ƒ | j  ƒ  | j  ƒ  k sã t ‚ | j t ƒ d k rþ q1 n  | t
 d | d | d	 | ƒ j 7} q1 W| S(
   Ni    s   (%s) and (not resname HOH)t   stringt   "t    s!   Overlapping TLS selections:
%s
%sRž   RÆ   RŸ   (   RD   R+   t   atom_selection_cacheRÆ   t   replaceR)   RS   R   Rs   R   RÍ   RÃ   (   Rˆ   Rž   RŸ   t   selection_stringsRË   t   all_selectionst   sel_strt   sel_str_finalRI   R   t   other(    (    sP   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/command_line/find_tls_groups.pyt   total_scoreU  s"    
	&c   	   	   C   så   | d  k r t j } n  |  j | ƒ } t j d d | ƒg  } t | j ƒ d k r� xA | j D]) } | d I| j IJ| j	 | j ƒ q_ Wn
 | d IJt | ƒ d k rá t
 d | d | d | d	 | ƒ } | J| d
 | IJn  d  S(   Ns   TLS groups from PDB file headerRf   i    s     s     ... none found.Rˆ   Rž   RŸ   R  s4   Total target for groups from PDB file header: %10.1f(   R   Rd   Re   t   extract_tls_paramsR   Rì   R   t
   tls_paramst   selection_stringR   R  (	   Rê   Rˆ   Rž   RŸ   Rf   t   pdb_inp_tlsR  t   tpt   total_target(    (    sP   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/command_line/find_tls_groups.pyt   external_tlsh  s&    
	i
   c   	      C   s7  | d  k r t j } n  t j |  ƒ } | d k rz g  } x: t t |  ƒ ƒ D]& } |  | d k rL | j | ƒ qL qL W| Sd } x° | |  j ƒ  k  r2| | |  j ƒ  k  r¿ |  | | | !} n
 |  | } | j ƒ  | d k r%t j |  ƒ } t j	 |  ƒ } t
 | | ƒ d k  r%t d ƒ ‚ q%n  | | 7} qƒ Wd  S(   Ni    i   gš™™™™™¹?s-   At least 10 bonded atoms have identical ADPs.(   R   Rd   Re   R   RE   R   R   R   RD   RF   R*   R   (	   RŸ   t   stepRf   t   min_adpt
   bad_i_seqsRZ   R	   t   u_iso_it   max_adp(    (    sP   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/command_line/find_tls_groups.pyt	   check_adp~  s*    
c         C   sÝ  | | g j  d  ƒ d k s! t ‚ | d  k r6 | } nH g  } x? | D]7 } |  j ƒ  j d | j d d ƒ ƒ } | j | ƒ qC WxWt | ƒ D]I\ } } x:t | ƒ D],\ }	 }
 | |	 k  r¤ | j | ƒ } | j |
 ƒ } | j	 ƒ  j
 ƒ  | j	 ƒ  j
 ƒ  k rç| j | j ƒ  d d ƒj } | d k | d k  @j  t ƒ } | j
 ƒ  | j	 ƒ  j
 ƒ  k s_t ‚ | j | d k ƒ } | d	 | j	 ƒ  j
 ƒ  } | d k rÍH| d  k	 r´|
 GH| GHn  | G|	 G| Gt j | d ƒ Gt j | d ƒ GHqÍqÐ| j | j ƒ  d d ƒj } | d k | d k  @j  t ƒ } | j
 ƒ  | j	 ƒ  j
 ƒ  k sHt ‚ | j | d k ƒ } | d	 | j	 ƒ  j
 ƒ  } | d k rÐH| d  k	 r�|
 GH| GHn  | G|	 G| Gt j | d ƒ Gt j | d ƒ GHqÐq¤ q¤ Wq‹ WHd  S(
   Ni   R
  R  R  t   distance_cutoffi   i    i   g      Y@(   RS   R   R+   R  RÆ   R  R   R)   R¾   t
   scatterersRD   t   closest_distancest
   sites_fract   smallest_distancesR   R   t   min_defaultt   mean_default(   Rˆ   Rë   R  t   selection_arraysRÝ   RN   t   saRZ   t   sit   j_seqt   sjt   xit   xjt	   distancest   cntR—   (    (    sP   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/command_line/find_tls_groups.pyt   merge_groups_by_connectivity–  sH    ! 	$$$3$;c   :      C   sM  | d  k r t j } n  t j d d | ƒ|  j d  k rL t j ƒ  |  _ n  t j	 |  j ƒ t j
 |  j ƒ | j ƒ  | j ƒ  } d  } | j ƒ  }	 t d |	 d | ƒ }
 |
 d  k	 rO| j ƒ  } g  } x/ |
 d  D]# } | | j ƒ  } | j | ƒ qÒ Wt |
 ƒ d k r)| j d t |
 ƒ d ƒ n  t d d j | ƒ t |
 ƒ ƒ ‚ n  t j j d | d	 d  d
 d  d d  d d  ƒ } | j d | ƒ | j ƒ  } | j ƒ  | j ƒ  B| j ƒ  B} | d  k	 rå| j ƒ  | j ƒ  k st ‚ n | j ƒ  |	 j ƒ  k st ‚ | j d | ƒ t d | d | d | ƒ \ } } g  } g  } t j d d | ƒ|  j  d  k rnd |  _  n  x	| D]} t j! d | d d | ƒt" | d ƒ } t# d | d d | d | ƒ \ } } t | ƒ d k r| d IJ| j | d t$ | | d ƒ g ƒ qu| d IJi  } d } |  j  t% k sB|  j  d k rt& d | d | d | d |	 ƒ } d d l' m( } | j) d |  j  d | d | d d  d! d" ƒ } g  | D] \ } } | ^ q§}  xt* | |  ƒ D]1 \ }! }" | j+ t |! ƒ g  ƒ j |" |! g ƒ qÏWnÃ xÀ t, | ƒ D]² \ }# }! |# d# d k rM| d$ |# t | ƒ f IJn  t- | |! ƒ }$ d }" x< |$ D]4 }% t. d | d |	 d | d% |% ƒ }& |" |& j/ 7}" qiW| j+ t |! ƒ g  ƒ j |" |! g ƒ qW| d& IJ| d' IJ| d( IJd) }' d  }( xHt* | j0 ƒ  | j1 ƒ  ƒ D]+\ }) }* |* d d }+ |* d d }, x5 |* D]- }- |- d |+ k  r?|- d }+ |- d }, q?q?W| d  k	 rŽ| j2 | ƒ }. n d  }. |	 d  k	 r²|	 j2 | ƒ }/ n d  }/ t3 d |. d |/ d | j2 | ƒ d* |) ƒ }0 |0 |+ |0 |+ d+ }1 | d, |) |+ |0 |0 |+ |1 f I|, IJ|1 |' k r|1 }' |, }( qqW| j | d |( g ƒ | j | d t$ | |( ƒ g ƒ quW| d  k	 r·| r·t4 d- | d | d | d |	 d | ƒ }2 n  t j d. d | ƒ| d/ IJt5 j6 ƒ  }3 g  }4 |3 d0 IJxÜ | D]Ô }0 d1 |0 d }5 t |0 d ƒ d k r¬t |0 d ƒ d k r¬|5 d2 7}5 x‡ |0 d D]Y }6 xP |6 D]H }7 t |7 ƒ d k rY|5 d3 |7 }8 |3 d4 |8 IJ|4 j d5 |8 ƒ qYqYWqLWq÷|3 d4 |5 IJ|4 j d5 |5 ƒ q÷W|3 d6 IJ| |3 j7 ƒ  IJ| Jt |4 ƒ d k r5t8 d | d | d |	 d7 |4 ƒ }9 | d8 |9 IJ| Jn  | r?|4 S|3 j7 ƒ  Sd  S(9   Ns   Analyzing inputsRf   RŸ   i
   s   ... (remaining %d not shown)s8   %d atoms in the model contain isotropic B-factors <= 0:
s   
Rˆ   t   sec_str_from_pdb_fileRé   t   assume_hydrogens_all_missingt   tmp_dirt   logRt   s   Processing chainsi   s   Processing chain '%s'i    RG   s-     Whole chain is considered as one TLS group.s     Fitting TLS matrices...g    eÍÍAR•   Rž   RÇ   iÿÿÿÿ(   t   easy_mpt	   processest
   fixed_funcRÿ   t	   chunksizeid   t   func_wrappert   buffer_stdout_stderriô  s       ...perm %d of %dRÆ   s       Best fits:s         No. of         Targetss9         groups   best   rand.pick  diff.  score permutationg    eÍÍÁRÒ   g      Y@s)            %3d %6.3f      %6.3f %6.2f %6.3fRê   t   SUMMARYs&   TLS atom selections for phenix.refine:s   refinement.refine.adp {s
   chain '%s's    and s   (%s)s     tls = "%s"s   %st   }R  s@   Overall best total target for automatically found groups: %10.1f(9   R   Rd   Re   R   Rì   t   random_seedR   t   get_random_seedRÎ   t   seedt   set_random_seedt   convert_to_isotropicRž   t   extract_u_iso_or_u_equivR!  R„   t   format_atom_recordR   R   R   t   joint   mmtbxt   secondary_structuret   managert   find_automaticallyt   alpha_selectiont   beta_selectiont   base_pair_selectionRD   R+   t   show_summaryR”   Rù   t   make_sub_headerRá   Rw   Râ   R   Rã   Rñ   R7  t   pool_mapt   zipt
   setdefaultR)   R›   RÍ   RÃ   t   keyst   valuesR¾   Rß   R  t	   cStringIOt   StringIOt   getvalueR  (:   Ré   Rê   Rˆ   Rë   t   return_as_listt   ignore_pdb_header_groupsRf   Rž   RÇ   RŸ   R  R„   t   bad_atom_stringsRZ   t   atom_strt   ssmt   alpha_h_selectionRt   R‹   t   chains_and_permutationst!   chains_and_atom_selection_stringst   crsRà   R•   Rv   t   dict   target_bestt   process_permsR7  t   stdout_and_targetst   soR#   t   targetsR–   RË   t   i_permRÝ   RÆ   RÞ   t
   score_bestt   perm_choiceR   R"   t   t_bestt	   perm_bestt   v_t   u_cart_t   u_iso_R   t   scoret   external_tls_selectionst
   groups_outR  t   prefixR>   R@   t   group_selectionR  (    (    sP   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/command_line/find_tls_groups.pyRþ   À  s<   
	 	 !


				,	)


(
	 

,

	t   _run_find_tlsc           B   s   e  Z d  „  Z d „  Z RS(   c         C   s   | |  _  | |  _ | |  _ d  S(   N(   Ré   Rˆ   Rë   (   Rä   Ré   Rˆ   Rë   (    (    sP   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/command_line/find_tls_groups.pyRå   ‡  s    		c      	   O   s(   t  d |  j d d  d |  j d |  j ƒ S(   NRé   Rê   Rˆ   Rë   (   Rþ   Ré   R   Rˆ   Rë   (   Rä   Rÿ   t   kwds(    (    sP   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/command_line/find_tls_groups.pyRæ   Œ  s
    		(   R²   R³   Rå   Ræ   (    (    (    sP   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/command_line/find_tls_groups.pyRt  †  s   	t   __main__Rÿ   i   s   Time: %10.3f(    (<   t
   __future__R    Rq   R   t   mmtbx.refinementR   t   mmtbx.secondary_structureRG  t	   iotbx.pdbR|   t   cctbxR   t   scitbx.array_familyR   t   scitbx.linalgR¦   t   libtbx.philRñ   t   libtbx.utilsR   R   t   copyR   RU  RÎ   Rí   t   timeRd   Rò   Ró   Rõ   R   R   RC   RR   R_   Rc   Rh   Rj   Rw   R”   R›   R   RÍ   RÚ   Rß   Rá   Râ   t   objectRã   R	  R  R  R!  R2  Rþ   Rt  R²   t   t0t   argv(    (    (    sP   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/command_line/find_tls_groups.pyt   <module>   sd   			U	 	7		0!	
B	7		1	-À