ó
Ü™xTc           @   sT  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 m Z d  d l m Z m Z d  d l m Z d  d l Z d  d	 l m Z d  d
 l m Z d  d l Z d  d l Z d „  Z d d „ Z d e f d „  ƒ  YZ d d d e j e d d „ Z d e f d „  ƒ  YZ  d „  Z! e" d k rPe! ƒ  n  d S(   iÿÿÿÿ(   t   divisionN(   t   crystal_symmetry_from_any(   t   maptbx(   t   flex(   t	   superpose(   t   ifloort   iceil(   t   null_out(   t   easy_run(   t   adopt_init_argsc         C   sŽ  |  j  ƒ  j d |  j ƒ  d | d ƒ \ } } g  t | | ƒ D] \ } } t | | ƒ ^ q> } g  t | | ƒ D] \ } } t | | ƒ ^ qp }	 t j t j | ƒ d ƒ }
 xÚ t	 | d |	 d ƒ D]Á } x¸ t
 | d |	 d ƒ D]Ÿ } x– t
 | d |	 d ƒ D]} } | d k r| | d k  r| d k r| | d k  r| d k r| | d k  r| | | | f |
 | | | f <qqWqã WqÅ W|
 S(   Nt
   sites_cartt   bufferg      ø?i    i   i   (   t	   unit_cellt   box_frac_around_sitesR
   t   zipR   R   R   t   doublet   gridt   ranget   xrange(   t   xrsR   t   map_datat   n_realt   frac_mint   frac_maxt   ft   nt   gridding_firstt   gridding_lastt   new_mapt   it   jt   k(    (    sB   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/maps/superpose.pyt	   mask_grid   s    22/g      $@c   	      C   sn   |  j  ƒ  j ƒ  } | j ƒ  } | d | } | d | } | d | } d | | | f } t j | ƒ } | S(   Ni    i   i   s   %.3f,%.3f,%.3f,90,90,90,P1(   t   atomst   extract_xyzt   maxR   t   from_string(	   t   pdb_hierarchyR   R
   t   xyz_maxt   at   bt   ct   combinedt   symm(    (    sB   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/maps/superpose.pyt   generate_p1_box!   s    t   common_frame_of_referencec           B   s>   e  Z d  e j d „ Z d „  Z d „  Z d „  Z d „  Z RS(   g      $@c         C   s_  g  } g  } t  j ƒ  } x’ t | | ƒ D]� \ } }	 | j | j ƒ  ƒ | j | j ƒ  ƒ |	 d  k r| | j | j ƒ  ƒ q( |	 j j ƒ  j	 | |	 j
 j	 }
 | j |
 ƒ q( W| j ƒ  } | | d | | d | | d f } g  |  _ g  |  _ xf t | ƒ D]X \ } } | | } |  j j | ƒ t j d | d | | ƒ }	 |  j j |	 j ƒ  ƒ qÿ Wd  S(   Ni    i   i   t   reference_sitest   other_sites(   R   t   vec3_doubleR   t   appendt	   deep_copyt   mint   Nonet   rt   inverset   elemst   tt   shifted_sitest   transformation_matricest	   enumerateR   t   least_squares_fitt   rt(   t   selft   all_sites_cartt   lsq_fitsR   t   logt   fitted_sitest   original_sitest   minimaR
   t   lsq_fitt	   old_sitest   xyz_mint   dxyzR   t   new_sites_cart(    (    sB   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/maps/superpose.pyt   __init__,   s*     '		
	c         C   sb   t  | ƒ t  |  j ƒ k s! t ‚ x: t | ƒ D], \ } } | j ƒ  } | j |  j | ƒ q. Wd  S(   N(   t   lenR9   t   AssertionErrorR;   R!   t   set_xyz(   R>   t   pdb_hierarchiesR   R%   R!   (    (    sB   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/maps/superpose.pyt   apply_new_sites_to_hierarchiesE   s    !c         C   s   d  S(   N(    (   R>   t   xray_structures(    (    sB   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/maps/superpose.pyt!   apply_new_sites_to_xray_structureK   s    c         C   s2   | t  |  j ƒ k  s t ‚ |  j | } | j ƒ  S(   N(   RK   R:   RL   R6   (   R>   R   R=   (    (    sB   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/maps/superpose.pyt   get_inverse_matrixN   s    c         C   sƒ   |  j  | ƒ } | j ƒ  } | j ƒ  } | j | j j | | j j ƒ t j | j	 ƒ  d d d d d d g ƒ } | j
 | ƒ d  S(   Niÿÿÿÿ(   RR   R!   R"   RM   R5   R7   R8   R   t   sym_mat3_doublet   sizet   set_uij(   R>   R   R%   R=   R!   R
   t   uij(    (    sB   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/maps/superpose.pyt   inverse_transform_hierarchyS   s    !*(	   t   __name__t
   __module__t   syst   stdoutRJ   RO   RQ   RR   RW   (    (    (    sB   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/maps/superpose.pyR-   +   s
   			g      Ð?t   xplorc         C   s·  |
 d k s t  ‚ t | d d ƒ} | j d | ƒ } | j d | ƒ j ƒ  } | j d | ƒ } t j d | d	 | j ƒ  d
 |  j	 ƒ  d | j
 ƒ  d | j j d | j j ƒ } |	 rÞ t d | d | d | d | j
 ƒ  ƒ } n  | d  k	 r­|
 d k rM| d | IJt j j j d | j ƒ  d | j ƒ  d | d | j
 ƒ  d | d | ƒ q­d d  l } | d | IJ| j j d | j ƒ  d | j ƒ  d | d | j
 ƒ  d | d | ƒ n  | | f S(   NR\   t   ccp4R   g      $@t   crystal_symmetryt   d_mint   resolution_factort   unit_cell_1t   unit_cell_2t
   map_data_1t   n_real_2t   rotation_matrixt   translation_vectorR   R   R   s       saving XPLOR map to %sR
   R   t	   file_nameiÿÿÿÿs       saving CCP4 map to %s(   R\   R]   (   RL   R,   t   extract_xray_structuret   structure_factorst   f_calct   fft_mapR   t   superpose_mapsR   t   real_map_unpaddedR   R5   R7   R8   R    R4   t   mmtbxt   mapst   utilst   write_xplor_mapR
   t   iotbx.map_toolst	   map_toolst   write_ccp4_map(   Rk   R   t   lsq_fit_objR%   R_   R   R`   Rg   RA   t   mask_map_gridt   formatt	   fake_symmt   xray_structureRj   t   fake_mapt   map_data_superposedt   iotbx(    (    sB   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/maps/superpose.pyt   transform_map_by_lsq_fit[   sN    			

t   transform_mapsc           B   s&   e  Z d  d e d d „ Z d „  Z RS(   g      Ð?g      $@R]   c         C   s'   t  |  t ƒ  ƒ |	 r# |  j ƒ  n  d  S(   N(   R	   t   localst   run(   R>   t
   map_coeffst	   map_typesR%   R   Ru   t   output_filesR`   R   t   auto_runRw   (    (    sB   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/maps/superpose.pyRJ   ‘   s    c         C   sÑ   xÊ t  |  j |  j |  j ƒ D]­ \ } } } | d  k r= q n  | j ƒ  \ } } | j d |  j ƒ } | j ƒ  t	 d | d |  j
 d |  j d |  j d |  j d |  j d | d | d	 t ƒ  d
 |  j ƒ 
~ q Wd  S(   NR`   Rk   R   Ru   R%   R   R_   Rg   RA   Rw   (   R   R�   R‚   Rƒ   R4   t	   d_max_minRk   R`   t   apply_sigma_scalingR}   R   Ru   R%   R   R   Rw   (   R>   t   arrayt   map_typeRg   t   d_maxR_   Rk   (    (    sB   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/maps/superpose.pyR€       s&    
						
(   RX   RY   t   TrueRJ   R€   (    (    (    sB   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/maps/superpose.pyR~   �   s
   c          C   s9  t  j j d d d t j j ƒ }  t j j d |  ƒ } | j	 ƒ  } d } d j
 d d |  d	 d
 | d g ƒ } t j | ƒ t j j d | ƒ } | j	 ƒ  } | j d d ƒ j ƒ  j d d# ƒ } | j ƒ  | j ƒ  } t j j j d | j ƒ  d | j ƒ  d | d | j ƒ  d d ƒ t j d | j ƒ  d | j ƒ  j ƒ  ƒ }	 t d | j ƒ  | j ƒ  g d d  |	 g ƒ }
 | j ƒ  } |
 j d }	 | j  ƒ  j! |
 j" d ƒ t# d d ƒ j$ | j% ƒ  ƒ t& d | d | j ƒ  d |	 j' ƒ  d | d d d d d  t( ƒ  ƒ \ } } |
 j) d | ƒ t# d! d ƒ j$ | j% ƒ  ƒ d" GHd  S($   Nt   relative_paths)   phenix_regression/misc/1l3r_no_ligand.pdbt   testRg   s   1l3r_rt.pdbt    s   phenix.pdbtoolss   %ss&   rotate='90 10 20' translate='10 10 10's   output.file_name=%ss   --quietR_   g      ø?R`   g      ð?i   R
   R   R   R   s
   1l3r.xplorR.   R/   R?   R@   i   t   wRk   Ru   R%   s   1l3r_rt.xplorRA   s   1l3r.pdbt   OKgUUUUUUÕ?(*   t   libtbxt   envt   find_in_repositoriest   ost   patht   isfileR|   t   pdbt   inputt   xray_structure_simplet   joinR   t   callRi   Rj   Rk   R†   Rm   Rn   Ro   Rp   Rq   R
   R   R   R   R<   R2   R-   R4   t   construct_hierarchyR:   R!   RM   R9   t   opent   writet   as_pdb_stringR}   R6   R   RW   (   t   pdb_file_name_1t   pdb_in_1t   xrs1t   ofnt   cmdt	   pdb_in_rtt   xrs_rtt	   fft_map_1Rc   Ru   t   f_o_rt   hierarchy_rtt   map_data_rt(    (    sB   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/maps/superpose.pyt   exerciseµ   sZ    	
	t   __main__(#   t
   __future__R    t   mmtbx.maps.utilsRn   t	   iotbx.pdbR|   R   t   cctbxR   t   cctbx.array_familyR   t   scitbx.mathR   t   libtbx.math_utilsR   R   t   libtbx.utilsR   t   libtbx.load_envR�   R   R	   RZ   R“   R    R,   t   objectR-   R4   R[   t   FalseR}   R~   Rª   RX   (    (    (    sB   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/maps/superpose.pyt   <module>   s2   	
5+%	4