B
    dJ%                 @   s   d dl mZmZ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mZ d dlm  mZ d dlmZ d dlZG d	d
 d
ejZeejG dd dZG dd dZdS )    )absolute_importdivisionprint_function)extN)eltbx)adptbx)flex)show_string)	cStringIOc               @   s   e Zd ZdddZdS )		scatterer r   r   r   N   r   c	       	   
   C   sj   |d ks|d kst |d k	r(t|}n|d kr4d}|d krLtjj|dd}tj| ||||||| d S )Nr   F)labelexact)	AssertionErrorr   b_as_ur   xray_scatteringget_standard_labelr   r   __init__)	selfr   siteu	occupancyscattering_typefpfdpb r   s/mnt/filia/a/genomebrowser/www/genomebrowser/fleming/tools/molprobity/modules/cctbx_project/cctbx/xray/scatterer.pyr      s      
zscatterer.__init__)r   r   Nr   Nr   r   N)__name__
__module____qualname__r   r   r   r   r   r      s          r   c               @   sF   e Zd ZdddZdddZdddZd	d
 ZdddZdddZdS )_Nc             C   s.  |d ks|d kst |d k	r&t|}~|d k	rz|
d kr@|d ksDt |	d krf| j | j A szt n|	 |	 A szt tj| d}|d k	r||_|d k	r||_	|	d k	r|	|_|d k	r|j r||_
n||_|
d k	r|
|_
|d k	r||_|d k	r||_|d k	r
||_|d k	r||_|d k	r*||_|S )N)other)r   r   r   flags	use_u_isouse_u_anisor   r   r   r   u_isou_starr   r   r   r   )r   r   r   r   r   r   r   r   r   r%   r(   r)   resultr   r   r   customized_copy"   sB     
   
   
 
 
 z_.customized_copyFc             C   s   t jj| j|dS )N)r   r   )r   r   get_element_and_charge_symbolsr   )r   r   r   r   r   element_and_charge_symbolsH   s    z_.element_and_charge_symbolsc             C   s$   | j |d\}}t|dkr d S |S )N)r   r   )r-   len)r   r   ecr   r   r   element_symbolL   s     z_.element_symbolc             C   s  ddl }| jdd\}}tj| }|dkr4nZ|dkrH|d8 }nF|dkr\|d	8 }n2|d
krp|d	7 }n|dkr|d7 }n
|dkr|d8 }n|dkr|d8 }n|dkr|d8 }n|dkr|d8 }n|dkr|d8 }n|dkr|d8 }n|dkr|d8 }n|dkr|d7 }nv|dkr,|d7 }nb|dkr@|d7 }nN|dkrT|d7 }n:|dkrh|d7 }n&|dkr||d7 }n|d kr|d7 }|S )!zThis method returns the number of electrons a scatterer effectively has.

    :returns: number of electrons (= Z - charge)
    :rtype: int
    r   NT)r   r   z1+r   z2+   z2-z1-z3+   z4+   z5+   z6+   z7+   z8+   z9+	   z3-z4-z5-z6-z7-z8-z9-)Zcctbx.eltbx.tiny_pser-   r   Ztiny_psetableZatomic_number)r   cctbxsymbolchargeZ	electronsr   r   r   electron_countQ   sT    




















z_.electron_countr   c             C   s*  g }| d|t| jf  tjj| jdd| jkrL| d|t| jf  | d|f| j   | j	 r| d|| j
f  | j r| d|f| jdd	  |f | jd	d    | jd
kr| d|| jf  | jdks| jdkr| d|| jf  | d|| jf  d|d|f S )z The returned string does usually eval to self, except if the both of
    self.flags.use_u_iso() and self.flags.use_u_aniso() are True.
    z%s  label=%sF)r   r   z%s  scattering_type=%sz%s  site=(%.6f, %.6f, %.6f)z
