B
    d"                 @   s   d dl mZmZmZ d dlmZ d dlmZ ddddddd	d
dddddZi Z	x8e
 D ],\ZZeddddddZee	e< qXW dZG dd deZe ZG dd deZdd Zed ZG dd deZd S )!    )absolute_importdivisionprint_function)matrix)slots_getstate_setstateg(\?grh|?gtV?g-?gPn?gX9v?gn?g r?gK?gV-?gE?)zOP1 PzOP2 PzO5' PzC1' C2'zC1' O4'zC2' O2'zC2' C3'zC3' O3'zC3' C4'zC4' O4'zC4' C5'zC5' O5'OP1O1POP2O2P'*g rh?c               @   s   e Zd Zdd Zdd ZdS )_make_tablesc             C   s
   d | _ d S )N)cache)O r   z/mnt/filia/a/genomebrowser/www/genomebrowser/fleming/tools/molprobity/modules/cctbx_project/iotbx/pdb/rna_dna_detection.py__init__    s    z_make_tables.__init__c             C   sx   | j d krng | _ d}tdd |D }xFdD ]>}t|d }| j ||f | j |tdd |D f q,W | j | S )N)zC5'zC4'zO4'zC1'zC2'zC3'zO3'c             S   s   g | ]}| d dqS )r   r   )replace).0ar   r   r   
<listcomp>'   s    z)_make_tables.__call__.<locals>.<listcomp>))zOP1 PzOP2 P)zO1P PzO2P P)	zO5' PzC1' C2'zC2' C3'zC3' C4'zC3' O3'zC4' C5'zC4' O4'zC1' O4'zC5' O5'c             S   s   g | ]}| d dqS )r   r   )r   )r   br   r   r   r   .   s    )r   tuplesetappend)r   indexZatoms_tZatoms_sZbonds_1Zbonds_tr   r   r   __call__#   s    

"z_make_tables.__call__N)__name__
__module____qualname__r   r   r   r   r   r   r      s   r   c               @   s.   e Zd ZdddddddgZdd	 Zd
d ZdS )atom_name_analysissub_classificationrequired_atomsrequired_bondshave_o2c2_o2c1have_all_required_atomsc             C   s@  d | _ d | _d | _d | _d | _d | _d| _d|kr6d S d|krPd|krJd S d}nd|krjd|krdd S d}nd S d	|krt|d
\| _| _d|k| _d| _d| _n:d|krt|d d
\| _| _d|k| _d| _d| _nd S |dkr| jdkrd| _ n"|dkr| jdkrd| _ nd S x| jD ]}||krd S qW d| _d S )NFPr   r	   r   r   r
      zO5')r   zO2'zC2' O2'zC1'zO5*   zO2*zC2* O2*zC1* v3T)r!   r"   r#   r$   r%   r&   r'   _tables)r   	atom_dictZtab_offsrequired_atomr   r   r   r   >   sL       


 
zatom_name_analysis.__init__c             C   s   | j dkrtS tS )Nr,   )r!   )bond_distance_ideal_by_bond_atom_names_v3)bond_distance_ideal_by_bond_atom_names_v2)r   r   r   r   &bond_distance_ideal_by_bond_atom_namese   s    
z9atom_name_analysis.bond_distance_ideal_by_bond_atom_namesN)r   r   r   	__slots__r   r2   r   r   r   r   r    3   s   'r    c             C   s   t | d}|jsd S d}t }xT|D ]L}|j|jg}|  d|}||jkr\|| q$|j	r$||j
kr$d}q$W t|t|jkrd S |rd|j S d|j S )N)r.   F TRNADNA)r    r'   r   	atom_id_1	atom_id_2sortjoinr#   addr$   r%   lenr!   )r.   	bond_listr   Zrna_indicatorZbonds_matchedbondpairr   r   r   classificationj   s$    



 
r@   zC1' C2' C3' O3' C4' O4' C5' O5'c               @   s0   e Zd Zddddddddd	d
dgZdddZdS )residue_analysisproblemsr.   deoxy_ribo_atom_dictp_atomop_atomsc1p_outbound_candidateso2p_atomh_atomsis_terminus_with_o5pc1p_outbound_atomis_rna      ?c                s^  g | _ |jddddd| _t| jt|kr8| j d g }i | _xBtD ]:}| j|}|d krp|d|  qH|| j|< | j|= qHW d | _xJt	| j
 D ]8}|dr|dkr| j| | _| j|= q| j d qW g | _xndD ]f}x`|D ].}| j|}|d k	r| j| | j|= P qW | jd  | jd k	r| j d|d	   qW | jd
| _| jd k	rp| jd
= i | _xt	| j
 D ]}t|d	kr| j d qd|d	 d	kst|dkrd|d d	krd|d	 d	kr| j| | j|< | j|= qW i | _xt	| j
 D ]t}|dd	krh|dkrX|| j|< | j|= n| j d q&|ds|dr&| j| | j|< | j|= q&W d| _t| j d	krt|d	krt| jdkr| jdd k	rd| _n| j |  fdd}| jd k	rt| jj}x`tddgD ]P\}	}
| j|	 }|d krLq,t|j}||
||s,| j d|	d   q,W | jd}|d k	rt|j}|d||s| j d | jd k	r| jd}|d k	rt|j}t| jj}|d||s| j d xdD ]}
g }xt|
d d  |
d!d  gD ]0}| j|}|d krVP |t|j q:W ||
f| s| j d"|
d#d$  qW d | _t| jd	kr8| jd%}|d k	r8t  }t|j}xZ| j D ]L\}}t|j}t|| }||kr||ks(| jd kr|| _|}qW t| j d	krNd | _ | jd k	| _d S )&NTF)Zstrip_namesZupper_namesZconvert_stars_to_primesZ%throw_runtime_error_if_duplicate_keysZ	key_clashZmissing_r(   Zother_P))r   r   )r	   r
   r   zO2'Z
blank_nameZHDr*   
0123456789r   zN2'Zother_primeNCzO5'c                s(   t || }t|  }||  kr$dS dS )NFT)absr0   )key_pairsite_1site_2distance_modeldistance_ideal)distance_tolerancer   r   check_distance   s
    z1residue_analysis.__init__.<locals>.check_distancezOP1 PzOP2 Pzlong_distance_P_OP%dzO5' Pzlong_distance_P_O5'zC2'zC2' O2'zlong_distance_C2'_O2')zC1' C2'zC1' O4'zC2' C3'zC3' O3'zC3' C4'zC4' O4'zC4' C5'zC5' O5'      Zlong_distance_r4   _zC1')rB   
build_dictr.   r<   r   rC   deoxy_ribo_atom_keysgetrD   listkeys
startswithrE   rG   rH   findrF   rI   extendr   colxyz	enumerater   rJ   c1p_outbound_distance_estimateitemsrP   rK   )r   Zresidue_atomsrV   Zdeoxy_ribo_problemskeyatomr_   rW   rR   irQ   rS   sitesZclosest_distancedistancer   )rV   r   r      s    












 


	
 



zresidue_analysis.__init__N)rL   )r   r   r   r3   r   r   r   r   r   rA      s   rA   N)
__future__r   r   r   scitbxr   libtbxr   r0   r1   rg   rh   valuer   rf   objectr   r-   r    r@   r   splitr\   rA   r   r   r   r   <module>   s8   7