B
    §dÓ  ã               @   s|   d dl mZmZmZ d dlmZ d dlZG dd„ deƒZG dd„ deƒZ	G dd	„ d	eƒZ
G d
d„ deƒZG dd„ deƒZdS )é    )Úabsolute_importÚdivisionÚprint_function)ÚflexNc               @   s   e Zd ZdZdd„ ZdS )Úamplitude_unit_weightingz Mere unit weights for F c             C   s   | j  ¡ st‚d | _d | _d S )N)ÚobservedÚis_xray_amplitude_arrayÚAssertionErrorÚweightsÚderivatives_wrt_f_c)Úself© r   ú{/mnt/filia/a/genomebrowser/www/genomebrowser/fleming/tools/molprobity/modules/cctbx_project/cctbx/xray/weighting_schemes.pyÚcompute	   s    z amplitude_unit_weighting.computeN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r   r   r      s   r   c               @   s"   e Zd ZdZddd„Zdd„ ZdS )	Úintensity_quasi_unit_weightingz© Quasi-unit  weights 1/(4 Fo^2) for F^2.

      The weights are replaced by 1/(4 sigma(Fo^2)^2)
      for weak Fo^2, which are defined as Fo^2 < n_sigma * sigma(Fo^2)
  ç      ð?c             C   s
   || _ d S )N)Ún_sigma)r   r   r   r   r   Ú__init__   s    z'intensity_quasi_unit_weighting.__init__c          	   C   s¼   | j  ¡ st‚| j  ¡ }| j  ¡ }t | ¡ ¡}|d krJt | ¡ d¡}n"| j	dkr^||k}n|| j	| k}| }| 
|d| |¡ ¡ |d k	r¬| 
|dt | |¡¡ ¡ || _d | _d S )NTé   g      Ð?)r   Úis_xray_intensity_arrayr	   ÚdataÚsigmasr   ÚdoubleÚsizeÚboolr   Úset_selectedÚselectÚpow2r
   r   )r   Zf_sqrZ	sig_f_sqrÚwZstrongsZweaksr   r   r   r      s    



z&intensity_quasi_unit_weighting.computeN)r   )r   r   r   r   r   r   r   r   r   r   r      s   
r   c               @   s   e Zd ZdZdd„ ZdS )Úpure_statistical_weightingz 1/sigma^2 weights c             C   s@   | j d k	st‚t | j  ¡ ¡}| d¡s,t‚d| | _d | _d S )Nr   r   )r   r	   r   r!   r   Úall_gtr
   r   )r   Zsigmas_squaredr   r   r   r   0   s
    
z"pure_statistical_weighting.computeN)r   r   r   r   r   r   r   r   r   r#   -   s   r#   c               @   s$   e Zd ZdZd	dd„Zd
dd„ZdS )Úsimple_shelx_weightingz¹ As the WGHT instruction in ShelXL with only a and b terms.
      The implementation is straightforward without any attempt to save
      space or time: mostly a reference for tests.
  çš™™™™™¹?r   c             C   s   ||f| _ d S )N)Ú_params)r   ÚaÚbr   r   r   r   >   s    zsimple_shelx_weighting.__init__Nc             C   s
  || _ | j ¡ st‚| j  ¡ s"t‚| j\}}| j  ¡ }|d krP| jj| j dd}|| _|t 	|¡ }t
 | j ¡ ¡}| j ¡  ¡ }| j ¡ dk }| |d¡ |dt
 |¡  d }	d|t
 ||	 ¡ ||	   }
d| | |	 |  t
 |
¡ d|  }|
| | _| _d S )Ng®Gáz®ï?)Úcutoff_factorr   é   é   r   gUUUUUUõ?)Ú
calculatedr   r   r	   Úis_complex_arrayr'   r   Úscale_factorÚmathÚsqrtr   r!   r   Ú	deep_copyr   Únormr
   r   )r   Úf_calcr/   r(   r)   Úf_cZsigmas_squareZf_obs_square_plusÚ	negativesÚpr"   Zdw_dfcr   r   r   r   A   s$    

(zsimple_shelx_weighting.compute)r&   r   )N)r   r   r   r   r   r   r   r   r   r   r%   8   s   
r%   c               @   sL   e Zd ZdZddd„Zdd	„ Zef eƒ ŽZd
d	„ Zef eƒ ŽZddd„Z	dS )Úshelx_weightingz# As the WGHT instruction in ShelXL çš™™™™™¹?r   çUUUUUUÕ?Nc             C   s<   |dks|d k	st ‚||||||f| _|| _d| _d| _d S )Nr   TF)r	   r'   Ú_wavelengthÚ_obs_part_dirtyÚcomputing_derivatives_wrt_f_c)r   r(   r)   ÚcÚdÚeÚfÚ
wavelengthr   r   r   r   Y   s
    zshelx_weighting.__init__c              C   s   dd„ } dd„ }t ƒ S )Nc             S   s    y| j S  tk
r   d S X d S )N)Ú	_observedÚ	Exception)r   r   r   r   Úfgeta   s      z&shelx_weighting._propdef.<locals>.fgetc             S   s   |  ¡ st‚|| _d| _d S )NT)r   r	   rC   r<   )r   Úobsr   r   r   Úfsetd   s    z&shelx_weighting._propdef.<locals>.fset)Úlocals)rE   rG   r   r   r   Ú_propdef`   s    zshelx_weighting._propdefc              C   s   dd„ } dd„ }t ƒ S )Nc             S   s    y| j S  tk
r   d S X d S )N)Ú_calculatedrD   )r   r   r   r   rE   l   s      z&shelx_weighting._propdef.<locals>.fgetc             S   s   |  ¡ st‚|| _d S )N)r.   r	   rJ   )r   r4   r   r   r   rG   o   s    z&shelx_weighting._propdef.<locals>.fset)rH   )rE   rG   r   r   r   rI   k   s    c             C   sD  || _ | j\}}}}}}| jr |dkr.d }	nF| j ¡  ¡ }
|dkrL|
 ¡ }|
|9 }
t |
¡}|dkrl|}	nd| }	|	| _	| j 
¡ d k	rÚt | j 
¡ ¡| _|dkr°|  j|7  _|dkrà|}||| j 9 }|  j|7  _nd | _| j ¡ dk }| j ¡  ¡ | _| j |d¡ |  j|9  _d| _| j	}	| j  ¡ }t |¡}|d krV| jj| j dd}|| _||9 }|d| 9 }|| j7 }| ¡ }||| 9 }d }| jr¢d| }||7 }| jrº||7 }||9 }| jd k	rØ|| j7 }|	d krìd| }n|	| }| jr4|d k	r|t |¡ }|t |¡ 9 }|d9 }|| }|| _|| _d S )Nr   r   Fg®Gáz®ï?)r*   r+   gUUUUUUõ?)r-   r'   r<   r   Úsin_theta_over_lambda_sqr   r2   r   ÚexpZ_qr   r!   Z_den_obsr;   Z_p_obsr   r3   r/   r=   r0   r1   r
   r   )r   r4   r/   r(   r)   r>   r?   r@   rA   ÚqZexp_argsZk_sqrZexp_valsZe_times_sin_theta_sqr6   r5   r7   ÚdenÚderr"   r   r   r   r   u   sx     




   



zshelx_weighting.compute)r9   r   r   r   r   r:   N)N)
r   r   r   r   r   rI   Úpropertyr   r-   r   r   r   r   r   r8   V   s   
	r8   )Ú
__future__r   r   r   Úcctbx.array_familyr   r0   Úobjectr   r   r#   r%   r8   r   r   r   r   Ú<module>   s   	