B
    dH                 @   s8  d dl mZmZmZ d dlZd dlZd dlZd dlZd dl	Zd dl
m  mZ d dlmZ d dlmZ ed d dlT d dlZd dlZd dlZd dlmZmZ d dlmZ ejrd d	lmZmZ nd d	lmZmZ xhej ! D ]ZZ"e#e"e$sqe%e"d
re&e"ese'e" e%e"d
re%e"dre&e"ese'e" qW dd Z(e(e)_*e+e,G dd dZ-dfddZ.dd Z/dd Z0dd Z1dd Z2dd Z3dd Z4d d! Z5d"d# Z6d$d% Z7d&d' Z8d(d) Z9d*d+ Z:d,d- Z;e+ej<G d.d dZ-d/d0 Z=d1d2 Z>d3d4 Z?d5d6 Z@d7d8 ZAd9d: ZBe9eC_De:eC_Ee;eC_Fe=eC_Ge?eC_He@eC_IeAeC_JeBeC_Kdgd;d<ZLd=d> ZMe+eNG d?d dZ-eNejOjPZQd@dA ZeQjRZReQjSZSeQjTZTeQjUZUeQjVZVeQjWZWeQjXZXeQjYZYeQjZZZeQj[Z[ej\e dBZ]G dCdD dDe^Z_e+ej`G dEd dZ-e+ejCG dFd dZ-e+ejaG dGd dZ-G dHdI dIe^Zbe+ejcG dJd dZ-dhdNdOZdG dPdQ dQe^Zee+ejfG dRd dZ-dSdT ZgG dUdV dVe^ZhdWdX ZidYdZ Zjd[dZ Zkdid\d]Zldjd_d`ZmdkdadbZndcdd Zoeoep_qejrZsejtZuejvZwejxdekr"ejyZzej{Z|ej}Z~ejZejZejZdS )l    )absolute_importdivisionprint_functionN)range)zipscitbx_array_family_flex_ext)*)get_random_seedset_random_seed)format_value)IterableSequence__getitem____len__c             C   s   t |  d S )N   )hashlibmd5__getstate__)self r   w/mnt/filia/a/genomebrowser/www/genomebrowser/fleming/tools/molprobity/modules/cctbx_project/scitbx/array_family/flex.pybool_md5(   s    r   c               @   s   e Zd ZdddZdS )_Nc             C   sZ   |d krt j}td|  |d td|  |d td|  |d td|  |d | S )Nzorigin:)filezlast:zfocus:zall:)sysstdoutprintoriginlastfocusall)r   fr   r   r   show_summary/   s     z_.show_summary)N)__name__
__module____qualname__r"   r   r   r   r   r   ,   s   r   FTc             C   s   |  t| ||dS )N)datareversestable)selectZsort_permutation)r&   r'   r(   r   r   r   sorted7   s    r*   c             C   sF   |   dkst|  st|  r(tdd l}|jt| |  S )N   r   )	ndAssertionError
is_0_based	is_paddedscitbx.matrixmatrixrectupler   )ascitbxr   r   r   as_scitbx_matrix;   s
    r6   c             C   s   t t| jdd d S )NT)one_row_per_line)r   r6   mathematica_form)r4   r   r   r   showB   s    r9   c             c   sd   |   dkst|  st|  r(t|  \}}x*t|D ]}| || |d |  V  q>W d S )Nr+   r   )r,   r-   r.   r/   r   r   )r4   nrncirr   r   r   rowsE   s    r=   c             C   sp   t | }t|| }|t|| x t| D ]\}}||||f< q.W x$t|D ]\}}||||d f< qPW |S )Nr   )lendoublereshapegrid	enumerate)dr!   nr4   ixr   r   r   upper_bidiagonalM   s    rG   c             C   sp   t | }t|| }|t|| x t| D ]\}}||||f< q.W x$t|D ]\}}|||d |f< qPW |S )Nr   )r>   r?   r@   rA   rB   )rC   r!   rD   r4   rE   rF   r   r   r   lower_bidiagonalW   s      rH   c              C   sv   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dddd g }t j|  }t }x|D ]}t||||  qZW d S )!Nr*   r9   r=   to_listmin_defaultmax_defaultmean_defaultr)   condense_as_rangesr	   random_generatorr
   random_size_trandom_doublerandom_boolrandom_permutationrandom_selectionrandom_double_point_on_sphererandom_double_unit_quaternion random_double_r3_rotation_matrix*random_double_r3_rotation_matrix_arvo_1992 random_int_gaussian_distributionmedian	py_objectZlinear_regressionlinear_correlation	histogramweighted_histogramshow_count_statspermutation_generatorsmart_selectioncompare_derivatives)r   modulesglobalssetattr)Ztarget_module_nameZexport_listZtarget_modulegattrr   r   r   	export_to_   sH    

