ó
Ö™xTc           @   sÜ   d  Z  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	 Z	 d d l
 Z
 d „  Z d a e d „ Z d	 „  Z d d
 „ Z d „  Z e d k rØ d e
 j k rÈ e ƒ  n  e d e ƒ n  d S(   så   
Create a simple table of crystal symmetry in structures deposited in the PDB.
This can be used for comparison with "novel" datasets, possibly indicating
whether a crystallized is actually a previously characterized contaminant.
iÿÿÿÿ(   t   divisionN(   t   easy_pickle(   t
   group_args(   t   sqrtc      	   C   s¹  d d l  m } d d l  m } d d l  m } g  } t |  ƒ j ƒ  } t } xd| D]\} | j ƒ  } | r™| j ƒ  } | d }	 y? | j	 g  | d d !D] }
 t
 |
 j d d	 ƒ ƒ ^ qš ƒ } Wn  t k
 rä } d
 GH| GHqU n Xy# | j d j | d d !ƒ ƒ } Wn  t k
 r*} d GH| GHqU n Xy | j d | d | ƒ } Wn t k
 rgd GH| GHqU n X| j ƒ  } | j t d |	 d | d | ƒ ƒ qU | j d ƒ rU t } qU qU W| S(   Niÿÿÿÿ(   t   crystal(   t   sgtbx(   t   uctbxi    i   i   t   ,t    s   Unit cell error:t    s   Unrecognized space group:t	   unit_cellt   space_group_infos"   Incompatible unit cell parameters:t   pdb_idt   crystal_symmetryt   niggli_cells   -----(   t   cctbxR   R   R   t   opent	   readlinest   Falset   stript   splitR
   t   floatt   replacet   RuntimeErrorR   t   joint   symmetryt   AssertionErrorR   t   appendR   t
   startswitht   True(   t	   file_nameR   R   R   t   dbt   linest   processt   linet   fieldsR   t   xt   uct   et   sgt   symmt   niggli_symm(    (    s@   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/pdb_symmetry.pyt   parse_database   sJ    
?#c         C   s¹   t  d  k	 r t  St j j d d d t j j ƒ } t j j d d d t j j ƒ } | d  k sd |  r¦ | d  k	 sv t ‚ t	 | ƒ a  |  rµ t
 j | d  d t  ƒ qµ n t
 j | ƒ a  t  S(   Nt   relative_paths   chem_data/pdb/crystal.pklt   tests   chem_data/pdb/crystal.idxiüÿÿÿs   .pkl(   t   db_t   Nonet   libtbxt   envt   find_in_repositoriest   ost   patht   isfileR   R*   R   t   dumpt   load(   t   save_picklet   pkl_file_namet   txt_file_name(    (    s@   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/pdb_symmetry.pyt   load_db8   s    c         C   s€   t  |  ƒ t  | ƒ k o# d k n s. t ‚ d } d } x/ t |  | ƒ D] \ } } | | | d 7} qJ Wt | t  |  ƒ ƒ S(   Ni    i   (   t   lenR   t   zipR   (   t   params1t   params2t   sumt   nt   x1t   x2(    (    s@   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/pdb_symmetry.pyt   rms_differenceK   s    .c      
   C   s  g  } | j  ƒ  } | j ƒ  j ƒ  } | j ƒ  j ƒ  } x´ |  D]¬ } | j  j ƒ  j ƒ  } | j  j ƒ  j ƒ  }	 t | d d !|	 d d !ƒ t | d d !|	 d d !ƒ }
 | d  k	 rÃ |
 | k rÃ q= n  | j t d | d |
 d | | ƒ ƒ q= W| j d „  ƒ | S(   Ni    i   i   t   entryt   rmsdt   volume_ratioc         S   s   t  |  j | j ƒ S(   N(   t   cmpRE   (   R$   t   y(    (    s@   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/pdb_symmetry.pyt   <lambda>g   s    (	   R   R
   t   volumet
   parametersRC   R.   R   R   t   sort(   t   symmetry_dbR   t   max_rmsdt   scoresR   t   input_volumet	   niggli_ucRD   t   entry_volumet   entry_ucRE   (    (    s@   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/pdb_symmetry.pyt   symmetry_searchS   s     c          C   s¯   d d  l  }  d } d } d | | f } d | GH|  j | ƒ } t j j d d d t j j ƒ } t j j | d	 ƒ } t	 | d
 ƒ } | j
 | j ƒ  ƒ | j ƒ  d | GHd  S(   Niÿÿÿÿs   ftp.wwpdb.orgs&   pub/pdb/derived_data/index/crystal.idxs   ftp://%s/%ss   Retrieving %sR+   s   chem_data/pdbR,   s   crystal.idxt   ws   Wrote %s(   t   urllib2t   urlopenR/   R0   R1   R2   R3   t   isdirR   R   t   writet   readt   close(   RV   t   hostt   filet   urlt   datat   dest_dirt	   dest_filet   f(    (    s@   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/pdb_symmetry.pyt   download_crystal_dbj   s    	
t   __main__s   --updateR7   (   t   __doc__t
   __future__R    t   libtbx.load_envR/   R   R   t   mathR   R2   t   sysR*   R.   R-   R   R:   RC   RT   Rc   t   __name__t   argvR   (    (    (    s@   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/pdb_symmetry.pyt   <module>   s"   	'		
