ó
™™xTc           @   s^  d  d l  m Z d  d l Z d  d l 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 m Z d  d l Z d  d l Z d  d l Z d  d l Z e j Z e j j d d d	 e ƒ Z d
 j ƒ  Z d „  Z e ƒ  Z  d „  Z! d „  Z" d „  Z# d „  Z$ d „  Z% d „  Z& d „  Z' e( d k rZe' d e j) d ƒ n  d S(   iÿÿÿÿ(   t   divisionN(   t   flex(   t   matrix(   t	   show_diff(   t   sequence_index_dictt   format_cpu_timest   relative_paths#   phenix_regression/protein_pdb_filest   optionalsL  ala_chain_all_h_1ozo_v3.ent
arg_chain_all_h_1o8t_v3.ent
asn_chain_all_h_1o8t_v3.ent
asp_chain_all_h_1jjx_v3.ent
cys_chain_all_h_1rfa_v3.ent
gln_chain_all_h_1o8t_v3.ent
glu_chain_all_h_1bm4_v3.ent
gly_chain_all_h_1ozo_v3.ent
his_chain_all_h_1g7e_v3.ent
ile_chain_all_h_1ozo_v3.ent
leu_chain_all_h_1ozo_v3.ent
lys_chain_all_h_1o8t_v3.ent
met_chain_all_h_1ozo_v3.ent
mse_chain_all_h_1ozo_v3.ent
phe_chain_all_h_1hdj_v3.ent
pro_chain_all_h_1a03_v3.ent
ser_chain_all_h_1o8t_v3.ent
thr_chain_all_h_1o8t_v3.ent
trp_chain_all_h_1cx1_v3.ent
tyr_chain_all_h_1cx1_v3.ent
val_chain_all_h_1ozo_v3.ent
c          C   s/   i  }  x" t  D] } | |  | d  j ƒ  <q W|  S(   Ni   (   t   reference_pdb_file_namest   upper(   t   resultt	   file_name(    (    sU   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/monomer_library/tst_rotamer_utils.pyt%   __init_reference_pdb_file_name_lookup*   s    c         C   sJ  d } t  d |  ƒ } x| j ƒ  D]\ } } g  | D] }	 | j |	 ƒ ^ q5 }
 |
 j d  ƒ d k rn d  } n8 g  |
 D] } | | ^ qu } t j j d | d t ƒ } | j | ƒ } | d  k	 r