rg   c             C   s,   g }x"t |  D ]}|| |  qW |S )zUWorkaround for C++ exception handling bugs
     (list(array) involves C++ exceptions))r   sizeappend)arrayresultrE   r   r   r   rI      s    rI   c             C   s   |   dkr|S t| S )Nr   )rh   min)valuesdefaultr   r   r   rJ      s     rJ   c             C   s   |   dkr|S t| S )Nr   )rh   max)rm   rn   r   r   r   rK      s     rK   c             C   s   |   dkr|S t| S )Nr   )rh   mean)rm   rn   r   r   r   rL      s     rL   c             C   s   t |t| d ddS )N)rm   rn   )formatvalue)r   rJ   )rm   rq   r   r   r   _format_min   s    rs   c             C   s   t |t| d ddS )N)rm   rn   )rq   rr   )r   rK   )rm   rq   r   r   r   _format_max   s    rt   c             C   s   t |t| d ddS )N)rm   rn   )rq   rr   )r   rL   )rm   rq   r   r   r   _format_mean   s    ru   c               @   s   e Zd Zd	ddZdd ZdS )
r   N %.6gTc                s~   |d krt j}|r&t|d | j|d  fdd}t|d || j|d t|d || j|d t|d || j|d d S )Nzn:)r   c                s   t  | dS )N)rq   rr   )r   )v)rq   r   r   r!      s    z_.show.<locals>.fzmin: zmax: zmean:)r   r   r   rD   rl   ro   rp   )r   outprefixrq   Zshow_nr!   r   )rq   r   r9      s     z_.showc             C   s   | j | j| jfS )N)rl   ro   rp   )r   r   r   r   as_tuple   s    z
_.as_tuple)Nrv   rw   T)r#   r$   r%   r9   r{   r   r   r   r   r      s   

c             C   s
   t | dS )N)rm   )min_max_mean_double)r   r   r   r   _min_max_mean_double_init   s    r}   c             C   s4   |   | }|dkrd S tt| t|  | d S )Nr   g      ?)rh   sumpow2rp   )r&   mdenr   r   r   _standard_deviation_helper   s     r   c             C   s
   t | dS )Nr   )r   )r   r   r   r   !_standard_deviation_of_the_sample   s    r   c             C   s
   t | dS )Nr   )r   )r   r   r   r   _sample_standard_deviation   s    r   c             C   s(   |   }|dkrd S tt| | d S )Nr   g      ?)rh   r~   r   )r&   r   r   r   r   _rms   s     r   c             C   s(   t | d}t| }| |j8 } | | } d S )N)rm   )r|   r   rp   )r   rcZssdr   r   r   _as_z_scores   s    

r   c             C   sl   g }|d k	r6|d kst xN|D ]}|| |  qW n2|d k	sBt x$t| |D ]\}}|rN|| qNW |S )N)r-   ri   r   )sequenceZpermutationflagsrk   rE   sr!   r   r   r   r)      s    
 r)   c                st   t | dkrg S g | d  d fdd}x8| dd  D ](}|  krXd7 q>|  | dq>W |  S )Nr   r   c                  s0   dkr  f n    d f d S )Nr   )ri   r   )i_startrD   rk   r   r   store_range   s    z'condense_as_ranges.<locals>.store_range)r>   )Zinteger_arrayr   rE   r   )r   rD   rk   r   rM      s     
rM   c               @   s   e Zd Zdd ZdS )r   c             C   sB   |dkst |dkst ||ks$t | j|d}|| t|S )Nr   )rh   )r-   rR   resizer*   )r   Zpopulation_sizeZsample_sizeZpermr   r   r   rS      s    
z_.random_selectionN)r#   r$   r%   rS   r   r   r   r   r      s   c             C   s   t j| d tj|  d S )N)rr   )rN   seedr5   randomr
   )rr   r   r   r   r
     s    r
   )r   c               @   s6   e Zd ZdddZdd Zdd Zdd	 Zd