%s  u=%.6fz1%s  u=(%.6f, %.6f, %.6f,
%s     %.6f, %.6f, %.6f)Nr3   r   z%s  occupancy=%.6fr   z%s  fp=%.6fz%s  fdp=%.6fzxray.scatterer(%s
%s)z,
)appendr	   r   r   r   r   r   r   r%   r&   r(   r'   r)   r   r   r   join)r   indentcommentrr   r   r   
as_py_code   s&    


,
z_.as_py_codec             C   s@  |d krt j}td| j d|d td| j d|d td|   d|d td| j d|d td| j d|d | j	 rtd| j
 d|d ntd	d|d | j r|d k	stt|| j}tdt| |d
 tdd| d|d ntd	d|d | jdks| jdkr2td| j| jf d|d t|d
 d S )Nz%-4s )endfilez%3dz(%7.4f %7.4f %7.4f)z%4.2fr   z %6.4fz [ - ])rG   z     u_cart =z#%6.3f %6.3f %6.3f %6.3f %6.3f %6.3fr   z
     fp,fdp = %6.4f,%6.4f)sysstdoutprintr   r   multiplicityr   r   r%   r&   r(   r'   r   r   u_star_as_u_cartr)   u_cart_as_u_isor   r   )r   f	unit_cellu_cartr   r   r   show   s*     

z_.show)NNNNNNNNNNN)F)F)r   r   )NN)	r    r!   r"   r+   r-   r1   r>   rD   rQ   r   r   r   r   r#      s              


2
r#   c               @   sB   e Zd ZdddZdd Zddd	Zd
d ZdddZdd ZdS )anomalous_scatterer_groupNFc             C   s^   || _ || _|| _d| _d| _|| _x.|D ]&}|dks:t|dkrJd| _q*d| _q*W || _d S )NF)f_primef_double_primerS   T)
iselectionrS   rT   refine_f_primerefine_f_double_primeupdate_from_selectionr   selection_string)r   rU   rS   rT   refinerY   rX   Zrefine_itemr   r   r   r      s    

z"anomalous_scatterer_group.__init__c             C   s(   g }| j r|d | jr$|d |S )NrS   rT   )rV   r?   rW   )r   r*   r   r   r   labels_refine   s     
 
z'anomalous_scatterer_group.labels_refiner   c             C   s   |d krt j}t|d |d | jd k	r@t|d t| j|d t|d | j |d t|d| j  |d t|d| j  |d | 	 }t|d d|d	 t
|d
krtd|d ntd||d d S )NzAnomalous scatterer group:)rG   z  Selection:z   Number of selected scatterers:z  f_prime:        %.6gz  f_double_prime: %.6gz	  refine:rE   )rF   rG   r   None)rH   rI   rJ   rY   r	   rU   sizerS   rT   r[   r.   r@   )r   outprefixr[   r   r   r   show_summary   s     
 z&anomalous_scatterer_group.show_summaryc             C   s,   x&| j D ]}| j|| _| j|| _qW d S )N)rU   rS   r   rT   r   )r   
scatterersi_seqr   r   r   copy_to_scatterers_in_place   s    z5anomalous_scatterer_group.copy_to_scatterers_in_place-C6?c             C   s*  t  }t  }|| j  ||  x| jD ]}||| j ||| j x|df|dfgD ]\}}t |}|j	|j
 |krt| ||j qld| g}	| jd k	r|	dt| j  |	d|j  t }
|j|
d| dd |	|
   |	d	|  td
|	qlW q6W d S )NrS   rT   z:Anomalous scatterer group with significantly different %s:z  Selection: %sz#  Number of selected scatterers: %dz  %s F)r^   r_   show_nz  tolerance: %.6g
)r   doublereserverU   r]   r?   r   r   min_max_mean_doublemaxminsetattrmeanrY   r	   nStringIOrQ   extendgetvalue
splitlinesRuntimeErrorr@   )r   ra   	toleranceZfpsZfdpsrb   valuesr   Zstatsmsgsr   r   r    extract_from_scatterers_in_place   s*    

z:anomalous_scatterer_group.extract_from_scatterers_in_placec             C   st   t |tjstt| | j}|| }g }| jrD|d | j	rT|d t
|| j| j| j|| jd}|S )NrS   rT   )rU   rS   rT   rY   rZ   rX   )
isinstancer   boolr   r]   rU   selectrV   r?   rW   rR   rS   rT   rY   rX   )r   Z
bselectionZnew_iselectionZ
new_refiner*   r   r   r   r{      s     


z anomalous_scatterer_group.select)NF)Nr   )rd   )	r    r!   r"   r   r[   r`   rc   rx   r{   r   r   r   r   rR      s    


rR   )
__future__r   r   r   
cctbx.xrayr   cctbx.eltbx.xray_scatteringr;   r   r   cctbx.array_familyr   libtbx.str_utilsr	   boost_adaptbx.boost.pythonboostpythonbp	six.movesr
   ro   rH   r   inject_intor#   rR   r   r   r   r   <module>   s    