ó
Æ™xTc           @   sð  d  d l  m 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  d l Z d Z d d	 d
 d d d d d d d d d d d d d d d d d d d d d d  d! d" d# g Z d$ e f d% „  ƒ  YZ d& „  Z d' „  Z d( „  Z e ƒ  Z e d) „ Z e d* „ Z d e d+ „ Z d, „  Z d- „  Z e e d. „ Z d d/ „ Z d0 „  Z d d e j  d d1 „ Z! e e e j  d2 „ Z" e d3 „ Z# d4 „  Z$ i d5 d6 g d7 6d5 d6 g d8 6d5 d9 g d: 6d5 d9 g d; 6d5 d9 g d< 6Z% i d9 d= d> d? d@ dA dB dC dD dE dF dG dH g d7 6d9 dI d= dJ dK dL d? d@ dA dB dM dF dG dH g d8 6d= dN d? d@ dO dP dQ dA dR dB dS g d: 6d= dN d? dT d@ dU dA dV dW dX dY dB dS g d; 6d= dN d? dT d@ dU dA dR dB dS g
 d< 6Z& dZ d[ „ Z' d S(\   iÿÿÿÿ(   t   division(   t   utilsN(   t   easy_run(   t   Sorry(   t   Autos¡  
base_pair
  .multiple = True
  .optional = True
  .style = noauto
{
  base1 = None
    .type = str
  base2 = None
    .type = str
  saenger_class = None
    .type = str
    .optional = True
    .caption = Saenger number if applicable
    .help = reference
  leontis_westhof_class = *Auto wwt
    .type = choice
    .caption = Automatic Watson-Crick
    .help = reference
# TODO
#  planar = False
#    .type = bool
}
t   It   IIt   IIIt   IVt   Vt   VIt   VIIt   VIIIt   IXt   Xt   XIt   XIIt   XIIIt   XIVt   XVt   XVIt   XVIIt   XVIIIt   XIXt   XXt   XXIt   XXIIt   XXIIIt   XXIVt   XXVt   XXVIt   XXVIIt   XXVIIIt   pair_databasec           B   sM   e  Z d  „  Z e d „ Z d „  Z e d „ Z e d „ Z e e d „ Z	 RS(   c         C   sŒ  i  |  _  i  |  _ t j j t ƒ \ } } t d | ƒ j ƒ  } xEt | ƒ D]7\ } } | j	 d ƒ rn qM n  | j
 ƒ  j ƒ  } t | ƒ d k s˜ t ‚ | d } | d k r· d } n  | d } | d k rÖ d  } n  | d }	 | d	 }
 g  | d
 D], } | j d ƒ d | j d ƒ d f ^ qõ } g  | d
 D]< } | j d ƒ d | j d ƒ d	 | j d ƒ d
 g ^ q2} xj t t | ƒ ƒ D]V } x9 t d	 ƒ D]+ } | | | d k ršd  | | | <qšqšWt | | ƒ | | <q‡W|
 d k rù|  j  } n	 |  j } x | | g D]q } | d  k r| d k r| | k r_|	 | | k rit d | ƒ ‚ qin
 i  | | <| | g | | |	 <qqWqM Wd  S(   Ns   %s.datat   #i   i    t   _t   otheri   i   i   i   t   ,t   +s0   Duplicate entry in base pair dictionary, line %d(   t   _h_bond_pairst   _pseudo_bond_pairst   ost   patht   splitextt   __file__t   opent	   readlinest	   enumeratet
   startswitht   stript   splitt   lent   AssertionErrort   Nonet   ranget   tuplet   RuntimeError(   t   selft   baset   extt   dblinest   it   linet   fieldst   lw_classt   saenger_classt   paired_basest   hydrogen_flagt   pt
   atom_pairst	   distancest   jt   dbt   key(    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/secondary_structure/base_pairing.pyt   __init__)   sJ    		
	
	

:J	
c   	      C   s‰   | r |  j  } n	 |  j } g  } xa | j ƒ  D]S \ } } | t k rL q. n  | | k r. | | \ } } | j | | | f ƒ q. q. W| S(   N(   R'   R(   t	   iteritemst   saenger_listt   append(	   R9   t	   base_pairt   use_hydrogensRH   t   allowed_typest	   pair_typet
   pair_rulesRE   RF   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/secondary_structure/base_pairing.pyt   get_pair_saenger_classesS   s    	c         C   s;   | j  d ƒ } t | ƒ d k s' t ‚ | d d | d S(   Nt   -i   i   i    (   R2   R3   R4   (   R9   RN   t   bases(    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/secondary_structure/base_pairing.pyt   invert_basesa   s    c         C   s�   | r |  j  } n	 |  j } | | } | | k r= | | d S|  j | ƒ | k rm t | |  j | ƒ d ƒ St d | | t | ƒ f ƒ ‚ d  S(   Ni    s.   No entry for base pair %s with type %s (H=%s).(   R'   R(   RV   t   invert_pairsR8   t   str(   R9   RN   RQ   RO   RH   RR   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/secondary_structure/base_pairing.pyt	   get_atomsf   s    	
c         C   sŠ   | r |  j  } n	 |  j } | | } | | k r= | | d S|  j | ƒ | k rg | |  j | ƒ d St d | | t | ƒ f ƒ ‚ d  S(   Ni   s.   No entry for base pair %s with type %s (H=%s).(   R'   R(   RV   R8   RX   (   R9   RN   RQ   RO   RH   RR   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/secondary_structure/base_pairing.pyt   get_distancest   s    	
c         C   sd  d  } t | ƒ } |  j | ƒ } | r3 |  j } n	 |  j } x!| D]}	 | | |	 k rN| |	 | d j d t ƒ | j d t ƒ t | |	 | d ƒ }
 |
 j t | ƒ ƒ } | |	 | d | k sÜ | r\| |
 k r\| d  k rñ |	 } qKt	 | ƒ rt	 |	 ƒ r|	 } qKt	 | ƒ r/t	 |	 ƒ r/qK| G|	 GHt
 d | ƒ ‚ q\qC | | |	 k rC | |	 |  j | ƒ d j d t ƒ | j d t ƒ t | |	 | d ƒ }
 |
 j t | ƒ ƒ } | |	 | d | k sê| r\| |
 k r\| d  k rÿ|	 } qYt	 | ƒ r!t	 |	 ƒ r!|	 } qYt	 | ƒ r=t	 |	 ƒ r=qY| G|	 GHt
 d | ƒ ‚ q\qC qC W| S(   Ni    RI   s)   Redundant entries found for base pair %s.(   R5   RW   RV   R'   R(   t   sortt
   sort_tuplet   sett   intersectiont
   is_saengerR8   (   R9   RN   RE   RO   t   ignore_extra_pairst   return_pair_typet   inverted_atom_pairst   inverted_pairRH   RQ   t   db_pairs_sett   common_pairs(    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/secondary_structure/base_pairing.pyt   get_pair_type‚   sL    				%			(
   t   __name__t
   __module__RJ   t   FalseRS   RV   RY   RZ   t   TrueRf   (    (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/secondary_structure/base_pairing.pyR!   (   s   	*	c         C   s   |  t  k r t St Sd  S(   N(   RL   Rj   Ri   (   RI   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/secondary_structure/base_pairing.pyR_   ®   s    c         C   s6   g  } x) |  D]! } | j  | d | d f ƒ q W| S(   Ni   i    (   RM   (   t   h_bond_atomst   inverted_h_bond_atomst   pair(    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/secondary_structure/base_pairing.pyRW   ´   s    c         C   s   |  d S(   Ni    (    (   R7   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/secondary_structure/base_pairing.pyR\   º   s    c         C   s•   t  |  d ƒ j ƒ  d t  |  d ƒ j ƒ  } | d  k	 rI | j ƒ  } n9 | d  k	 rv | d k sg t ‚ | j ƒ  } n t d ƒ ‚ t j | | | ƒ S(   Ni    RT   i   R   s   Base pair type not specified.(   t   clean_single_base_nameR1   R5   t   upperR4   R   RH   RY   (   t   residuesRA   t   leontis_westhof_classRO   RN   RQ   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/secondary_structure/base_pairing.pyt   get_h_bond_atoms¿   s    c         C   sƒ   t  |  d ƒ j ƒ  d t  |  d ƒ j ƒ  } | d  k	 rI | j ƒ  } n' | d  k	 rd | j ƒ  } n t d ƒ ‚ t j | | | ƒ S(   Ni    RT   i   s   Base pair type not specified.(   Rn   R1   R5   Ro   R   RH   RZ   (   Rp   RA   Rq   RO   RN   RQ   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/secondary_structure/base_pairing.pyRZ   Î   s    c         C   s^  t  j j d d ƒ s t ‚ t j d |  ƒ } | r| |  j ƒ  } | j ƒ  j ƒ  t j	 d | ƒ } t j
 d | d | ƒ } n |  } t | d t ƒj } | r1d } x‘ | D]€ }	 |	 j d ƒ r|	 d d	 !}
 d } | j |
 ƒ r|	 d
 d !d |	 d } | | d 7} q*| |	 d 7} qª | |	 d 7} qª Wn | } d | d } t j | d | ƒ} | S(   Nt   namet   probet   pdb_hierarchyt   seg_dictt   remove_hydrogenst    t   ATOMiH   iL   i    i   s     i   s   
s   phenix.probe s    -t   stdin_lines(   t   libtbxt   envt
   has_moduleR4   R   t   find_bare_chains_with_segidst	   deep_copyt   atomst   reset_i_seqt   seg_id_to_chain_idt   assign_chain_idst
   run_reduceRi   t   stdout_linesR0   t   getR   t   fully_buffered(   Ru   t   flagst   add_hydrogenst   bare_chainst   tmp_pdb_hierarchyRv   t
   rename_txtt   reduce_outputt   reverted_reduce_outputR>   t   segidt   tmp_linet   cmdt   probe_output(    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/secondary_structure/base_pairing.pyt	   run_probeÜ   s8    				c         C   sI   |  } t  j d d | ƒ } t  j d d | ƒ } t  j d d | ƒ } | S(   Ns&   ^((ATOM  |HETATM).{11}) ([ACGU])([Rr])s   \1  \3s!   ^((ATOM  |HETATM).{11})([ACGU])  s&   ^((ATOM  |HETATM).{11}) ([ACGT])([Dd])s   \1 D\3(   t   ret   sub(   t   pdb_linet
   clean_line(    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/secondary_structure/base_pairing.pyt   clean_base_namesÿ   s
    c         C   sI   |  } t  j d d | ƒ } t  j d d | ƒ } t  j d d | ƒ } | S(   Ns    ([ACGU])([Rr])s     \1s
   ([ACGU])  s    ([ACGT])([Dd])s    D\1(   R”   R•   (   R:   t
   clean_base(    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/secondary_structure/base_pairing.pyRn     s
    c         C   sæ   d } d } d } |  j  ƒ  } g  } x? | j ƒ  D]1 } | j d ƒ s1 t | ƒ } | j | ƒ q1 q1 Wd j | ƒ }	 | rœ t j | d |	 ƒ}
 |
 j } n |	 } t j | d | ƒ} | râ t	 d d ƒ j
 d j | j ƒ ƒ n  | S(	   Ns   phenix.reduce -quiet -trim -s%   phenix.reduce -quiet -build -allalt -Rx   t   ANISOUs   
Rz   s   allatom.pdbt   w(   t   as_pdb_stringt
   splitlinesR0   R˜   RM   t   joinR   R‡   R…   R-   t   write(   t	   hierarchyRw   t   debugt   trimt   buildt	   input_strt
   pdb_stringt   clean_linesR>   t   clean_pdb_stringt   cleant   output(    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/secondary_structure/base_pairing.pyR„     s(    		%c         C   s´  | d  k r d } n  t d |  d | ƒ } i  } i  } i  } t | j ƒ } x)| D]!} | j d ƒ } | d | d g }	 |	 j d t ƒ |	 d d d	 !}
 |	 d
 d d	 !} |	 d d d !} |	 d
 d d !} |
 | } | j ƒ  d | j ƒ  } | j ƒ  d d k sR | j ƒ  d d k r%qR n  | | k r>i  | | <n  | | | k r_d | | | <n  | | | c d
 7<qR Wx¥ | D]� } d } g  | | <xI | | D]= } | | | d k rŸ| | j t	 | j d ƒ ƒ ƒ qŸqŸWt
 | | ƒ d k r~| | j d t ƒ | | | | <q~q~Wg  } xˆ | D]€ } | d	  | d	 f }	 | d d	 !j ƒ  d | d d !j ƒ  } t j | | | d t ƒ} | d  k	 r,| j |	 | g ƒ q,q,W| S(   Ns5   -Both -Unformated -NOCLASHOUT -NOVDWOUT "BASE" "BASE"Ru   Rˆ   t   :i   i   RI   i    i
   i   i   i   R%   t   Ci   i   RT   i   i   RO   (   R5   R“   t   iterR…   R2   R[   t   get_resnameR1   RM   R7   R3   R\   RH   Rf   Rj   (   Ru   t   probe_flagst	   probe_outt
   hbond_hasht	   pair_hasht   reduced_pair_hasht
   probe_iterR>   t   tempRU   t   base1t   base2t   atom1t   atom2t   base_keyt   bond_keyRI   t   countert   bondt   base_pair_listRm   RN   RQ   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/secondary_structure/base_pairing.pyt   get_base_pairs.  sT    		
,
'(c         C   s   |  d d !} | S(   Ni   i
   (    (   t   probe_fieldt   resname(    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/secondary_structure/base_pairing.pyR­   ^  s    c         C   s†  | d IJt  |  | ƒ } t | ƒ d k r/ d  Sg  } d } | d  k	 rT d | } n  xþ | D]ö \ } }	 g  }
 xC | D]; } | d d !j ƒ  } | d k r¢ d } n  |
 j | ƒ qt Wt |	 ƒ rÈ d } n d } t j | d d	 j ƒ  d
 | d d	 j ƒ  |	 d t ƒ} | j d |
 d | | d d d !|
 d | | d d d !| |	 f ƒ q[ Wd d j	 | ƒ } | d  k	 r‚d | | f S| S(   Ns&     Running PROBE to identify base pairsi    Rx   s   and segid "%s" i   t    RA   Rq   iýÿÿÿRT   i   RO   sm   base_pair {
  base1 = """chain "%s" %sand resseq %s"""
  base2 = """chain "%s" %sand resseq %s"""
  %s = %s
}i   s   nucleic_acids {
%s
}s   
s	   %s {
%s
}(
   R¾   R3   R5   R1   RM   R_   RH   RZ   Ri   Rž   (   Ru   R®   t   prefixt   logt	   add_segidR½   t   phil_stringst   segid_extraRU   RQ   t   chainsR:   t   chaint   type_keyRF   t   phil_str(    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/secondary_structure/base_pairing.pyt   get_phil_base_pairsb  s8    
		-	% c   $      C   sò  |	 d k r | d k s t  ‚ d d l m } | j ƒ  } | j ƒ  } d } xŸ| D]—} | j d  k sw | j d  k rÊ d d d t | j ƒ t | j ƒ f } | rº t	 d | ƒ ‚ qÊ | | IJqS n  yö| j
 d | j d	 | d
 | ƒ } | j
 d | j d	 | d
 | ƒ } t d | | f d | j d | j d | ƒ } t d | | f d | j d | j d | ƒ } t | ƒ t | ƒ k s‡t  ‚ x5t | ƒ D]'\ } \ } } d | | j f } d | | j f } | j | | | ƒ \ } } | | d k s| | d k rS| d IJ| d | | j ƒ  j ƒ  IJ| d | | j ƒ  j ƒ  IJq”n  | | c d 7<| | c d 7<|
 rd } | | d d  k	 rªt | | d ƒ } n | } | | d d  k	 rÛt | | d ƒ }  n | }  | | d d  k	 rt | | d ƒ }! q-|	 }! n | } | } | }  |	 }! | rk| d k rk| | j | | ƒ }" |" | k rkq”qkn  |  j d | | g d | d | d d |  d d |! ƒ |  j | | ƒ | d 7} q”WWqS t k
 ré}# | d t |# ƒ IJqS XqS W| S(   Ni    iÿÿÿÿ(   R   s0     One or more selections missing for base pair:
