ó
Ÿ™xTc           @   sè  d  d l  m Z d  d l Z d  d l Z d  d l Z d  d l m Z d  d l Z d f  d „  ƒ  YZ	 d f  d „  ƒ  YZ
 d Z d	 „  Z e d
 k räe j Z e j d Z d e k rfd Z e e d ƒ Z e j e ƒ e j ƒ  e
 ƒ  Z e j e d e ƒe j ƒ  d Z e j d e ƒ Z e p-e e k r^d GHe d d ƒ Z e j e ƒ e j ƒ  n d GHn{ e e ƒ d k o•e d o•e j j  e d ƒ ráe
 ƒ  Z e j e d d e d ƒe j ƒ  d Z e j d e ƒ Z n  n  d S(   iÿÿÿÿ(   t   divisionN(   t   Sorryt	   ncs_groupc           B   sC  e  Z d d d d d d d d d d d d  „ Z d d d d d „ Z d d d d „ Z d d d d „ Z d d d d „ Z d „  Z d „  Z	 d „  Z
 d 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 „  Z d „  Z RS(   c         C   s¸   | |  _  | |  _ | |  _ | |  _ | |  _ | |  _ |  j d  k	 rZ t |  j ƒ |  _ n- |  j d  k	 r~ t |  j ƒ |  _ n	 d |  _ | |  _	 | |  _
 |	 |  _ |
 |  _ | |  _ d  S(   Ni    (   t   _chain_residue_idt
   _rmsd_listt   _residues_in_common_listt   _centerst   _translations_ortht   _rota_matricest   Nonet   lent   _n_ncs_opert   _source_of_ncs_infot   _ncs_domain_pdbt   _cct
   _exclude_ht
   _exclude_d(   t   selft   ncs_rota_matrt   center_ortht
   trans_ortht   chain_residue_idt   source_of_ncs_infot	   rmsd_listt   ncs_domain_pdbt   residues_in_common_listt   cct	   exclude_ht	   exclude_d(    (    s;   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/ncs/ncs.pyt   __init__   s     											c         C   s2   | j  | ƒ } | j ƒ  | } | j | ƒ } | S(   N(   t   fractionalizet   ct   orthogonalize(   R   t   vectort   change_of_basis_operatort	   unit_cellt   new_unit_cellt   fract   new_fract
   new_vector(    (    s;   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/ncs/ncs.pyt   apply_cob_to_vector(   s    c         C   s�  d d l  m } d d l m } g  } g  }	 | d  k	 r‚ | j | j ƒ  ƒ | j ƒ  j ƒ  j	 | j | j
 ƒ  ƒ }
 |
 j ƒ  } n d  }
 xû t | | ƒ D]ê \ } } | d  k rÙ | j | | ƒ ƒ |	 j | | ƒ ƒ q˜ |
 | | } | j | ƒ | j | ƒ } | j ƒ  | } | j | ƒ } | j ƒ  j ƒ  j ƒ  j ƒ  } | j | ƒ } | | } | j | ƒ | j | ƒ } |	 j | ƒ q˜ W| |	 f S(   Niÿÿÿÿ(   t   deepcopy(   t   matrix(   t   copyR)   t   scitbx.mathR*   R	   t   sqrt   orthogonalization_matrixR   t   as_rationalt   rt   fractionalization_matrixt   inverset   zipt   appendR   R    t   tt   as_floatt   col(   R   t   list_of_matricest   list_of_translationsR"   R#   R$   R)   R*   t   new_list_of_matricest   new_list_of_translationst   at   a_invt   ncs_rt   ncs_tt   ncs_r_primeR%   R&   t	   new_ncs_tt   t_as_colt	   cob_transt   deltat   t_prime(    (    s;   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/ncs/ncs.pyt   copy_rot_trans0   s.    ;
c   	   
   C   sw   d d l  m } g  } xZ | D]R } | d  k r> | | ƒ } n$ |  j d | d | d | d | ƒ } | j | ƒ q W| S(   Niÿÿÿÿ(   R)   R!   R"   R#   R$   (   R+   R)   R	   R(   R4   (	   R   t   list_of_vectorsR"   R#   R$   R)   t   new_vector_listR!   R'   (    (    s;   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/ncs/ncs.pyt   copy_vector_listp   s    c      	   C   s  d d l  m } d d l m } t ƒ  } |  j | _ | |  j ƒ | _ | |  j ƒ | _ |  j |  j	 d | d | d | ƒ| _	 |  j
 |  j |  j d | d | d | ƒ\ | _ | _ | |  j ƒ | _ |  j | _ | |  j ƒ | _ | |  j ƒ | _ |  j | _ |  j | _ | S(   Niÿÿÿÿ(   t   ncs(   R)   R"   R#   R$   (   t   mmtbx.ncs.ncsRJ   R+   R)   R   R   R   R   RI   R   RF   R   R   R   R   R   R   R   R   (   R   R"   R#   R$   RJ   R)   t   new(    (    s;   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/ncs/ncs.pyt	   deep_copy   s(    	c         C   sF  d } | d t  |  j ƒ  ƒ d 7} d } |  j rM | d t  |  j ƒ 7} n  |  j r• |  j r• | d t  |  j d d ƒ d |  j |  j ƒ 7} n  |  j rÚ |  j rÚ | d t  |  j d d ƒ d t  |  j ƒ 7} n  |  j rý | d	 t  |  j ƒ 7} n  |  j r | d
 t  |  j ƒ 7} n  |  j rC| d t  |  j ƒ 7} n  xò t	 |  j
 |  j |  j ƒ D]Õ \ } } } | d  k r€q_n  | d 7} | d t  | ƒ 7} | d d t | ƒ 7} | j } | d d t | d d !ƒ 7} | d d t | d d !ƒ 7} | d d t | d d !ƒ 7} | d d t | ƒ 7} q_W| d 7} | S(   Nt    s   
Summary of NCS group with s    operators:i    s(   
ID of chain/residue where these apply: s   
RMSD (A) from chain t   :s#   
Number of residues matching chain s   
Source of NCS info: s   
NCS domains represented by: s   
Correlation of NCS: i   s   

OPERATOR s	   
CENTER: s    %8.4f  %8.4f  %8.4fs
   

ROTA 1: i   s	   
ROTA 2: i   s	   
ROTA 3: i	   s	   
TRANS:  s   
(   t   strt
   n_ncs_operR   R   t
   print_listR   R   R   R   R3   R   R   R   R	   t   tuplet   elems(   R   t   textt   it   centerR   R   R0   (    (    s;   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/ncs/ncs.pyt   display_summaryž   sB    				% 
	
c      
   C   sF  |  j  s t |  j  ƒ d k  r# d S|  j  d  k	 rD |  j  \ } } n  |  j d  g } |  j d  g } |  j d  k	 r“ |  j |  j |  j } } } n0 |  j d  g } |  j d  g } |  j d  g } |  j d  k	 rÞ |  j } n |  j d  g } |  j d  k	 r	|  j } n |  j d  g } d } |  j	 d  k	 rL| d t
 |  j	 ƒ d 7} n  |  j d  k	 ry| d t
 |  j ƒ d 7} n  d }	 xÀt | | | | | | | ƒ D] \ }
 } } } } } } |	 d 7}	 | d	 7} | d  k	 rexB t d
 ƒ D]4 } | d d t | j | d
 | d
 d
 !ƒ 7} qæW| d d t | ƒ 7} | d 7} | d d t | ƒ 7} | d 7} n  |
 d  k	 rŒ| d t
 |
 ƒ d 7} n  | d  k	 r³| d t
 | ƒ d 7} n  | d  k	 rÚ| d t
 | ƒ d 7} n  | d  k	 rž| ržxB | D]: } | d 7} | t
 | d ƒ d t
 | d ƒ d 7} qóW| d 7} qžqžW| S(   Ni   RN   s   
new_ncs_group
s   NCS_CC s   
s     NCS_DOMAIN_PDB i    i   s   new_operator
i   s   
rota_matrix s    %8.4f  %8.4f  %8.4fs   
tran_orth  s   
center_orth s   CHAIN s   RMSD s	   MATCHING s	     RESSEQ RO   (   R   R
   R	   RQ   R   R   R   R   R   R   RP   R   R3   t   xrangeRS   RT   (   R   t   groupt   residue_range_listt   centerst   translations_ortht   rota_matricesR   R   RU   t   countt   idt   residue_rangesRW   R   R   t   rmsdt   commont   jt   residue_range(    (    s;   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/ncs/ncs.pyt   format_group_specificationÁ   sd      	%

&
   
.c   
      C   sl  |  j  s t |  j  ƒ d k  r# d Sd } |  j r? | d 7} n  |  j rU | d 7} n  |  j  \ } } d } xñ t | | ƒ D]à \ } } | d 7} | d k r½ d } | d t | ƒ d	 7} n | d
 t | ƒ d	 7} | rPt } xW | D]O }	 | rt } | d 7} n
 | d 7} | t |	 d ƒ d t |	 d ƒ 7} qè W| d | d 7} qz | d 7} qz W| d 7} | S(   Ni   RN   s    and (not element H) s    and (not element D) i    i   s"   refinement.ncs.restraint_group { 
s   reference = chain 't   's   selection = chain 's    and (resseq s    or resseq  RO   s    ) s   
s   } 
(   R   R
   R   R   R3   RP   t   Truet   False(
   R   t   excludeRZ   R[   R_   R`   Ra   RU   t   firstRe   (    (    s;   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/ncs/ncs.pyt   format_for_phenix_refine  s6    	 	 

*
c   
   
   C   s=  d } | r9 |  j  d  k	 r9 | d t |  j  ƒ d 7} n  d } x÷ t |  j |  j |  j ƒ D]Ú \ } } } | d 7} | d k rŒ | rŒ q[ n  x? t d ƒ D]1 }	 | d d t | |	 d |	 d d !ƒ 7} q™ W| d	 d t | ƒ 7} | d 7} | d
 d t | ƒ 7} | d  k	 r+| d t | ƒ 7} n  | d 7} q[ W| S(   Nt   new_ncs_groups   
ncs_domain_pdb s   
i    i   i   s   
rota_matrix s    %8.4f  %8.4f  %8.4fs   
tran_orth  s   
center_orth s   
crystal_number (	   R   R	   RP   R3   R   R   R   RY   RS   (
   R   t   crystal_numbert   skip_identityR   RU   RV   RW   R   R   Rd   (    (    s;   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/ncs/ncs.pyt   format_for_resolve  s&    %
 #
c         C   s   |  j  S(   N(   R   (   R   (    (    s;   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/ncs/ncs.pyRQ   4  s    c         C   s   |  j  S(   N(   R   (   R   (    (    s;   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/ncs/ncs.pyR   7  s    c         C   s   |  j  S(   N(   R   (   R   (    (    s;   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/ncs/ncs.pyR   :  s    c         C   s   |  j  S(   N(   R   (   R   (    (    s;   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/ncs/ncs.pyR   =  s    c         C   s   | |  _  d  S(   N(   R   (   R   R   (    (    s;   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/ncs/ncs.pyt   add_rmsd_list@  s    c         C   s   | |  _  d  S(   N(   R   (   R   R   (    (    s;   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/ncs/ncs.pyt   add_ccC  s    c         C   s   |  j  S(   N(   R   (   R   (    (    s;   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/ncs/ncs.pyR   F  s    c         C   s   | |  _  d  S(   N(   R   (   R   R   (    (    s;   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/ncs/ncs.pyt   add_residues_in_common_listI  s    c         C   s   | |  _  d  S(   N(   R   (   R   R   (    (    s;   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/ncs/ncs.pyt   add_chain_residue_idL  s    c         C   s   |  j  S(   N(   R   (   R   (    (    s;   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/ncs/ncs.pyR\   P  s    c         C   s   |  j  S(   N(   R   (   R   (    (    s;   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/ncs/ncs.pyR]   S  s    c   	      C   s�   d d l  m } g  } g  } xf t |  j |  j ƒ D]O \ } } | j ƒ  } d | | } | j | ƒ } | j | ƒ | j | ƒ q2 W| | f S(   Niÿÿÿÿ(   t   euler_anglesg      ð¿(   R,   Ru   R3   R   R   R2   t
   zyz_anglesR4   (	   R   Ru   t   rotations_forward_eulert   translations_forward_eulerR0   R5   t   r_invt   t_invt   r_inv_euler(    (    s;   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/ncs/ncs.pyt$   rotations_translations_forward_eulerV  s    "c         C   s   |  j  S(   N(   R   (   R   (    (    s;   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/ncs/ncs.pyR^   c  s    c         C   s   |  j  S(   N(   R   (   R   (    (    s;   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/ncs/ncs.pyR   f  s    c         C   s   |  j  S(   N(   R   (   R   (    (    s;   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/ncs/ncs.pyR   i  s    c         C   s;   d } x. | D]& } | d t  |  j | d ƒ ƒ 7} q W| S(   NRN   s     i   (   RP   t   round(   R   t   list_of_realRU   t   number(    (    s;   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/ncs/ncs.pyRR   l  s    $c         C   sØ   t  | ƒ t  d ƒ k r. |  j t | ƒ | ƒ St  | ƒ t  d ƒ k rV |  j d d ƒ S| d k rk d } n
 d | } | d k r¢ t t d | | ƒ ƒ | } n2 d | } t t d | | ƒ ƒ | } d | } | S(   Ni   g      ð?g        i    i
   g      à?g      ð¿(   t   typeR}   t   floatt   int(   R   t   valuet   n_digitt   roundert   roundedt   value1(    (    s;   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/ncs/ncs.pyR}   r  s    	
!

N(   t   __name__t
   __module__R	   R   R(   RF   RI   RM   RX   Rf   Rl   Ri   Rh   Rp   RQ   R   R   R   Rq   Rr   R   Rs   Rt   R\   R]   R|   R^   R   R   RR   R}   (    (    (    s;   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/ncs/ncs.pyR      sF   		?	#	@																	RJ   c        
   B   s^  e  Z d d d  „ Z d d d d „ Z d d d d „ Z d „  Z d „  Z d „  Z d g  d d e	 d „ Z
 d „  Z d	 „  Z d
 „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d d d d d d d d d d „	 Z d „  Z d d „ Z d e d d d „ Z d e	 d d e	 e d „ Z d e	 d d „ Z d „  Z d „  Z d „  Z d „  Z d „  Z RS(   c         C   s1   g  |  _  d  |  _ t |  _ | |  _ | |  _ d  S(   N(   t   _ncs_groupsR	   t   source_infoRi   t	   _ncs_readR   R   (   R   R   R   (    (    s;   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/ncs/ncs.pyR   …  s
    				c      	   C   sƒ   d d l  m } | d |  j d |  j ƒ } |  j | _ |  j | _ x9 |  j D]. } | j j | j d | d | d | ƒ ƒ qM W| S(   Niÿÿÿÿ(   RJ   R   R   R"   R#   R$   (	   RK   RJ   R   R   R‹   RŒ   RŠ   R4   RM   (   R   R"   R#   R$   RJ   RL   R   (    (    s;   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/ncs/ncs.pyRM   Œ  s    c         C   sS   | d  k s$ | d  k s$ | d  k r7 t d d ƒ ‚ n  |  j d | d | d | ƒ S(   Ns   For change of basis unit_cell, s+   new_unit_cell and operator are all requiredR"   R#   R$   (   R	   R   RM   (   R   R"   R#   R$   (    (    s;   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/ncs/ncs.pyt   change_of_basisœ  s    c         C   s   |  j  S(   N(   RŒ   (   R   (    (    s;   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/ncs/ncs.pyt   ncs_read¥  s    c         C   s   |  j  S(   N(   RŠ   (   R   (    (    s;   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/ncs/ncs.pyt
   ncs_groups¨  s    c         C   s"   |  j  r |  j  d j ƒ  Sd  Sd  S(   Ni    (   RŠ   RQ   R	   (   R   (    (    s;   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/ncs/ncs.pyt   ncs_oper_in_first_group«  s    	RN   c         C   s³  | s t  j } n  | s4 | r4 | d I| IJq4 n  | rV | d I| IJ| |  _ n t | ƒ |  _ | r¯ t j j | ƒ sš t d t | ƒ d ƒ ‚ q¯ t | ƒ j	 ƒ  } n  |  j
 ƒ  t } x¼| D]´} | sØ qÆ n  t j | ƒ } t | ƒ d k  rÿ qÆ n  t j | d ƒ }	 |	 d k r_t | ƒ d k r_t j | d ƒ d k r_g  |  _ |  j
 ƒ  qÆ |	 d	 k rx|  j ƒ  qÆ |	 d
 k r‘|  j ƒ  qÆ |	 d k rÿ|  j r»t |  j ƒ d k sÐt |  j ƒ d k rÝ|  j ƒ  n  |  j | ƒ }
 |  j j |
 ƒ qÆ |	 d k r |  j | ƒ |  _ qÆ |	 d k rA|  j | ƒ |  _ qÆ |	 d k rb|  j | ƒ |  _ qÆ |	 d k rƒ|  j | ƒ |  _ qÆ |	 d k r«|  j j |  j | ƒ ƒ qÆ |	 d k rÌ|  j | ƒ |  _ qÆ |	 d k rí|  j | ƒ |  _ qÆ |	 d k r|  j | ƒ |  _ qÆ |	 d k r/|  j | ƒ |  _  qÆ t | ƒ d k rÆ | d d k rÆ | d d k rÆ | d d k rÆ t! } qÆ qÆ W|  j ƒ  | s£t |  j ƒ d k r¯t! |  _" n  d  S(   Ns   Reading NCS information from: s
    based on s	   The file s    does not seem to exist?i   i    t   transformationst	   formattedRm   t   new_operatort   rota_matrixi   t	   tran_orthR   t   ncs_cct   chaint   resseqRb   t   matchingR‹   R   t   Not   NCSi   t   found(#   t   syst   stdoutR‹   RP   t   ost   patht   isfileR   t   opent	   readlinest   init_ncs_groupRi   t   stringt   splitR
   t   lowerRŠ   t   save_existing_group_infot	   save_opert   _rota_matrixt   get_3_values_after_keyR4   t   _transt   _centert   get_1_value_after_keyR   t   get_1_char_after_keyt   _chaint   _resseq_listt   get_res_range_after_keyt   _rmsdt   _residues_in_commonR   Rh   RŒ   (   R   t	   file_namet   linesR‹   t   logt   quiett   read_somethingt   linet   splt   keyt   set(    (    s;   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/ncs/ncs.pyt   read_ncs±  sx     
  		*B	
c         C   s*   |  j  ƒ  |  j d k r& |  j ƒ  n  d  S(   Ni    (   R©   R   t   save_ncs_group(   R   (    (    s;   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/ncs/ncs.pyR¨   ó  s    
c         C   s»   t  j t  j | d d ƒ ƒ } t | ƒ d k  rM t d d t | ƒ ƒ ‚ n  d \ } } y* t  j | d ƒ } t  j | d ƒ } Wn+ t k
 r° t d d t | ƒ ƒ ‚ n X| | g S(	   NRO   t    i   s   Cannot interpret this NCS files   
i   i   (   NN(	   R¥   R¦   t   replaceR
   R   RP   R	   t   atoit	   Exception(   R   Rº   R»   t   startt   end(    (    s;   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/ncs/ncs.pyR²   ú  s    c         C   s„   t  j | ƒ } t | ƒ d k  r> t d d t | ƒ ƒ ‚ n  d  } y | d } Wn+ t k
 r t d d t | ƒ ƒ ‚ n X| S(   Ni   s   Cannot interpret this NCS files   
i   (   R¥   R¦   R
   R   RP   R	   RÃ   (   R   Rº   R»   t   char(    (    s;   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/ncs/ncs.pyR¯     s    c         C   s�   t  j | ƒ } t | ƒ d k  r> t d d t | ƒ ƒ ‚ n  d  } y t  j | d ƒ } Wn+ t k
 rˆ t d d t | ƒ ƒ ‚ n X| S(   Ni   s   Cannot interpret this NCS files   
i   (   R¥   R¦   R
   R   RP   R	   t   atofRÃ   (   R   Rº   R»   R   (    (    s;   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/ncs/ncs.pyR®     s    c         C   s¨   t  j | ƒ } t | ƒ d k  r> t d d t | ƒ ƒ ‚ n  g  } y2 x+ | d d !D] } | j t  j | ƒ ƒ qU WWn+ t k
 r£ t d d t | ƒ ƒ ‚ n X| S(   Ni   s   Cannot interpret this NCS files   
i   (   R¥   R¦   R
   R   RP   R4   RÇ   RÃ   (   R   Rº   R»   R½   t   item(    (    s;   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/ncs/ncs.pyR«     s    c         C   sq   d |  _  g  |  _ g  |  _ g  |  _ |  j ƒ  g  |  _ g  |  _ d  |  _ d  |  _	 g  |  _
 g  |  _ g  |  _ d  S(   Ni    (   R   t   _ncs_trans_ortht   _ncs_rota_matrt   _ncs_center_ortht	   init_operR   R   R	   R   R   R   t   _list_of_resseq_listt   _group(   R   (    (    s;   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/ncs/ncs.pyR¤   (  s    				
						c         C   sC   g  |  _  d  |  _ d  |  _ d  |  _ d  |  _ g  |  _ d  |  _ d  S(   N(   Rª   R	   R¬   R­   R³   R´   R±   R°   (   R   (    (    s;   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/ncs/ncs.pyRÌ   7  s    						c         C   s¶  t  } x/ |  j |  j |  j f D] } | s t } q q W|  j re t |  j ƒ d k re t d ƒ ‚ n  t } | sƒ |  j sƒ |  j rŒ t  } n  | s– d  S|  j	 d 7_	 | r,d d l
 m } |  j j | j |  j ƒ ƒ |  j j | j |  j d |  j d |  j d ƒ ƒ |  j j | j |  j ƒ ƒ n0 |  j j d  ƒ |  j j d  ƒ |  j j d  ƒ |  j j |  j ƒ |  j j |  j ƒ |  j j |  j ƒ |  j j |  j ƒ |  j ƒ  d  S(   Ni   s   Cannot interpret this NCS filei   iÿÿÿÿ(   R*   i    i   (   Rh   R¬   Rª   R­   Ri   R
   R   R³   R´   R   t   scitbxR*   RÉ   R4   R7   RÊ   R-   RË   R	   R   R   RÍ   R±   RÎ   R°   RÌ   (   R   t	   have_operRÈ   t   have_somethingR*   (    (    s;   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/ncs/ncs.pyR©   @  s4    	 'c
         C   sã   d  }
 xu | | | g D]d } | s5 t | ƒ d k  rD t d ƒ ‚ n  |
 sY t | ƒ }
 n  |
 t | ƒ k r t d ƒ ‚ q q Wt d | d | d | d | d | d | d	 |	 d
 | d | d |  j d |  j ƒ } |  j j | ƒ d  S(   Ni   s1   The NCS operators in this file appear incomplete?R   R   R   R   R   R   R   R   R   R   R   (   R	   R
   R   R   R   R   RŠ   R4   (   R   R   R   R   R   R   R   R   R   R   t   list_lengtht   listt   ncs_group_object(    (    s;   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/ncs/ncs.pyt   import_ncs_group_  s(    	 c         C   sG  t  } x§ |  j |  j |  j |  j |  j g D]� } | d  k	 rj |  j rj t | ƒ |  j k rj t	 d ƒ ‚ n  | d  k	 r— t | ƒ d k  r— t	 d ƒ ‚ n  | d  k	 r+ t
 } q+ q+ W| sº d  S|  j |  j g |  _ t d |  j d |  j d |  j d |  j d |  j d |  j d	 |  j d
 |  j d |  j ƒ 	} |  j j | ƒ |  j ƒ  d  S(   Ns1   The NCS operators in this file appear incomplete?i   R   R   R   R   R   R   R   R   R   (   Ri   RÉ   RÊ   RË   R   R   R	   R   R
   R   Rh   RÎ   RÍ   R   R   R‹   R   R   RŠ   R4   R¤   (   R   RÑ   RÓ   RÔ   (    (    s;   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/ncs/ncs.pyR¿   |  s4    	  								c         C   s�   | d  k r t j } n  d } d } x? |  j D]4 } | d 7} | d t | ƒ 7} | | j ƒ  7} q. W| d 7} | j | ƒ | S(   Ni    RN   i   s   

GROUP s   

(   R	   R�   Rž   RŠ   RP   RX   t   write(   R   R·   R_   RU   R   (    (    s;   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/ncs/ncs.pyt   display_all˜  s    

c   
      C   s‚  | d  k	 r t | d ƒ } n  | d  k r6 t j } n  | d  k rN t j } n | d I| j IJd } d } d d  l } d d  l } | | j ƒ  d 7} | | j ƒ  d 7} |  j	 d  k	 rÚ | d t
 |  j	 ƒ d 7} n  |  j sð | d	 7} n  | d  k	 s| r| j d | d ƒ n  xV |  j D]K }	 |	 j ƒ  } | d  k	 sJ| rb| j d | d ƒ n  | d | 7} q%W| d 7} | S(
   Nt   ws)   NCS written as ncs object information to:RN   s   Summary of NCS information
iÿÿÿÿs   
s   

s   source_info s   No NCS found
(   R	   R¢   R�   Rž   t   namet   timeRŸ   t   ctimet   getcwdR‹   RP   RŠ   RÖ   Rf   (
   R   R·   R¸   t   outRµ   t   all_textRU   RÚ   RŸ   R   (    (    s;   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/ncs/ncs.pyt"   format_all_for_group_specification¦  s4    
		  
c   
      C   s«   | d  k r t j } n  | d  k r0 t j } n | d I| j IJd } x[ |  j D]P } | j d | d | d | ƒ }	 | s• | j d |	 d ƒ n  | d |	 7} qS W| S(   Ns1   

NCS operators written in format for resolve to:RN   Rn   Ro   R   s   
s   

(   R	   R�   Rž   RÙ   RŠ   Rp   RÖ   (
   R   R·   R¸   RÝ   Rn   Ro   R   RÞ   R   RU   (    (    s;   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/ncs/ncs.pyt   format_all_for_resolveÂ  s     c         C   s¢   | d  k r t j } n  | d  k r0 t j } n | d I| j IJd } xR |  j D]G } | j ƒ  } | rS | s‰ | j d | d ƒ n  | d | 7} qS qS W| S(   Ns5   NCS operators written in format for phenix.refine to:RN   s   
s   

(   R	   R�   Rž   RÙ   RŠ   Rl   RÖ   (   R   R·   R¸   RÝ   RÞ   R   RU   (    (    s;   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/ncs/ncs.pyt   format_all_for_phenix_refineÒ  s     c         C   s:   |  j  d  k r! t | ƒ |  _  n |  j  t | ƒ 7_  d  S(   N(   R‹   R	   RP   (   R   R‹   (    (    s;   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/ncs/ncs.pyt   add_source_infoâ  s    c         C   s^   t  |  j ƒ t  | ƒ k r* t d ƒ ‚ n  x- t |  j | ƒ D] \ } } | j | ƒ q= Wd  S(   Ns8   Number of NCS groups does not match length of cc_list...(   R
   RŠ   R   R3   Rr   (   R   t   cc_listR   R   (    (    s;   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/ncs/ncs.pyt   add_cc_listè  s    c         C   sr   d } d } x: |  j  D]/ } | j d  k	 r | | j 7} | d 7} q q W| d k rh | t | ƒ } n d  } | S(   Ng        i    i   (   RŠ   R   R	   R�   (   R   t   cc_allt   nR   (    (    s;   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/ncs/ncs.pyt
   overall_ccî  s    c         C   s’   d } d } xZ |  j  D]O } | j ƒ  d  k	 r x4 | j ƒ  D]# } | r; | | 7} | d 7} q; q; Wq q W| d k rˆ | t | ƒ } n d  } | S(   Ng        i    i   (   RŠ   R   R	   R�   (   R   t   rmsd_allRæ   R   Rb   (    (    s;   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/ncs/ncs.pyt   overall_rmsdû  s    
c         C   s?   d } x2 |  j  D]' } | j ƒ  | k r | j ƒ  } q q W| S(   Ni    (   RŠ   RQ   (   R   t   n_maxR   (    (    s;   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/ncs/ncs.pyt   max_operators
  s
    N(   Rˆ   R‰   R	   R   RM   R�   RŽ   R�   R�   Ri   R¾   R¨   R²   R¯   R®   R«   R¤   RÌ   R©   RÕ   R¿   R×   Rh   Rß   Rà   Rá   Râ   Rä   Rç   Ré   Rë   (    (    (    s;   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/ncs/ncs.pyRJ   „  sL   			B																sw  

new_ncs_group
NCS_CC 0.92
new_operator

rota_matrix    1.0000    0.0000    0.0000
rota_matrix    0.0000    1.0000    0.0000
rota_matrix    0.0000    0.0000    1.0000
tran_orth     0.0000    0.0000    0.0000

center_orth   30.2920   -2.8923   16.6160
CHAIN A
RMSD 0.2
MATCHING 12.0
  RESSEQ 1:26

new_operator

rota_matrix   -0.9971    0.0424   -0.0635
rota_matrix   -0.0297   -0.9816   -0.1889
rota_matrix   -0.0703   -0.1864    0.9800
tran_orth    70.9461    5.2622    3.7549

center_orth   39.8735    3.8824   16.7239
CHAIN B
RMSD 0.1
MATCHING 15.0
  RESSEQ 101:126



new_ncs_group
NCS_CC 0.95
new_operator

rota_matrix    1.0000    0.0000    0.0000
rota_matrix    0.0000    1.0000    0.0000
rota_matrix    0.0000    0.0000    1.0000
tran_orth     0.0000    0.0000    0.0001

center_orth   31.2920   -2.8923   16.6160
CHAIN A
RMSD 0.6
MATCHING 13.0
  RESSEQ 1:25

new_operator

rota_matrix   -0.9970    0.0424   -0.0635
rota_matrix   -0.0297   -0.9816   -0.1889
rota_matrix   -0.0703   -0.1864    0.9800
tran_orth    70.9461    5.2622    3.7549

center_orth   38.8735    3.8824   16.7239
CHAIN B
RMSD 0.5
MATCHING 11.0
  RESSEQ 101:124


c         C   s`   t  j j |  d |  d |  d d ƒ j ƒ  } | j ƒ  } | j | ƒ } d | | } | | f S(   Ni   i   i    t   zyzg      ð¿(   RÏ   t
   rigid_bodyt   eulert   rot_matR2   R    (   t   euler_valuesR%   R#   t   ncs_rota_matr_invR   t   orthR   (    (    s;   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/ncs/ncs.pyt   euler_frac_to_rot_transP  s    	$t   __main__i   t   exercises   TEST.NCSRØ   R‹   s	   TEST2.NCSRµ   s=   NOT OK ...please compare TEST.NCS (std) vs TEST2.NCS (output)s   txt.datt   OKi    s
   OUTPUT.NCS(!   t
   __future__R    R�   RŸ   R¥   t   libtbx.utilsR   t   scitbx.rigid_bodyRÏ   R   RJ   t   test_ncs_infoRó   Rˆ   Rž   R·   t   argvt   argsRµ   R¢   t   fRÖ   t   closet
   ncs_objectR¾   R×   t   file2Rß   RU   t   ffR
   R    R¡   (    (    (    s;   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/ncs/ncs.pyt   <module>   sD   $ÿ uÿ Ë		
	
2	
