B
    §d…2  ã               @   sº   d dl mZmZmZ d dlmZ d dlmZmZ d dl	m
Z
 d dlZd dlZd dlmZ dZdd	d
„Zdd„ Zdd„ Zdd„ Zdd„ Zddd„Zd dd„Zdd„ Zd!dd„Zd"dd„ZdS )#é    )Úabsolute_importÚdivisionÚprint_function)Úiceil)Únull_outÚSorry)ÚcountN)Úrangeaý      fraction = 0.1
      .type=float
      .short_caption = Fraction of reflections in test set
      .expert_level=0
    max_free = 2000
      .type=int
      .short_caption = Maximum number of reflections in test set
      .expert_level=2
    lattice_symmetry_max_delta = 5
      .type=float
      .expert_level=2
    use_lattice_symmetry = True
      .type=bool
      .short_caption = Use lattice symmetry to generate test set
      .expert_level=0
    use_dataman_shells = False
      .type = bool
      .short_caption = Assign test set in thin resolution shells
      .help = Used to avoid biasing of the test set by certain types of         non-crystallographic symmetry.
    n_shells = 20
      .type = int
      .short_caption = Number of resolution shells
Úcnsc             C   s0  |dkr|dk st ‚ddlm} ddlm} d| }|dks@t ‚|dksP|dkrè| | d	¡}d}x`tdƒD ]T}t| ||| ƒƒ}	||	krŠP |	d | krž|	d7 }	|	| dkrºd
|t 	||	¡< |	}qjW |dkræ| 
| d¡}
|
 |d¡ |
}nD|dkr,| 
¡ }||ƒd }x$t| ƒD ]}| t d|¡¡ qW |S )Nr   g      à?)Úflex)Úiroundé   é   r
   ÚshelxFTéÿÿÿÿÚccp4)ÚAssertionErrorÚscitbx.array_familyr   Úlibtbx.math_utilsr   Úboolr   ÚminÚrandomÚ	randrangeÚintÚset_selectedr	   ÚappendÚrandint)Ún_reflÚfraction_freeÚformatr   r   Ú
group_sizeÚresultÚi_startÚi_groupÚi_endZresult_Zflag_maxÚi© r&   úq/mnt/filia/a/genomebrowser/www/genomebrowser/fleming/tools/molprobity/modules/cctbx_project/cctbx/r_free_utils.pyÚassign_random_r_free_flags#   s6    
r(   c             C   sú   |dkr|dk st ‚|dkr$|| k s(t ‚ddlm} ddlm} || | ƒ}|| | ƒ}|| | | d ƒ}|d|  }| ¡ }	|	 | ¡ x^t|ƒD ]R}
|	 t	| |	 
¡ | ƒd¡ |	 t	| |	 
¡ | ƒd¡ |	 t	| |	 
¡ | ƒd¡ q”W |	 | d¡ |	S )	Nr   g      à?r   )r   )r   r   FT)r   r   r   r   r   r   Úreserver	   Úresizer   Úsize)r   r   Ún_binsr   r   Ún_freeÚ	n_per_binZhalf_n_work_per_binZn_free_per_binÚflagsÚi_binr&   r&   r'   Úassign_r_free_flags_by_shellsA   s     
r1   c             C   sÚ   |dkst |tƒst‚ddlm} t | |jƒr4d}nt | |jƒsDt‚t| ƒ}t|ƒdkr\| S | |  ¡ ¡}|  	|¡}|dkrŽt
|  ¡ | ƒ}nd}xBt|  ¡ ƒD ]2}| | |krºd||< q t
t ¡ |d  ƒ||< q W |S )NTr   )r   r   r   )Ú
isinstancer   r   r   r   r   ÚsetÚlenr+   r   r   r	   r   )r/   Útest_flag_valuer   Zunique_valuesÚ	new_flagsr-   r,   r%   r&   r&   r'   Úexport_r_free_flags_for_ccp4S   s$    

r7   c             C   s‚   |dkst |tƒst‚ddlm} t | |jƒr4d}nt | |jƒsDt‚| |  ¡ d¡}x(t|  ¡ ƒD ]}| | |krbd||< qbW |S )NTr   )r   r   r   )r2   r   r   r   r   r   r+   r	   )r/   r5   r   r6   r%   r&   r&   r'   Úexport_r_free_flags_for_shelxj   s    r8   c             C   s2   ddl m} t|  ¡ |jƒs t‚| |  ¡ ¡dkS )Nr   )r   é   )r   r   r2   Údatar   r   Úmax)r/   r   r&   r&   r'   Úlooks_like_ccp4_flagsw   s    r<   c             C   s$  ddl m} t|  ¡ |jƒs t‚|dkr0|dk s4t‚|dkrBtj}|  ¡  ¡ }|  ¡  	d¡}|dksht‚|| }t
d| |d t
d| |d d}||kr¤| }n0||krV|| }t
d	| |d |  |  ¡  ¡}	|  |  ¡ ¡}
|dkrô|d
k søt‚|dkrd}|dkr8|
jd
| ddd}|j| ¡  d}n|
j|ddd}|	j|d}n~|| d|  }t
d| |d |dks„t‚|  |  ¡  ¡}	|  |  ¡ ¡}
|	 ¡  ¡ dks¸t‚|	j|ddd}|j|
d}| ¡  ¡ |  ¡  ¡ ksòt‚t
d||f |d t
d| ¡  	d¡ |d |S )zV
  Expand or shrink an existing set of R-free flags to match the target
  fraction.
  r   )r   r   NTz  current fraction free: %g)Úfilez                 target: %gz*  shrinking old test set by a factor of %gg      ð?g      à?gÕxé&1à?)ÚfractionÚmax_freeÚuse_lattice_symmetry)r:   )Úotherz,  flagging %g of current work set for R-freez#    old flags: %d free (out of %d) z    new flags: %d free)r   r   r2   r:   r   r   ÚsysÚstdoutr+   r   ÚprintÚselectÚgenerate_r_free_flagsÚcustomized_copyÚcomplete_withÚindices)Úmiller_arrayr>   Úlogr   r   r-   Zcurrent_fractionr6   Zsub_fractionZwork_setZfree_setZfree_set_newZfraction_newZ	flags_newr&   r&   r'   Úadjust_fraction|   sb     


rL   Fc
             C   s|  ddl m}
 |	d krtƒ }	|d k	s&t‚t| |ƒ ¡ }t||
jƒsDt‚| ¡ dkrhd| }t	||	d | S | 
d¡| ¡  }t	d||f |	d |dkrÂ|r²d| }t	||	d | S td||f ƒ‚|d k	rÖ| | ¡}n<|  ¡ \}}|d krî|}|d krú|}| j||d	 |  ¡ ¡}| ¡  ¡ }t	d
||f |	d | }|dkrx|dkr`|j|
 |d¡d}n0|d k	r€|| |||ds€| S |j|d dd}|rlt| ƒrÒt	d|	d t| ¡ dd}| j|j|dd}n˜d }|dkræd}n|dkrôd}|d kr