s       base 1: %s
s       base 2: %ss   %s
  Please define both bases.t	   resi_selet   selection_cacheR€   Rp   RA   Rq   RO   s   name %s and %si   s!   One or more atoms already bonded:s     %si   t   i_seqst   distance_idealt   distance_cutt   weightt   slack(   R4   t   mmtbx.secondary_structureR   t   atom_selection_cacheR€   Rµ   R5   R¶   RX   R   t   get_residue_name_from_selectionRr   RA   Rq   RZ   R3   R/   t!   hydrogen_bond_from_selection_pairt   fetch_labelst   id_strt   floatt   distancet	   add_proxyt   add_nonbonded_exclusionR8   ($   t   build_proxiest
   base_pairsRu   t   hbond_countsRÏ   RÐ   t   remove_outliersRO   t   sigmaRÒ   t   use_db_valuest    raise_error_if_missing_selectionRÃ   t   ss_utilsRÍ   R€   t	   n_proxiesRN   t   msgt   resname1t   resname2RE   t   distance_valuesR=   t   name1t   name2t   sele1t   sele2t   i_seqt   j_seqt   bp_distance_cutt   bp_distancet   bp_sigmat   bp_slackt   distt   e(    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/secondary_structure/base_pairing.pyt   create_hbond_proxies…  s˜    #
													
			c         C   sž  d d  l  } | j j d ƒ } | j ƒ  } | j ƒ  j ƒ  } | j ƒ  }	 | j ƒ  }
 xC|  D];} | j d  k	 s[ | j
 d k r… q[ n  |
 j | j ƒ j ƒ  } |
 j | j ƒ j ƒ  } t | ƒ d k rÝ t d | j ƒ ‚ n( t | ƒ d k rt d | j ƒ ‚ n  | | d j ƒ  j j ƒ  d } | | d j ƒ  j j ƒ  d } d | | f } t j | ƒ } g  } xc | D][ \ } } } t d | d	 | d
 | d | d | d |	 d | d | ƒ } | j | | f ƒ qsWt j | d  d  d … ƒ } xc | D][ \ } } } t d | d	 | d
 | d | d | d |	 d | d | ƒ } | j | | f ƒ qõWt | ƒ d k rud | _
 q[ n  | j d „  ƒ | d d | _ q[ Wd  S(   Niÿÿÿÿt   mmtbx_secondary_structure_extR   i    s   Empty selection for base1: '%s's   Empty selection for base2: '%s's   %s-%sRE   RF   t   base_1t   base_2t
   atom_namest
   sites_cartRÏ   Râ   t   wwtc         S   s   t  |  d | d ƒ S(   Ni   (   t   cmp(   t   xt   y(    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/secondary_structure/base_pairing.pyt   <lambda>  s    (   t   boost.pythont   pythont
   import_extR€   t   extract_nameR1   t   extract_xyzRÔ   RA   R5   Rq   t	   selectionRµ   t
   iselectionR¶   R3   R   R×   RÀ   RH   RS   t   _get_distance_score_for_classRM   R[   (   RÞ   Ru   RO   RÏ   Râ   t   boostR;   R€   Rú   Rû   t	   sel_cacheRN   Rø   Rù   t
   basecode_1t
   basecode_2t   bpt   classest   class_dist_sqt
   class_nameRE   RF   t   dist_sqt   classes2(    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/secondary_structure/base_pairing.pyt   identify_base_pairsé  sb    !!			c         C   sÇ   d d  l  } | j j d ƒ }	 d }
 x’ t |  ƒ D]„ \ } \ } } | r{ | | d } | d  k	 rr t | ƒ } q{ | } n  |
 |	 j d | d | d | d | d | d	 | d
 | ƒ 7}
 q1 W|
 t |  ƒ S(   NiÿÿÿÿR÷   i    Rø   Rù   t   name_1t   name_2Rú   Rû   RÏ   (   R  R  R  R/   R5   RÙ   t   delta_distance_squaredR3   (   RE   RF   Rø   Rù   Rú   Rû   RÏ   Râ   R	  R;   t   sum_dist_sqt   kt   atm1t   atm2t
   pair_dist_t	   pair_dist(    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/secondary_structure/base_pairing.pyR  #  s$    	s   C1't   N9t   At   Gt   N1R«   t   Tt   Ut   C2t   H2t   N3t   C4t   C5t   C6t   N6t   H61t   H62t   N7t   C8t   H8t   H1t   N2t   H21t   H22t   O6t   O2t   N4t   H41t   H42t   H5t   H6t   H3t   O4t   C7t   H71t   H72t   H73i´   c   	      C   s¥  d d  l  } d  } } g  } |  j j ƒ  } d | k rI | j d ƒ } n. | j d ƒ rw t | ƒ d k rw | d } n  | t j ƒ  k s• t	 | ƒ ‚ xƒ |  j
 ƒ  D]u } | j j ƒ  } | t | d k r× | j } q¢ | t | d k r÷ | j } q¢ | t | k r¢ | j | ƒ q¢ q¢ Wd  | | g k r<t d ƒ ‚ n! t | ƒ d k r]t d ƒ ‚ n  xA | D]9 } | j j d	 | d
 | d | j d | d t ƒ | _ qdWd  S(   Niÿÿÿÿt   rt   Di   i   i    s$   Missing atom(s) for rotateable axis.s   Missing nucleotide base.t   axis_point_1t   axis_point_2t   pointt   anglet   deg(   t   scitbx.matrixR5   RÀ   R1   t   replaceR0   R3   t   base_rotation_axest   keysR4   R€   Rs   t   xyzt   base_rotatable_atomsRM   R8   t   matrixt   rotate_point_around_axisRj   (	   t
   atom_groupRE  t   scitbxRB  RC  t   rotateable_atomst	   base_namet   atomt	   atom_name(    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/secondary_structure/base_pairing.pyt	   flip_baseP  s8    
!	((   t
   __future__R    t   mmtbxR   t   libtbx.load_envR{   R   t   libtbx.utilsR   R   R)   t   sysR”   t   dna_rna_params_strRL   t   objectR!   R_   RW   R\   RH   Ri   Rr   RZ   R5   Rj   R“   R˜   Rn   R„   R¾   R­   t   stdoutRË   Rö   R  R  RI  RL  RU  (    (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/secondary_structure/base_pairing.pyt   <module>   s^   $†				#				0	-[6	!!(!(