ó
=™xTc           @   sè   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 m Z d  d	 l Z d
 „  Z d „  Z d „  Z d „  Z d e f d „  ƒ  YZ d d „ Z d „  Z d „  Z d	 S(   iÿÿÿÿ(   t   division(   t   euclidean_model_matching(   t   crystal(   t   sgtbx(   t   uctbx(   t   io_utils(   t	   cgi_utils(   t   countNc         C   sv   t  j |  d d d d d d d d d d d d d  d! f ƒ } g  | _ x* d" D]" } | j j t  j |  | ƒ ƒ qL W| S(#   Nt
   ucparams_1t    t
   sgsymbol_1t   convention_1t   format_1t   coor_type_1t   skip_columns_1i    t
   ucparams_2t
   sgsymbol_2t   convention_2t   format_2t   coor_type_2t   skip_columns_2t	   tolerances   3.0t   diffraction_index_equivalentt   1t   2(   s
   ucparams_1R	   (   s
   sgsymbol_1R	   (   s   convention_1R	   (   s   format_1N(   s   coor_type_1N(   s   skip_columns_1i    (   s
   ucparams_2R	   (   s
   sgsymbol_2R	   (   s   convention_2R	   (   s   format_2N(   s   coor_type_2N(   s   skip_columns_2i    (   s	   tolerances   3.0(   s   diffraction_index_equivalentN(   R   R   (   R   t   inp_from_formt   Nonet   coordinatest   appendt   coordinates_from_form(   t   formt   inpt   suffix(    (    s<   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/web/emma.pyt   interpret_form_data   s&    		 c         C   s    |  j  d d ƒ j ƒ  } y. g  | | | d !D] } t | ƒ ^ q- } Wn t k
 rf t d |  ‚ n Xt | ƒ d k r‰ t d |  ‚ n  d j | |  ƒ | f S(   Nt   ,t    i   s   FormatError: (   t   replacet   splitt   floatt	   Exceptiont   RuntimeErrort   lent   join(   t   linet   skip_columnst   fldst   xt   site(    (    s<   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/web/emma.pyt!   interpret_generic_coordinate_line    s     . c         C   sû   | j  d |  d t ƒ }  | d  k	 r? |  j d | d t ƒ }  n  g  } xŽ | j ƒ  D]€ } |  j ƒ  d  k ry t d ƒ ‚ n  | j t j	 d j
 t t | ƒ d ƒ | j | j | j g ƒ |  j ƒ  j | j ƒ ƒ ƒ qR Wt j |  j ƒ  | ƒ } d | _ | S(	   Nt   crystal_symmetryt   weak_symmetryt   other_symmetryt   forces   Unit cell parameters unknown.t   :i   s   Other model(   R1   t   FalseR   t   join_symmetryt   atoms_with_labelst	   unit_cellR(   R   t   emmat   positionR*   t   strR)   t   namet   resnamet   chain_idt   fractionalizet   xyzt   modelt   special_position_settingst   label(   R1   t   pdb_inpR3   t	   positionst   atomt   m(    (    s<   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/web/emma.pyt   pdb_file_to_emma_model(   s(    			 			c         C   sÐ   g  } xŸ t  t d ƒ | j ƒ D]… \ } } |  j ƒ  d  k rL t d ƒ ‚ n  | j t j d j	 t
 | ƒ | j | j f ƒ |  j ƒ  j | j | j | j f ƒ ƒ ƒ q Wt j |  j ƒ  | ƒ } | j | _ | S(   Ni   s   Unit cell parameters unknown.R5   (   t   zipR   t   sitesR9   R   R(   R   R:   R;   R*   R<   t   segidt   typeR@   R.   t   yt   zRB   RC   t	   file_nameRD   (   R1   t   sdb_fileRF   t   iR/   RH   (    (    s<   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/web/emma.pyt   sdb_file_to_emma_model>   s    %!/		t   web_to_modelsc           B   s>   e  Z d d  „ Z d d „ Z d d „ Z d „  Z d „  Z RS(   c	         C   s(  | |  _  | |  _ | |  _ | |  _ d  |  _ | d k rï t j | ƒ } g  |  _ x� | D]‡ }	 t	 |	 | ƒ \ }
 } |
 d k rŸ d t
 t |  j ƒ d ƒ }
 n  | d k rÃ |  j ƒ  j | ƒ } n  |  j j t j |
 | ƒ ƒ qX Wd |  _ n,|  j d  k r•y+ d d  l } | j j d d  d | ƒ } Wn$ t k
 r?‚  q•t k
 rOq•Xt |  j ƒ  | | ƒ |  _ t |  j j ƒ  ƒ d	 k r•d
 |  _ q•n  |  j d  k rýy& d d l m } | j | ƒ |  _ Wn$ t k
 rà‚  qýt k
 rðqýXd |  _ n  |  j d  k rt d ƒ ‚ n  d	 |  _ d  S(   Nt   genericR	   t   Sitei   t
   Fractionaliÿÿÿÿt   source_infot   linesi    t   pdb(   t
   sdb_readert   sdbs   Coordinate format unknown.(   t   ucparamst   sgsymbolt
   conventionR3   R   t   coordinate_formatR   t   interpret_skip_columnsRF   R0   R<   R)   t   get_unit_cellR@   R   R:   R;   t	   iotbx.pdbRZ   t   inputt   KeyboardInterruptR'   RI   R1   t	   pdb_modelt	   iotbx.cnsR[   t   multi_sdb_parsert	   sdb_filesR(   t   i_next_model(   t   selfR]   R^   R_   t   formatt	   coor_typeR,   R   R3   R+   RD   R/   t   iotbxRE   R[   (    (    s<   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/web/emma.pyt   __init__N   sP    						     c         C   s5   |  j  r t j |  j  ƒ S| d  k	 s1 t d ƒ ‚ | S(   Ns   Unit cell parameters unknown.(   R]   R   R9   R   t   AssertionError(   Rk   t   other_unit_cell(    (    s<   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/web/emma.pyRb   z   s    	 c         C   sA   |  j  r% t j d |  j  d |  j ƒ S| d  k	 s= t d ƒ ‚ | S(   Nt   symbolt   table_ids   Space group symbol unknown.(   R^   R   t   space_group_infoR_   R   Rp   (   Rk   t   other_space_group_info(    (    s<   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/web/emma.pyt   get_space_group_info   s    			
c         C   sU   d  } d  } |  j r* t j |  j ƒ } n  |  j r? |  j } n  t j d | d | ƒ S(   NR9   t   space_group_symbol(   R   R]   R   R9   R^   R   t   symmetry(   Rk   R9   Rw   (    (    s<   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/web/emma.pyR1   ‡   s    	 	 	c         C   sv  |  j  d k rz |  j r d  St j d |  j ƒ  d |  j ƒ  ƒ } t j t j	 | ƒ |  j
 ƒ } d | _ |  j d 7_ | S|  j  d k r¬ |  j r– d  S|  j d 7_ |  j S|  j  d k rf|  j t |  j ƒ k r× d  S|  j |  j } t j d |  j | j ƒ d |  j | j ƒ ƒ } |  j d  k	 rD| j d |  j d	 t ƒ } n  t | | ƒ } |  j d 7_ | St d
 ƒ ‚ d  S(   NRU   R9   Rt   s   Model 2i   RZ   R\   R3   R4   s   Internal error.(   R`   Rj   R   R   Rx   Rb   Rv   R:   RB   RC   RF   RD   Rf   R)   Ri   R9   Rt   R3   R7   R6   RS   R(   (   Rk   R1   RH   R\   (    (    s<   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/web/emma.pyt   get_next�   s@    	 			  			N(   t   __name__t
   __module__R   Ro   Rb   Rv   R1   Ry   (    (    (    s<   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/web/emma.pyRT   L   s
   *		iÈ   c         C   sq   t  |  j ƒ  ƒ | k r t Sd d GHd t  |  j ƒ  ƒ | f GHd GHd GHd GHd GHd GHd	 GHd
 GHd d GHHt S(   Nt   *iO   s;   ERROR: too many sites in this model (given %d, limit is %d)s=   Note: EMMA is designed to work with heavy-atom substructures,s-         NOT complete macromolecular structures.s8   Hint: install cctbx on your computer and use the commands       phenix.emmas*   which has no limit on the number of sites.s   cctbx downloads:s#       http://cci.lbl.gov/cctbx_build/(   R)   RF   R6   t   True(   RB   t   max_number_of_positions(    (    s<   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/web/emma.pyt   model_is_too_large¯   s    		c      
   C   s‘  | j  d k r | j | _  n  | j d k rH | j | _ | j | _ n  t | j ƒ } d G| GH| d k rx t d ‚ n  Ht	 | j
 ƒ } | r— d GHHn  t | j | j | j | j | j | j | j d ƒ } | j ƒ  } | sì t d ƒ ‚ | j d ƒ t d	 | ƒ rd  S| j ƒ  st ‚ | j ƒ  d  k r@t d
 ƒ ‚ n  | j ƒ  d  k rat d ƒ ‚ n  t | j  | j | j | j | j | j | j d d | ƒ} xì d d GHH| j ƒ  } | sÁPn  | j | j ƒ | j ƒ  d  k	 sét ‚ | j ƒ  d  k	 st ‚ t d	 | ƒ rq¡n  t j j ƒ  t j  d | d | d | d | ƒ }	 |	 j! ƒ  d k rbd GHHq¡x% |	 j" D] }
 d d GHH|
 j ƒ  qlWq¡d  S(   NR	   s
   Tolerance:g        s$   Tolerance must be greater than zero.s(   Models are diffraction index equivalent.i    s!   Problems reading reference model.s   Reference modelRB   s/   Unit cell parameters unknown (reference model).s&   Space group unknown (reference model).i   R3   t   #iO   t   model1t   model2R   t'   models_are_diffraction_index_equivalents   No matches.t   .(#   R   R   R   R
   R   R   R&   R   t
   ValueErrort   intR   RT   R   R   R   R   Ry   Rp   t   showR   R9   R   R(   Rt   R   R   R   RD   t   syst   stdoutt   flushR:   t   model_matchest	   n_matchest   refined_matches(   t   server_infoR   t   statusR   R   t   models1R�   t   models2R‚   R‹   t   match(    (    s<   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/web/emma.pyt   run_implementationÀ   sv    			 			c         C   s'   d GHt  d |  d | d | ƒ d GHd  S(   Ns   <pre>RŽ   R   R�   s   </pre>(   R“   (   RŽ   R   R�   (    (    s<   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/web/emma.pyt   run  s    (   t
   __future__R    t   cctbxR   R:   R   R   R   t	   cctbx.webR   R   t	   itertoolsR   Rˆ   R!   R0   RI   RS   t   objectRT   R   R“   R”   (    (    (    s<   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/web/emma.pyt   <module>   s    				c	A