d ZdS )rZ   Nc                s    |g d dkst|| _d k	rDfddt| D | _nH|d k	rpt|| ks`t|d d  | _n fddt| D | _d S )Nr+   c                s   g | ]
}  qS r   r   ).0rE   )value_factoryr   r   
<listcomp>   s    z&py_object.__init__.<locals>.<listcomp>c                s   g | ]} qS r   r   )r   rE   )rr   r   r   r   %  s    )countr-   	_accessorr   Zsize_1d_datar>   )r   accessorrr   rm   r   r   )rr   r   r   __init__  s    zpy_object.__init__c             C   s   | j S )N)r   )r   r   r   r   r   '  s    zpy_object.accessorc             C   s   | j S )N)r   )r   r   r   r   r&   *  s    zpy_object.datac             C   s   | j | | S )N)r   r   )r   indexr   r   r   r   -  s    zpy_object.__getitem__c             C   s   || j | |< d S )N)r   r   )r   r   rr   r   r   r   __setitem__0  s    zpy_object.__setitem__)NNN)r#   r$   r%   r   r   r&   r   r   r   r   r   r   rZ     s
   
rZ   c               @   s   e Zd ZdddZdS )r   Nrv   c             C   sT   |d krt j}t|d |  |d t|d |  |d t|d |  |d d S )Nzis_well_defined:)r   zy_intercept:zslope:)r   r   r   is_well_definedZy_interceptZslope)r   r!   rz   r   r   r   r"   6  s
     z_.show_summary)Nrv   )r#   r$   r%   r"   r   r   r   r   r   3  s   c               @   s   e Zd Zdd Zdd ZdS )r   c             C   s   |   }|  |S )N)	deep_copymatrix_inversion_in_place)r   rk   r   r   r   matrix_inversion?  s    z_.matrix_inversionc             C   s   t | S )N)r6   )r   r   r   r   r6   D  s    z_.as_scitbx_matrixN)r#   r$   r%   r   r6   r   r   r   r   r   <  s   c               @   s   e Zd ZdddZdS )r   Nrv   c             C   sj   |d krt j}t|d |  |d t|d |  |d t|d |  |d t|d |  |d d S )Nzis_well_defined:)r   zmean_x:zmean_y:zcoefficient:)r   r   r   r   Zmean_xZmean_yZcoefficient)r   r!   rz   r   r   r   r"   J  s     z_.show_summary)Nrv   )r#   r$   r%   r"   r   r   r   r   r   G  s   c               @   s   e Zd Zdd Zdd ZdS )histogram_slot_infoc             C   s   || _ || _|| _d S )N)
low_cutoffhigh_cutoffrD   )r   r   r   rD   r   r   r   r   S  s    zhistogram_slot_info.__init__c             C   s   | j | j d S )Nr+   )r   r   )r   r   r   r   centerX  s    zhistogram_slot_info.centerN)r#   r$   r%   r   r   r   r   r   r   r   Q  s   r   c               @   s8   e Zd Zdd Zdd Zdd Zdd
dZdddZdS )r   c             C   s"   |   |  |  |  |  fS )N)data_mindata_max
slot_widthslotsn_out_of_slot_range)r   r   r   r   __getinitargs__^  s
    z_.__getinitargs__c             C   s   ddl m} || S )Nr   )kludge_show_to_str)libtbx.utilsr   )r   r   r   r   r   __str__f  s    z	_.__str__c             c   sP   |   }xBt|  D ]2\}}|   |  |d   }t|||V  |}qW d S )Nr   )r   rB   r   r   r   )r   r   rE   rD   r   r   r   r   
slot_infosj  s
    z_.slot_infosNrv   %.8gc             C   s(   |d krt j}t| j||d|d d S )N)rz   format_cutoffs)r   )r   r   r   as_str)r   r!   rz   r   r   r   r   r9   q  s     z_.showc             C   sP   g }d| d | d }x,|   D ] }||||j|j|jf  q"W d|S )Nz%sz - z: %d
)r   ri   r   r   rD   join)r   rz   r   outputfmtinfor   r   r   r   u  s
     z_.as_str)Nrv   r   )rv   r   )r#   r$   r%   r   r   r   r9   r   r   r   r   r   r   [  s
   

   Nonerv   c             C   sH  |   dkst|d krtj}ddlm}m} t| dd}|d||d | | }|  }	|t|tt	|}
tt	|	}|d|
|f  }|dd|
 | |f  }xt
|D ]z\}}||krq|dkst|dkrt|||||	 f |d	 |dkrt||	| d||	  f |d	 P |d|| }qW t|||	df |d	 d S )
Nr   )intro   T)r'   r   z>= %%%dd:  %%%dd  %%7.5fz   %s:  %%%dd  %%7.5fz%%%ds)r   )rh   r-   r   r   builtinsr   ro   r*   r>   strrB   r   )countsZ
group_sizeZlabel_0ry   rz   r   ro   Zcounts_sortedZ	thresholdrD   wtZwcZfmt_valZfmt_zerorE   r   r   r   r   r^   |  s,      
 r^   c               @   s   e Zd Zdd Zdd ZdS )weighted_histogram_slot_infoc             C   s   || _ || _|| _d S )N)r   r   rD   )r   r   r   rD   r   r   r   r     s    z%weighted_histogram_slot_info.__init__c             C   s   | j | j d S )Nr+   )r   r   )r   r   r   r   r     s    z#weighted_histogram_slot_info.centerN)r#   r$   r%   r   r   r   r   r   r   r     s   r   c               @   s&   e Zd Zdd Zdd Zd
dd	ZdS )r   c             C   s"   |   |  |  |  |  fS )N)r   r   r   r   r   )r   r   r   r   r     s
    z_.__getinitargs__c             c   sP   |   }xBt|  D ]2\}}|   |  |d   }t|||V  |}qW d S )Nr   )r   rB   r   r   r   )r   r   rE   rD   r   r   r   r   r     s
    z_.slot_infosNrv   %.8gc             C   sV   |d krt j}d| d | d }x.|  D ]"}t|||j|j|jf |d q,W d S )Nz%sz - z: %d)r   )r   r   r   r   r   r   rD   )r   r!   rz   r   r   r   r   r   r   r9     s
     z_.show)Nrv   r   )r#   r$   r%   r   r   r9   r   r   r   r   r     s   c             c   s*   t t| }|V  x| r$|V  qW d S )N)size_tr   next_permutation)rh   rk   r   r   r   r_     s    
 r_   c               @   s   e Zd Ze Ze ZdddZdd Z	e
e	Zdd Ze
eZdd	 Ze
eZd
d Ze
eZdd Zdd Zdd Zdd ZdddZdS )r`   Nc             C   s   || _ || _|| _d| _dS )z<Self-consistency of flags, indices, all_size is not checked!N)_flags_indices	_all_size_selected_size)r   r   indicesall_sizer   r   r   r     s    zsmart_selection.__init__c             C   s&   | j d kr | jd k	r | j | _ | j S )N)r   r   rh   )r   r   r   r   _get_all_size  s    