| d  k	 r
t	 j
 j d | d | ƒ d k rd } | d	 7} qd
 } n d } | r" | G| G| G| GHq" q" W| d k sFt | ƒ ‚ d  S(   Ni    t   seqt   sitest   degt   angle_1t   angle_2gñhãˆµøä>t   MISMATCHi   t	   OK_targett	   no_target(   R   t   itemst   gett   countt   Nonet   scitbxt   matht   dihedral_anglet   Truet   cctbxt   geometry_restraintst   angle_delta_degt   AssertionError(   t   mon_lib_atom_namest
   sites_cartt   tor_atom_ids_by_tor_idt   target_anglest   verboset   n_mismatchest   i_seq_by_atom_namet   tor_idt   atom_idst   ait   jst   angle_modelt   jt   d_sitest   target_anglet
   annotation(    (    sU   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/monomer_library/tst_rotamer_utils.pyt   report_tors1   s(    "		 c         C   s_   | d  k r d  S|  j ƒ  } x< | j ƒ  D]. } | j j ƒ  | k r) | j d | ƒ q) q) Wd  S(   Nt   atom(   R   t   only_atom_groupt   atomst   namet   stript   remove_atom(   t   pdb_hierarchyt   atom_ids_not_handledt   agR2   (    (    sU   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/monomer_library/tst_rotamer_utils.pyt   remove_atom_ids_not_handledN   s     c         C   sÁ  | j  ƒ  j } i d g d 6d g d 6j | ƒ } | j  ƒ  j ƒ  } |  j d | ƒ } | d  k	 rÔ | j d | j ƒ  d | j ƒ  ƒ } t	 t
 | j ƒ d d	 !d
 ƒ s¬ t ‚ t d | d | ƒ | j  ƒ  j ƒ  } n  | j d t j | j ƒ  d ƒ ƒ | j d t j | j ƒ  d ƒ ƒ | j ƒ  } d | _ d | _ | j ƒ  j d k sQt ‚ xit t g D][}	 |	 rÄ| j ƒ  }
 x6 |
 j ƒ  D]( } | j d k rƒ|
 j d | ƒ qƒqƒW| j  ƒ  j ƒ  } n  | j ƒ  | j d | j ƒ  d | j ƒ  d t ƒ } | j rt | j ƒ ‚ n  | j d  k	 r^|	 rLt | j  ƒ | j! j" k sLt ‚ n  t# g  | j$ D] } | j% ^ qYƒ } x6 | j  D]+ } | | k r{t d | | f ƒ ‚ q{q{Wg  } x3 | j j& D]% } | | j' k r½| j( | ƒ q½q½Wt | ƒ d k r"| rd Gd j) | ƒ GHn  |	 s"t ‚ n  |	 r1d } n d } | d } t* j+ j, | ƒ sct* j- | ƒ n  t* j+ j, | ƒ s…t* j- | ƒ n  g  } g  } d } x¥t. | ƒ D]—\ } \ } } t/ d | j  d | d | j0 d t1 t2 | j j& | j3 ƒ ƒ d | ƒ | j4 ƒ  } | j ƒ  } | j5 d | ƒ | j6 d  d ƒ d! | | | j7 f } | rYd" G| GHn  t8 | d# ƒ } | d$ | | j7 f IJ| j9 | j: d% t ƒ ƒ ~ | t; j< d* ƒ | 7} | j5 d | ƒ | j6 d  | ƒ | | j ƒ  7} t= j> t= j? | } | | j@ ƒ  _7 | j( d' | | j7 | f ƒ | j( | j: d% t ƒ ƒ q¤Wd( | | f } | rad" G| GHn  t8 | d# ƒ } x | D] } | | IJqwWx | D] } | j9 | ƒ q’W| d) IJ~ q^q^Wd  S(+   Nt   HD2t   ASPt   HE2t   GLUt   comp_idt
   atom_namesR"   i   iýÿÿÿs,   : rotamer_info does not handle these atoms: R8   R9   t   new_occi   t   new_bi    t    t    s    HR2   t   fine_samplings   Missing comp atom: %s %ss"   Info: unused rotamer_info.tor_ids:t   rotamers_no_ht   rotamers_with_ht   _sepR!   R#   R$   R%   t   new_xyzt   first_values   %s/%s_%s.pdbs   Writing file:t   ws   REMARK %s %st
   append_endi   s   REMARK %s %s = chain %ss	   %s/%s.pdbt   END(   i   i   i   (A   t   only_residuet   resnameR   R4   t   get_comp_comp_id_directR   t   rotamer_iteratort   extract_namet   extract_xyzR   t   strt   problem_messageR    R;   t   set_occR   t   doublet   sizet   set_bt   only_residue_groupt   resseqt   icodeR3   t   altloct   FalseR   t   elementR7   t   reset_i_seqt   RuntimeErrort   rotamer_infot   lenR!   t	   chem_compt   number_atoms_nht   sett	   atom_listt   atom_idt   tor_idst   i_q_packed_by_tor_idt   appendt   joint   ost   patht   isdirt   mkdirt	   enumerateR1   t   rotamer_tor_atom_ids_by_tor_idt   dictt   zipt   anglest	   deep_copyt   set_xyzt   reset_serialt   idt   opent   writet   as_pdb_stringR   t   colt   stringt	   uppercaset	   lowercaset
   only_chain(   t   mon_lib_srvR8   R%   RP   R9   t	   pdb_atomst   comp_comp_idRR   t   rgt   strip_hydrogensR:   R2   t   comp_atom_name_setR5   t   unused_rotamer_info_tor_idsR(   t   rotamers_sub_dirt   rotamers_sep_sub_dirt   remark_stringst   atom_stringst   atom_serial_first_valuet	   i_rotamert   rotamert   rotamer_sites_cartt   pdb_hierarchy_workt   pdb_atoms_workR   t   ft   chain_idt   s(    (    sU   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/monomer_library/tst_rotamer_utils.pyt    exercise_server_rotamer_iteratorU   sÐ    
	""		
			
			  
c         C   sJ  xC| D];} | d k r q n  |  j  d | ƒ j ƒ  } | d  k rI q n  xö| j D]ë} d | | j | f } | r} | GHn  t j | | ƒ }	 t j j	 d |	 ƒ }
 |
 j
 ƒ  } | j ƒ  } xl | j ƒ  D]^ } | j d k s| d k rù | j d k s| d	 k rÉ | j d
 k rÉ | j d | ƒ qÉ qÉ W|  j  d | ƒ } | j ƒ  j ƒ  } | j d | j ƒ  d | j ƒ  ƒ } | j d  k sˆt ‚ | j } x  t | j | j ƒ D]‰ \ } } | | } | rÓ| G| G| GHn  t j j d | d | ƒ d k r§| s| d k r0d G| G| j G| Gd | Gd | GHq0q§q§W| rS HqS qS Wq Wd  S(   Nt   PROR@   s   %s_%s%sR   s    H2 s    HC1R=   t   HD21R?   t   HE21R2   RA   R"   R   R   g      à?t   ARGt   ASNt   GLNt   Mismatchs	   pdb: %.0fs	   tab: %.0f(   s    H2 s    HC1(   R›   Rœ   R�   (   RQ   Rc   R   R�   Rz   t   opRm   t   iotbxt   pdbt   inputt   construct_hierarchyR3   R4   R5   R7   RO   RR   RS   RT   RV   R    t   angle_start_by_tor_idRu   Rj   Rv   R   R   R   (   Rƒ   t   amino_acid_resnamest   pdb_dirt   file_name_extensionR%   RP   Rc   R�   R   Ro   t   pdb_inpR8   R:   R2   R…   R„   RR   R¤   R(   t	   angle_tabt	   angle_pdb(    (    sU   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/monomer_library/tst_rotamer_utils.pyt   compare_dihedralsÃ   sR    	  		"
  c   
      C   sæ   t  j j d | ƒ } | j ƒ  } | j ƒ  j } i d d d g d 6d d d g d	 6} t d
 | d | j | ƒ ƒ | j ƒ  j ƒ  } |  j	 d | ƒ } | j
 d | j ƒ  d | j ƒ  ƒ } | j }	 |	 d  k	 râ t d |	 ƒ ‚ n  d  S(   NR   t   HD1R<   t   2HDR=   t   HE1R>   t   2HER?   R8   R9   R@   RA   R"   s$   rotamer_iterator.problem_message: %s(   R    R¡   R¢   R£   RO   RP   R;   R   R4   RQ   RR   RS   RT   RV   R   Rb   (
   Rƒ   t   pdb_file_nameR¨   R8   RP   t   atom_ids_not_handled_by_resnameR„   R…   RR   t   msg(    (    sU   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/monomer_library/tst_rotamer_utils.pyt   exercise_terminió   s"    		c         C   s‰   t  j j d d  d d ƒ } | j ƒ  } | j ƒ  } |  j d | j d | j ƒ  j	 ƒ  d | j ƒ  j
 ƒ  ƒ } t | j d ƒ s… t ‚ d  S(   Nt   source_infot   liness  ATOM    110  N   PRO A 263       0.453 -20.680 -39.256  1.00 53.34           N
ATOM    111  CA  PRO A 263       0.444 -22.054 -39.751  1.00 50.42           C
ATOM    112  C   PRO A 263       0.860 -22.998 -38.645  1.00 52.10           C
ATOM    113  O   PRO A 263       1.693 -22.614 -37.817  1.00 48.32           O
ATOM    114  CB  PRO A 263       1.491 -22.052 -40.887  1.00 53.30           C
ATOM    115  CG  PRO A 263       2.012 -20.645 -40.990  1.00 57.05           C
ATOM    116  CD  PRO A 263       1.586 -19.897 -39.782  1.00 53.45           C
ATOM    117  HA  PRO A 263      -0.437 -22.302 -40.100  1.00 60.51           H
ATOM    118  HB2 PRO A 263       2.210 -22.664 -40.664  1.00 63.96           H
ATOM    119  HB3 PRO A 263       1.066 -22.318 -41.718  1.00 63.96           H
ATOM    120  HG2 PRO A 263       2.980 -20.669 -41.043  1.00 68.45           H
ATOM    121  HG3 PRO A 263       1.645 -20.229 -41.786  1.00 68.45           H
ATOM    122  HD2 PRO A 263       1.267 -19.021 -40.049  1.00 64.14           H
R@   RA   R"   s0   resname=PRO: missing atom "HD1" for tor_id "hh3"(   R    R¡   R¢   R   R£   RO   RR   RP   R4   RS   RT   R   RV   R    (   Rƒ   R¨   R8   t   residueRR   (    (    sU   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/monomer_library/tst_rotamer_utils.pyt   exercise_pro_missing_hd1  s    			c         C   sø  t  } g  } xE |  D]= } | d k r. t } q t j | ƒ sC t ‚ | j | ƒ q Wt j j j ƒ  } t	 t
 j j j j ƒ  ƒ } xt | D]l } | r  d G| GHn  t
 j j d t j t t | ƒ ƒ } | j ƒ  } t d | d | d | ƒ | rˆ Hqˆ qˆ Wt | ƒ d k rCt j j d d	 ƒ }	 |	 d  k r3d
 GHqC| j |	 ƒ n  x3 | D]+ }	 t d | d | d |	 d d d | ƒ qJWxc t j t ƒ D]R }
 |
 j d ƒ s¤q‰n  | r²|
 GHn  t d | d t j t |
 ƒ ƒ | r‰Hq‰q‰Wt d | ƒ t  ƒ  GHd  S(   Ns	   --verboses   resname:R   Rƒ   R8   R%   i    R   s&   phenix_regression/semi_emp_rotamer_pdbsA   Skipping compare_dihedrals(): semi_emp_rotamer_pdb not available.R¥   R¦   R§   s   .uhf_631dp.pdbs   .entR°   (!   R_   R   RŸ   Rp   R    Rl   t   mmtbxt   monomer_libraryt   servert   sortedR    R¡   t   amino_acid_codest   one_letter_given_three_lettert   keysR¢   Rm   t   protein_pdb_filest   reference_pdb_file_name_lookupR£   R—   Rd   t   libtbxt   envt   find_in_repositoriesR   R«   Rn   t   listdirt   endswithR³   R·   R   (   t   argsR%   t   semi_emp_rotamer_pdb_dirst   argRƒ   R¥   RP   R¨   R8   R¦   R   (    (    sU   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/monomer_library/tst_rotamer_utils.pyt   run   s`    	  	   t   __main__RÆ   i   (*   t
   __future__R    t   mmtbx.monomer_library.serverR¸   t   iotbx.pdb.amino_acid_codesR    t   cctbx.geometry_restraintsR   t   scitbx.mathR   t   scitbx.array_familyR   R   t   libtbx.test_utilsR   t   libtbx.utilsR   R   t   libtbx.load_envRÁ   R   t   sysRn   Ro   RŸ   RÂ   RÃ   R_   R¿   t
   splitlinesR   R   RÀ   R1   R;   R—   R«   R³   R·   RÉ   t   __name__t   argv(    (    (    sU   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/monomer_library/tst_rotamer_utils.pyt   <module>   s6   							n	0			/