td| ƒ‚|
 ¡ }| ¡ }x:t| ¡  ¡ ƒD ]&}|| rF| |¡ n
| |¡ q,W | j|j|dd}n| j|d}|S )Nr   )r   z-WARNING: array of R-free flags (%s) is empty.)r=   Tz%s: fraction_free=%.3fzrWARNING: R-free flags in %s do not appear to contain a valid test, so they can't be extended to higher resolution.znCan't extend R-free flags in %s to higher resolution because no valid test set with flag value '%s' was found.)Úd_minÚd_maxz%s: missing %d reflectionsé   F)r:   )rJ   r5   Ú	n_missingZcolumn_label)r>   r?   r@   z*Exporting missing flags to CCP4 convention)r/   r5   )rA   )r   r   r   zšPHENIX doesn't know how to deal with the R-free flag convention in %s; you will need to disable either extending the flags or preserving the input values.)r   r   r   r   Úget_r_free_as_boolr:   r2   r   r+   rD   r   r   Úlone_setÚ	d_max_minÚcomplete_setÚ
map_to_asurI   ÚarrayrF   r<   r7   ÚconcatenaterG   r   r	   r   )Úr_free_flagsr5   Zarray_labelrT   Zaccumulation_callbackZpreserve_input_valuesZallow_uniform_flagsrN   rM   rK   r   Zr_free_as_boolÚmsgr   Zmissing_setZ	tmp_d_maxZ	tmp_d_minrP   Zoutput_arrayZmissing_flagsZexported_flagsZwork_flag_valuer6   Úi_seqr&   r&   r'   Úextend_flags¾   s     
  








r[   c             C   sÂ   ddl m} t| |ƒ}| ¡  d¡}|jdd ¡ }| |j 	¡ |j
¡}| ¡ sTt‚| ¡ }|j 	¡ | }d}	d}
d}| | ||j
 d¡¡}	x&|jD ]}||d kr®|
d7 }
|}q–W |
||	|fS )Nr   )r   TÚ
resolution)Úby_valuer   r   )r   r   rQ   r:   r   ÚsortÚr_free_flags_accumulationÚlinear_regressionÚreflection_countsÚ	as_doubleÚfree_fractionsÚis_well_definedr   ÚslopeÚsumÚpow)rJ   r5   r   rV   r-   ZaccuZlrre   Zy_idealZsser,   Z
n_ref_lastÚxr&   r&   r'   Úget_r_free_stats  s$    
ri   c             C   s`   |   ¡ r| S ddlm} t|tƒs&t‚|  ¡ s2t‚|  ¡ |k}t||jƒsNt‚| j	|d dS d S )Nr   )r   )r:   Úsigmas)
Úis_bool_arrayr   r   r2   r   r   Úis_integer_arrayr:   r   rG   )rJ   r5   r   Únew_datar&   r&   r'   rQ   1  s    rQ   c             C   sš   |dkrt ƒ }|  ¡ s| S |  ¡ s&t‚|  ¡ } |  ¡ }|  ¡ } | jdd}|jdkrft	d|j |d | 
¡  ¡ j|d}t| ¡ ƒt| ¡ ƒks–t‚|S )z¾
  Given a set of R-free flags generated for anomalous data, detect any
  mismatches between Friedel/Bijvoet mates, and move reflections to the
  free set as needed to ensure consistency.
  NT)Úincompatible_flags_replacementr   z"  %d reflections moved to test set)r=   )rA   )r   Úanomalous_flagrk   r   rU   Ú	deep_copyÚas_non_anomalous_arrayÚmerge_equivalentsÚn_incompatible_flagsrD   rV   Úgenerate_bijvoet_matesÚ
common_setr4   rI   )rV   ÚverboserK   Z
orig_arrayÚmerger6   r&   r&   r'   Úremediate_mismatches<  s      
rx   )r
   )N)NNFFNNN)r   )FN)Ú
__future__r   r   r   r   r   Úlibtbx.utilsr   r   Ú	itertoolsr   r   rB   Ú	six.movesr	   Úgenerate_r_free_params_strr(   r1   r7   r8   r<   rL   r[   ri   rQ   rx   r&   r&   r&   r'   Ú<module>   s.   

F      
U