zsmart_selection._get_all_sizec             C   s@   | j d kr:| jd k	r"| j | _ n| jd k	r:| jd| _ | j S )NT)r   r   rh   r   r   )r   r   r   r   _get_selected_size  s    


z"smart_selection._get_selected_sizec             C   s4   | j d kr.| jd k	r.| jd k	r.t| j| j| _ | j S )N)r   r   r   bool)r   r   r   r   
_get_flags  s
    


zsmart_selection._get_flagsc             C   s&   | j d kr | jd k	r | j | _ | j S )N)r   r   Z
iselection)r   r   r   r   _get_indices  s    

zsmart_selection._get_indicesc             C   sD   | j |j krdS | jd k	r(| j|jS | jd k	r@| j|jS dS )NFT)r   r   all_eqr   r   r   )r   otherr   r   r   __eq__  s     

zsmart_selection.__eq__c             C   sn   | j }|d krd d d | jfS |dkr4d | jd| jfS | j}|| j || j k r^| jd || jfS d | j|| jfS )Nr   )r   r   r   selected_sizebool_element_sizesize_t_element_sizer   )r   aszsszr   r   r   r     s    zsmart_selection.__getstate__c             C   s   |\| _ | _| _| _d S )N)r   r   r   r   )r   stater   r   r   __setstate__  s    zsmart_selection.__setstate__c             C   sZ   | j }|d kr,| j}|d kr dS d|  S | j}||krN|dkrFdS d| S d||f S )Nr   z%dr   zNone (empty array)zall (%d)z%d of %d)r   r   rh   r   )r   r   Zidcr   r   r   r   format_summary  s      zsmart_selection.format_summaryrv   selected elements: c             C   s*   |d krt j}t|| |   |d d S )N)r   )r   r   r   r   )r   ry   rz   labelr   r   r   r"     s     zsmart_selection.show_summary)NNN)Nrv   r   )r#   r$   r%   r   Zelement_sizer   r   r   r   r   propertyr   r   r   r   r   r   r   r   r   r   r   r"   r   r   r   r   r`     s    
r`   c             C   sR   |  }ddl m} |dd |D }d| }x |D ]\}}t|||f  q2W d S )Nr   )ro   c             S   s   g | ]\}}t |qS r   )r>   )r   typenamerh   r   r   r   r     s    z __show_sizes.<locals>.<listcomp>z%%%is : %%i)r   ro   r   )r!   Ztypename_n_sizero   lr   r   rh   r   r   r   __show_sizes  s    r   c               C   s   t tS )N)r   Zempty_container_sizes_intr   r   r   r   <lambda>      r   c               C   s   t tS )N)r   Zempty_container_sizes_doubler   r   r   r   r     r   c       	      C   s  ddl m} ddlm} |  }| dks.t| d}| dksFtx|D ]}|dksLtqLW | d}| dksxtt|dkst||}||}t|t|kst|d k	r|||dkst|r|t|	 dst| |	 }t|t|kstd S )	Nr   )approx_equal)cPickle   )r   r   r   ))r   r+      )r+   r      )r   r      r   )	r   r+   r   r+   r   r   r   r   r   )
libtbx.test_utilsr   	six.movesr   rh   r-   r3   dumpsloads	as_double)	Zflex_tripleZ
flex_orderr   r   pickler4   rF   pbr   r   r   exercise_triple  s(    


r   ư>c             C   sb   ddl m} |dtt| }| | j|| |ds^ddlm} || | || |ds^td S )Nr   )ro   r   )r   	tolerance)r   )eps)r   ro   extabsZall_approx_equalr   r   r-   )Zmore_reliableZless_reliabler   ro   Zscaler   r   r   r   ra   3  s    ra   c                s   |dkrt | S |  dkr4|dks*tt | S t|   |t k sPtt|  }|| | t	|d} fddt
t D }x2t
 | D ]"}t||d ||< || | 7 }qW |S dS )zz Support for numpy-style summation along an axis.
      If axis=None then summation is performed over the entire array.
  Nr   r   c                s   g | ]}t d  | qS )r   )slice)r   rE   )old_dimr   r   r   K  s    zsum.<locals>.<listcomp>)r   r~   r,   r-   listr    r>   pop	__class__rA   r   r   )
flex_arrayaxisZnew_dimZflex_array_sumZslicesrE   r   )r   r   r~   <  s    


r~   c             C   s(   t | tt r$|   ddS dS )zQ
  A short extension method for converting vec3_double arrays to numpy arrays.
  r   N)
isinstancetypevec3_doubler   as_numpy_arrayr@   )r   r   r   r   _vec3_double_as_numpy_arrayQ  s    r   win32)FT)NN)r   r   Nrv   )NF)r   )N)
__future__r   r   r   r   sixr   Zboost_adaptbx.boost.optionalZboost_adaptbxZboost_adaptbx.boost.std_pairboost_adaptbx.boost.pythonboostpythonbpr   r   r   
import_extr   r   Zscitbx.stl.mapr5   Zscitbx.randomr	   r
   libtbx.str_utilsr   PY3collections.abcr   r   collections__dict__rm   entryr   r   hasattr
issubclassregisterr   r   r   inject_intorA   r   r*   r6   r9   r=   rG   rH   rg   rI   rJ   rK   rL   rs   rt   ru   r|   r}   r   r   r   r   r   r?   Z
format_minZ
format_maxZformat_meanmin_max_meanZ standard_deviation_of_the_sampleZsample_standard_deviationZrmsZas_z_scoresr)   rM   Zmersenne_twisterr   Zmt19937rN   rO   rP   rQ   rR   rS   rT   rU   rV   rW   rX   Zmedian_functorrY   objectrZ   Zlinear_regression_corer[   r   r\   r^   r   r]   r_   r`   r   Zshow_sizes_intZshow_sizes_doubler   ra   r~   r   r   r   r   Zint32Zint_from_byte_strZint32_from_byte_strZ	int_rangeZint32_rangeplatformlongZint64Zlong_from_byte_strZint64_from_byte_strZ
long_rangeZint64_ranger   Zuint64Zsize_t_from_byte_strZuint64_from_byte_strZsize_t_rangeZuint64_ranger   r   r   r   <module>   s   

 



'
	

#   

S

	
