B
    §d¥  ã               @   sl  d dl mZmZmZ d dlmZmZmZ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mZ d dlZd dlmZ d d	lmZ d dlZd dlZd d
lmZ G dd„ deƒZdd„ 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d„ Z$dd„ Z%dd„ Z&d-dd „Z'd.d!d"„Z(d#d$„ Z)d%d&„ Z*d'd(„ Z+d)d*„ Z,d+d,„ Z-dS )/é    )Úabsolute_importÚdivisionÚprint_function)ÚadptbxÚcrystalÚmillerÚsgtbxÚuctbxÚxray)ÚflexN)Úmodel)ÚSorry)ÚOrderedDictÚ
OrderedSet)Ústring_types)Úrange)Úzipc               @   s   e Zd ZejZdS )ÚCifBuilderErrorN)Ú__name__Ú
__module__Ú__qualname__Ú	Exception© r   r   úq/mnt/filia/a/genomebrowser/www/genomebrowser/fleming/tools/molprobity/modules/cctbx_project/iotbx/cif/builders.pyr      s   r   c             C   s   t  | tdd¡ d S )NÚCifBuilderWarningÚ )ÚwarningsÚshowwarningÚUserWarning)Úmessager   r   r   r      s    r   c               @   sF   e Zd Zddd„Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Zdd„ Z	dS )Úcif_model_builderNc             C   s*   || _ | j d krt ¡ | _ d | _d | _d S )N)Ú_modelr   ÚcifÚ_current_blockÚ_current_save)ÚselfÚ
cif_objectr   r   r   Ú__init__   s
    

zcif_model_builder.__init__c             C   sB   t  ¡ | _| ¡ dkr|}n|| d¡d d … }| j| j|< d S )NZglobal_Ú_é   )r   Úblockr#   ÚlowerÚfindr!   )r%   Zdata_block_headingZ
block_namer   r   r   Úadd_data_block    s
    
z cif_model_builder.add_data_blockc             C   s–   | j d k	r| j }n| j}t ¡ }t|ƒt|ƒks4t‚t|ƒ}x t|ƒD ]}|| ||| < qFW | ¡ |j 	¡ kr|| 
|¡ ntdd | 	¡ ¡ ƒ‚d S )Nz(Loop containing tags %s appears repeatedz, )r$   r#   r   ÚloopÚlenÚAssertionErrorr   ÚnameÚloopsÚkeysÚadd_loopr   Újoin)r%   ÚheaderÚcolumnsr*   r.   Ú	n_columnsÚir   r   r   r4   (   s    
zcif_model_builder.add_loopc             C   s`   | j d k	r.|| j kr || j |< q\td| ƒ‚n.| jd k	r\|| jkrN|| j|< q\td| ƒ‚n d S )Nz%Data item %s received multiple values)r$   r   r#   )r%   ÚkeyÚvaluer   r   r   Úadd_data_item7   s    



zcif_model_builder.add_data_itemc             C   s>   | j d kst‚t ¡ | _ || d¡d d … }| j | j|< d S )Nr(   r)   )r$   r0   r   Úsaver,   r#   )r%   Zsave_frame_headingZ	save_namer   r   r   Ústart_save_frameE   s    
z"cif_model_builder.start_save_framec             C   s
   d | _ d S )N)r$   )r%   r   r   r   Úend_save_frameK   s    z cif_model_builder.end_save_framec             C   s   | j S )N)r!   )r%   r   r   r   r   N   s    zcif_model_builder.model)N)
r   r   r   r'   r-   r4   r<   r>   r?   r   r   r   r   r   r       s   
r    c               @   s:   e Zd Zddddddddd	d
ddddddœZddd„ZdS )Úbuilder_base)Z_symmetry_equiv_pos_as_xyzz _space_group_symop.operation_xyzz_symmetry_equiv.pos_as_xyz)Z_symmetry_equiv_pos_site_idz_space_group_symop.idz_symmetry_equiv.id)Z_symmetry_space_group_name_Hallz_space_group.name_Hallz_symmetry.space_group_name_Hall)z_symmetry_space_group_name_H-Mz_space_group.name_H-M_altz_symmetry.space_group_name_H-M)Z_symmetry_Int_Tables_numberz1_symmetry.Int_Tables_number_space_group.IT_number)z_cell.length_a)z_cell.length_b)z_cell.length_c)z_cell.angle_alpha)z_cell.angle_beta)z_cell.angle_gamma)z_cell.volume)z_refln.index_h)z_refln.index_k)z_refln.index_l)Ú _space_group_symop_operation_xyzÚ_space_group_symop_idÚ_space_group_name_Hallz_space_group_name_H-M_altÚ_space_group_IT_numberZ_cell_length_aZ_cell_length_bZ_cell_length_cZ_cell_angle_alphaZ_cell_angle_betaZ_cell_angle_gammaZ_cell_volumeÚ_refln_index_hZ_refln_index_kZ_refln_index_lNc             C   sL   | j  |¡}|d k	r|S x.| j |g ¡D ]}| j  |¡}|d k	r(|S q(W |S )N)Ú	cif_blockÚgetÚ__equivalents__)r%   r:   Údefaultr;   Zequivr   r   r   Úget_cif_itemp   s      zbuilder_base.get_cif_item)N)r   r   r   rH   rJ   r   r   r   r   r@   R   s    r@   c               @   s   e Zd Zddd„ZdS )Úcrystal_symmetry_builderFc                sF  |ˆ _ ˆ  d¡}ˆ  d¡}d }|d k	rpt|tƒr>t |g¡}|d k	rpt|tƒr\t |g¡}t|ƒt|ƒkspt‚i ˆ _t	 
¡ }t|tƒrŽ|g}xÞt|ƒD ]Ò\}}yt	 |¡}W nL tk
rú }	 z.t|	ƒ}
d|
krètd|
 d¡d  ƒ‚n‚ W d d }	~	X Y nX |d kr|d }nFyt|| ƒ}W n4 tk
rT }	 ztdt|	ƒ ƒ‚W d d }	~	X Y nX |ˆ j|< | |¡ q˜W nðˆ  d¡}ˆ  d	¡}ˆ  d
¡}|d krÈ|dkrÈyt	 
|¡}W n tk
rÆ   Y nX |d kr|dkryt	j|d ¡ }W n tk
r   Y nX |d k	rH|dkrHyt	j|d ¡ }W n tk
rF   Y nX |d kr`|r`tdƒ‚‡ fdd„dD ƒ}x4t|ƒD ](\}}t|tjƒr|tdd|  ƒ‚q|W xNdD ]F}ˆ  d| ¡}t|tjƒrÚtd| ƒ‚|dkrèd}| |¡ q®W | d ¡}|dkr |rtdƒ‚d }n¶|dkr¬ydd„ |D ƒ}W n tk
rZ   tdƒ‚Y nX yt |¡}W n> tk
r¨ }	 zdt|	ƒkr–t|	ƒ‚n‚ W d d }	~	X Y nX n*|d k	rÎt dd„ |D ƒ|¡}ntdƒ‚|d k	r2|d k	r2| |¡s2|}| ¡  ¡  ¡ }| |¡s2td d!| ¡   d"|  ƒ‚tj ||d#ˆ _!d S )$NrA   rB   zParse error: z(Error interpreting symmetry operator: %séÿÿÿÿr)   z+Error interpreting symmetry operator id: %srC   z_space_group_name_H-M_altrD   )Nú?)Úsymbol)Únumberz>No symmetry instructions could be extracted from the cif blockc                s   g | ]}ˆ   d | ¡‘qS )Z_cell_length_)rJ   )Ú.0Ús)r%   r   r   ú
<listcomp>°   s    z5crystal_symmetry_builder.__init__.<locals>.<listcomp>Úabcz=Data item _cell_length_%s cannot be declared in a looped list)ÚalphaÚbetaÚgammaZ_cell_angle_z<Data item _cell_angle_%s cannot be declared in a looped listrM   Z90é   z.Unit cell parameters not found in the cif filer   c             S   s   g | ]}t |ƒ‘qS r   )Úfloat_from_string)rP   rQ   r   r   r   rR   Æ   s    z&Invalid unit cell parameters are givenzcctbx Error: Unit cellc             S   s   g | ]}|d k	rt |ƒ‘qS )N)rX   )rP   rQ   r   r   r   rR   Ò   s    z6Not all unit cell parameters are given in the cif filez7Space group is incompatible with unit cell parameters:
z  Space group: %s
z  Unit cell: %s)Ú	unit_cellÚspace_group)"rF   rJ   Ú
isinstancer   r   Ú
std_stringr/   r0   Úsym_opsr   rZ   Ú	enumerateÚrt_mxÚRuntimeErrorÚstrr   ÚsplitÚintÚ
ValueErrorÚ
expand_smxr   Úspace_group_infoÚgroupÚappendÚcountr	   rY   Úinfer_unit_cell_from_symmetryÚis_compatible_unit_cellÚinfoÚprimitive_settingr   ÚsymmetryÚcrystal_symmetry)r%   rF   Ústrictr]   Z
sym_op_idsrZ   r9   ÚoprQ   ÚeZstr_eZ	sym_op_idÚhall_symbolZ	hm_symbolÚ	sg_numberÚitemsÚitemÚicrY   ÚvalsZspace_group_inputr   )r%   r   r'   {   sÈ    





 





      







z!crystal_symmetry_builder.__init__N)F)r   r   r   r'   r   r   r   r   rK   y   s   rK   c               @   s   e Zd Zdd„ ZdS )Úcrystal_structure_builderc          
      sè  t j| ˆ dd dd„ ‡ fdd„dD ƒD ƒ}| d ¡dkrˆdd„ ‡ fd	d„dD ƒD ƒ}| d ¡d
krltdƒ‚tj|Ž }| j ¡  |¡}n | d ¡d
kržtdƒ‚tj|Ž }ˆ  	d¡}ˆ  	d¡}|rÔt 
dd„ |D ƒ¡}tˆ  	dˆ  	d¡¡ƒ}|d kr
tˆ  	dˆ  	d¡¡ƒ}ˆ  	d¡}tˆ  	d¡ƒ}	t ¡ }
tˆ  	d¡ƒ}|d k	rL|}‡ fdd„dD ƒ}d}| d ¡d
kr‚‡ fdd„dD ƒ}d}| d ¡dkr˜d }n´| d ¡d
kr²tdƒ nšd ‰x.|D ]&}|dk}ˆd krØ|‰nˆ|M ‰q¼W ˆ ‰| ˆ¡}y‡fdd„|D ƒ}W n4 tk
r@ } ztdt|ƒ ƒ‚W d d }~X Y nX tj|Ž }x2tt|ƒƒD ] }i }|d k	r„| d t|| ƒ¡ |d k	r¢| d!t|| ƒ¡ |d k	r|d k	r|d k	r|| |kr|t ||| ¡ }|ròt |¡}| d"t | j ¡ |¡¡ n>|d k	r.| d"t|| ƒ¡ n|d k	rL| d#t|| ƒ¡ |	d k	rj| d$t|	| ƒ¡ |
 tjf |Ž¡ q\W |
 |¡ |  d%¡}t|tƒs´|d k	r´|d
 }|rÌ|dkrÌt|ƒnd }tj | j|
|d&| _ d S )'NT)rp   c             S   s    g | ]\}}t |d | d‘qS )z_atom_site_fract_%s)Úcolumn_name)Ú'as_double_or_none_if_all_question_marks)rP   r(   Úaxisr   r   r   rR   é   s   z6crystal_structure_builder.__init__.<locals>.<listcomp>c                s   g | ]}ˆ   d | ¡|f‘qS )z_atom_site_fract_%s)rG   )rP   r|   )rF   r   r   rR   ë   s   )ÚxÚyÚzé   c             S   s   g | ]}t |d t d‘qS )z_atom_site_Cartn_%s)rz   )r{   r|   )rP   r(   r   r   r   rR   î   s   c                s   g | ]}ˆ   d | ¡‘qS )z_atom_site_Cartn_%s)rG   )rP   r|   )rF   r   r   rR   ð   s   r   z$No atomic coordinates could be foundZ_atom_site_labelZ_atom_site_type_symbolc             s   s"   | ]}|  d d¡  dd¡V  qdS )z0+r   z0-N)Úreplace)rP   rQ   r   r   r   ú	<genexpr>   s    z5crystal_structure_builder.__init__.<locals>.<genexpr>Z_atom_site_U_iso_or_equivZ_atom_site_U_equiv_geom_meanZ_atom_site_B_iso_or_equivZ_atom_site_B_equiv_geom_meanZ_atom_site_adp_typeZ_atom_site_occupancyZ_atom_site_aniso_labelc                s   g | ]}ˆ   d | ¡‘qS )z_atom_site_aniso_U_%i)rG   )rP   r9   )rF   r   r   rR     s   )é   é   é!   é   é   é   Fc                s   g | ]}ˆ   d | ¡‘qS )z_atom_site_aniso_B_%i)rG   )rP   r9   )rF   r   r   rR     s   rW   zSome ADP items are missingrM   c                s   g | ]}t  | ˆ ¡¡‘qS r   )r   ÚdoubleÚselect)rP   Úadp)Úselr   r   rR   #  s    zError interpreting ADPs: ÚlabelÚscattering_typeÚuÚbÚ	occupancyZ_diffrn_radiation_wavelength)ro   Ú
scatterersÚ
wavelength)!rK   r'   ri   r   r   Úvec3_doublero   rY   ÚfractionalizerG   r\   Úflex_double_else_noneÚxray_scattererÚflex_std_string_else_nonerŠ   rd   ra   Úsym_mat3_doubler   r/   Ú
setdefaultÚfirst_indexr   Úb_as_uÚu_cif_as_u_starrX   rh   r
   Ú	scattererÚ	set_sitesrJ   r[   Ú	structure)r%   rF   Zatom_sites_fracZatom_sites_cartÚlabelsZtype_symbolZU_iso_or_equivZB_iso_or_equivZadp_typer‘   r’   Zatom_site_aniso_labelZadpsZhave_Bsr‹   Úfrr   r9   ÚkwdsZwvl_strr“   r   )rF   rŒ   r   r'   å   s²    














 
"





 






z"crystal_structure_builder.__init__N)r   r   r   r'   r   r   r   r   ry   ã   s   ry   c               @   sÊ   e Zd Ze ¡ e ¡ e ¡ e ¡ e ¡ e ¡ e ¡ e ¡ e ¡ e ¡ e ¡ e ¡ e ¡ e ¡ e ¡ dœZdd„ Zddd„Z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„ ZdS )Úmiller_array_builder)z_refln.F_squaredZ_refln_F_squaredz_refln.intensityz_refln.I(+)z_refln.I(-)z_refln.F_calcz_refln.F_measz	_refln.FPz_refln.F-obsz_refln.Fobsz_refln.F-calcz_refln.Fcalcz_refln.pdbx_F_z_refln.pdbx_I_z_refln.pdbx_anom_differencec             C   s,   x&| j  ¡ D ]}| |¡r| j | S qW d S )N)Úobservation_typesr3   Ú
startswith)r%   ÚlablZokeyr   r   r   Úguess_observationtypeb  s    
z*miller_array_builder.guess_observationtypeNc       B         sÜ	  t  | ˆ ¡ tƒ | _tƒ | _g }|d k	rH| jj|jdd| _|jrH|j}|d krTi }|d krht	j
dd}|  ¡ }xB|D ]8\| _}d | _d | _d | _d g}d g}d g}	xòt |¡D ]ä\}
}|
 d¡sÚ|
 d¡sÚ|
 d¡r´t||
d}|d krðq´| ¡ }|
 d¡rt| ¡ ƒ}t|ƒd	kr q´t	 t	 | j| j¡ ¡ |¡}|
 d¡r\|| _t| ¡ ƒ}q´|
 d¡r||| _t| ¡ ƒ}q´|
 d¡r´|| _t| ¡ ƒ}	q´W g }g }g }g }| j| jd
< tt| ¡ ƒƒ}|d d … }|  |¡\}}|  |¡\}}|  |¡\}}|  |¡\}}x¢|D ]˜}xŽ|D ]„}xz|	D ]p}t|ƒd	ksRt|ƒd	krf|d k	rfd| g}t|ƒd	krˆ|d k	rˆd| g}t|	ƒd	krª|d k	rªd| g}|| | }d}t|ƒrÒdd  |¡ }xÎ|D ]Æ}||d  }||d	  }| j!||||d‰| "ˆ¡}| "ˆ¡}t# $t# %|¡t# %|¡¡}t	 t	 | j| j "ˆ¡¡ ¡ |¡} | d krbqØ|| | }!|  &|j'|!| (|d ¡d¡ | | j|d | < qØW xÔ|D ]Ì}"||"d  }#||"d	  }$| j)|#|||d} | j)|$|||d}%| d ks¨|%d kr q¨t*| |%|"d |"d	 ƒsq¨t+|%|"d	 ƒ}&| j,|&dd} ||" | }!|  &|j'|!| (|d ¡d¡ | | j|"d | < q¨W x|D ]\}'}(})||' }*| j)|*|||d} | d kr´q€t+| |'ƒ} |'g}+|(rB||( },| j)|,|||d}-t+|-|(ƒ}-t*| |-|'|(ƒr|  -|- .¡ ¡ |'|(g}+n,|- &|j'|(g| (|d ¡d¡ |-| j|(| < ||+ | }+|  &|j'|+| (|d ¡d¡ |)d k	r~|  /|)¡ | | j|'| < q€W xÖ|D ]Î}.‡ fdd„|.D ƒ}/|/ 0d ¡dkr˜| j!|/d |||d‰‡fdd„t1|/|.ƒD ƒ}/|/d d d d gkrq˜t	 t	 | j| j "ˆ¡¡ ¡ t#j2|/Ž ¡} ||. | }0|  &|j'|0| (|d ¡d¡ | | j|.d | < q˜W x2|D ](}1d|1kr†qr||1 }*|1|krV||1g | }2|}3| j)|*|||d} |1 d¡sà|1 d¡sà|1 d¡r | j)|*d d d d} d}3||1g }2| d krqr|  3|1¡})|)d k	r,|  /|)¡ |  &|j'|2| (|d ¡d¡ | | j|1|3 < | j)|*|||dd}4|1 4dd¡}5|5 4dd¡}6|4rr|4 .¡ | j|6| < qrW q0W q"W qW qxW xBt | j 5¡ ¡D ],\}
}d}7d|
krô|
}8|
 4dd¡}7nRd|
kr|
}8|
 4dd¡}7n6d|
kr,|
}7|
 4dd¡}8nd|
krF|
}7|
 4dd¡}8|7| jkrÊ|8| jkrÊ| j 6|7¡}9| j 6|8¡}:|:j'|: ¡  d &|: 7¡ ¡}:|9j8|:d d!}|j'dd"}| &|: 7¡ j'tt9|9 7¡ j|: 7¡ j ƒƒd#¡ | /|9 :¡ ¡ | j ;|
|¡ qÊW t| jƒdk	rt<d$ƒ‚g };t| jƒ}<xL|<D ]D}=x<t=| ¡ ƒD ],\}>}?|= >d¡d |?k	r:|; ?|=|>f¡ 	q:W 	q(W t|<ƒtd%d„ |;D ƒƒk	st@‚t|;d&d'„ d(}@tƒ | _Ax&|@D ]\}A}>| jA ;|A| j|A ¡ 	q®W | jA| _d S ))NT)Úother_symmetryÚforcer"   )Úsource_typeÚwavelength_idÚ
crystal_idÚscale_group_code)rz   r)   ZHKLszwavelength_id=%izcrystal_id=%izscale_group_code=%ir   ú,r   )r¬   r­   r®   )r¡   r“   )Údegc                s   g | ]}ˆ   |¡‘qS r   )rG   )rP   Zhl_key)rF   r   r   rR   û  s    z1miller_array_builder.__init__.<locals>.<listcomp>c                s"   g | ]\}}t | ˆ ¡|d ‘qS ))rz   )r{   rŠ   )rP   ZhlZlab)Ú	selectionr   r   rR      s   Zindex_)r¬   r­   r®   Ú	allowNaNsz_refln.Ú_refln_Z_minusZ_plusú-ú+)ÚindicesF)Úassert_is_similar_symmetry)Úanomalous_flag)r¡   z'No reflection data present in cif blockc             S   s   g | ]}|d  ‘qS )r   r   )rP   rr   r   r   r   rR   [  s    c             S   s   | d S )Nr)   r   )Zarrordr   r   r   Ú<lambda>\  ó    z/miller_array_builder.__init__.<locals>.<lambda>)r:   )BrK   r'   r   Ú_arraysÚ_origarraysro   Újoin_symmetryÚcrystal_symmetry_from_filer¡   r   Ú
array_infoÚ#get_miller_indices_containing_loopsr¶   Úwavelength_id_arrayÚcrystal_id_arrayÚscale_group_arrayÚsixÚ	iteritemsÚendswithÚ$as_int_or_none_if_all_question_marksÚcountsÚlistr3   r/   ÚarrayÚsetÚauto_anomalousÚsortedÚget_phase_amplitude_labelsÚget_mapcoefficient_labelsÚget_HL_labelsÚget_FSigF_ISigI_labelsr5   Úget_selectionrŠ   r   Úcomplex_doubler‰   Úset_infoÚcustomized_copyrG   Úflex_std_string_as_miller_arrayÚcheck_array_sizesÚas_flex_doubleÚphase_transferÚ
set_sigmasÚdataÚset_observation_typeri   r   Úhendrickson_lattmanr¨   r   ÚcopyÚpoprl   Úconcatenater   Úobservation_typerš   r   r^   rb   rh   r0   Z
_ordarrays)Br%   rF   Úbase_array_infoÚwavelengthsZbasearraylabelsZrefln_containing_loopsÚ
refln_loopÚwavelength_idsZcrystal_idsZscale_groupsr:   r;   rÛ   rÈ   rÊ   ZlabelsuffixZwavelblZcryslblZscalegrplblÚ	alllabelsZremaininglablsZphaseamplablsZmapcoefflablsZHLcoefflablsZdata_sig_obstype_lablsZw_idZcrys_idZscale_groupZ	jlablsufxZmapcoefflablZA_arrayZB_arrayZmillarrr§   ZphaseamplablZamplitudestrarrayZphasestrarrayZphasesmillarrÚphasesZdatlablZsiglablÚotypeZdatastrarrayZ
datsiglablZsigmasstrarrayÚsigmasZ	hl_labelsZ	hl_valuesZhlabelsr   r¡   ZlablsufxZorigarrZnewlabelZ	newlabel2Zplus_keyZ	minus_keyZ
plus_arrayZminus_arrayZ	arrlstordZarrlstÚarrr9   ÚkZ
sortarrlstZsortkeyr   )rF   r±   r   r'   h  sÀ   



 
&








 

 

 








 




 



.




 

 zmiller_array_builder.__init__c             C   sî   t |ƒ}g }d |¡}t d|¡}t tdd„ |D ƒƒƒ}g }x„|D ]|}g }	x6|D ].}
||
d |
d fkrP|	 |
d |
d f¡ qPW t|	ƒd	krB| d
d„ |	D ƒ¡ x|	D ]}| |d ¡ q¨W qBW g }x|D ]}||krÌ| |¡ qÌW ||fS )Nú z(\S*(HL(\S*)[abcdABCD](\S*)))c             S   s   g | ]}|d  |d f‘qS )é   r€   r   )rP   rr   r   r   r   rR   l  s    z6miller_array_builder.get_HL_labels.<locals>.<listcomp>rí   r€   r   r)   é   c             S   s   g | ]}|d  ‘qS )r   r   )rP   rr   r   r   r   rR   t  s    )rÉ   r5   ÚreÚfindallrË   rh   r/   )r%   r3   ÚlstkeysZHLquadsræ   Z
allmatchesZ	HLtagslstZusedkeysÚmZhllistÚhmrr   Úremainingkeysr   r   r   rÐ   c  s(    




z"miller_array_builder.get_HL_labelsc       
      C   s    t |ƒ}|d d … }d |¡}g }t d|tj¡}xd|D ]\}xV|D ]N}|d  dd¡|d  }	|	|krB| |d |g¡ | |d ¡ | |¡ qBW q8W ||fS )Nrì   z( (\s*_refln[\._]A_)(\S*) )r)   ZA_ZB_rí   r   )rÉ   r5   rï   rð   ÚVERBOSEr   rh   Úremove)
r%   r3   rñ   rô   ræ   ZmapcoefflabelsZ	A_matchesr   rò   ZBlabelr   r   r   rÏ   ~  s    


z.miller_array_builder.get_mapcoefficient_labelsc             C   sÖ  t |ƒ}|d d … }d |¡}g }t d|¡}x„|D ]|}xv|D ]n}|d  dd¡|d  }	|d  dd¡|d  }
|
|ks‚|	|kr>| ||d g¡ | |¡ | |d ¡ q>W q4W d |¡}t d	|¡}x†|D ]~}xx|D ]p}|d  d
d¡|d  }	|d  d
d¡|d  }
|
|ks |	|krÚ| ||d g¡ | |¡ | |d ¡ qÚW qÐW d |¡}t d|¡}xj|D ]b}xZ|D ]R}|d |d  dd¡ }
|
|krx| ||d g¡ | |¡ | |d ¡ qxW qnW d |¡}t d|¡}xâ|D ]Ú}xÒ|D ]Ê}|d }|d |d  }|d d |d  }
|d d |d  d }||ks`|
|ks`||krú||krú|d |krú|
d |ksú|
d |kr˜qú| ||d g¡ | |¡ | |d ¡ qúW qðW ||fS )Nrì   z((\S*PH)([^I]\S*))r)   ZPHÚFrí   r   r   z((\S*PHI)(\S*))ÚPHIz(((\S*)PH)([^I]\S*(WT)))r€   ZWTZFWTz((\S*[\._])phase(\S*))Z_auZ	_sigma_auZ_sigma)rÉ   r5   rï   rð   r   rh   rö   )r%   r3   rñ   rô   ræ   Zphase_amplitudelabelsZ	PHmatchesr   rò   ZPFlabelZFlabelZ
PHImatchesZPHDELmatchesZphase_matchesZ
phaselabelZFlablZFaulabelr   r   r   rÎ     s`    
















z/miller_array_builder.get_phase_amplitude_labelsc          
   C   sö  t |ƒ}|d d … }d |¡}g }t d|¡}xd|D ]\}xV|D ]N}|d |d  }	|	|kr>| ||d |  |¡g¡ | |¡ | |d ¡ q>W q4W d |¡}t d|¡}xd|D ]\}xV|D ]N}|d |d  }	|	|krº| ||d |  |¡g¡ | |¡ | |d ¡ qºW q°W d |¡}t d|¡t d|¡ }
t d	|¡}x®|
D ]¦}xž|D ]–}|d |d krN|d |d krN| |d ¡ |d |krÄ| |d ¡ | |d |d |  |d ¡g¡ n| |d d |  |d ¡g¡ qNW qDW ||fS )
Nrì   z((\S*[\._])SIG(\S*))r)   rí   r   z((\S*)_sigma(_*\S*))z((\S*)_meas(\S*))z((\S*)_calc(\S*))z((\S*)_sigma(\S*)))rÉ   r5   rï   rð   rh   r¨   rö   )r%   r3   rñ   rô   ræ   Z
labelpairsZsigma_matchesr   rò   ZFIlabelZanymeas_matchesZanysigma_matchesZmmatchZsmatchr   r   r   rÑ   Å  sB    










$$*z+miller_array_builder.get_FSigF_ISigI_labelsc       	         s  g }xü| j j ¡ D ]ì‰xæˆ ¡ D ]Ú‰ dˆ kr.q ‡ ‡fdd„dD ƒ}| d ¡dkrrtdˆ  ddd| d ¡  ¡ ƒ‚g }xht|ƒD ]\\}}yt	 
|¡}W n: tk
rÐ } ztdd	| t|ƒf ƒ‚W d d }~X Y nX | |¡ q€W t	j|Ž }| |ˆf¡ P q W qW |S )
NÚindex_hc          	      s"   g | ]}ˆ  ˆ  d d| ¡¡‘qS )rù   zindex_%s)rG   r   )rP   r9   )r:   r.   r   r   rR   ó  s    zLmiller_array_builder.get_miller_indices_containing_loops.<locals>.<listcomp>Úhklr   z2Miller indices missing from current CIF block (%s)zindex_%sz$Invalid item for Miller index %s: %sZHKL)rF   r2   Úvaluesr3   ri   r   r   Úindexr^   r   rc   rd   ra   rh   Úmiller_index)	r%   r2   Zhkl_strZhkl_intr9   Zh_strZh_intrr   r¶   r   )r:   r.   r   rÀ   î  s,     (

z8miller_array_builder.get_miller_indices_containing_loopsFc             C   s˜   |rt  | ¡ d¡}n|dk|dkB  }| jd k	rL|d k	rL|| j ¡ |kM }| jd k	rp|d k	rp|| j ¡ |kM }| jd k	r”|d k	r”|| j ¡ |kM }|S )NTÚ.rM   )r   ÚboolÚsizerÁ   rÛ   rÂ   rÃ   )r%   r;   r¬   r­   r®   r²   r±   r   r   r   rÒ     s    z"miller_array_builder.get_selectionc       	      C   s²   | j |||||d}| |¡}yt |¡}| j |¡}W nN tk
r†   yt |¡}| j |¡}W n tk
r€   |}| j}Y nX Y nX | ¡ dkr˜d S t 	t 
| j|¡ ¡ |¡S )N)r¬   r­   r®   r²   r   )rÒ   rŠ   r   rc   r¶   rd   r‰   r   r   rÊ   rË   ro   rÌ   )	r%   r;   r¬   r­   r®   r²   r±   rÛ   r¶   r   r   r   rÖ     s&    


 z4miller_array_builder.flex_std_string_as_miller_arrayc             C   s   | j S )N)r»   )r%   r   r   r   Úarrays4  s    zmiller_array_builder.arraysc             C   s   | j S )z€
    return dictionary of raw data found in cif file cast into flex.double arrays
    or just string arrays as a fall back.
    )r¼   )r%   r   r   r   Ú
origarrays8  s    zmiller_array_builder.origarrays)NN)NNNF)NNNF)r   r   r   r
   Ú	intensityÚ	amplituder¥   r¨   r'   rÐ   rÏ   rÎ   rÑ   rÀ   rÒ   rÖ   r  r  r   r   r   r   r¤   H  sB   	
 |5)   
   
r¤   c          
   C   sÂ   t |  ¡ tjƒr| S t |  ¡ tjƒrB| j|  ¡  ¡ d |  ¡ ¡S yt |  ¡ ¡ W nh t	k
r¼ } zJt
|ƒ}| d¡r¤| d¡d }td|||d …  ¡ f ƒ‚nt|ƒ‚W d d }~X Y nX d S )N)rÛ   zInvalid floating-point value: ú:rí   z'Invalid floating-point value for %s: %s)r[   rÛ   r   r‰   rc   rÕ   Ú	as_doublerÔ   rl   rd   ra   r¦   r,   r   Ústrip)rÊ   r:   rr   Úe_strr9   r   r   r   rØ   @  s    
rØ   c             C   s.   |   ¡ |  ¡ kr*d||f }t|d dS dS )Nz2Miller arrays '%s' and '%s' are of different sizes)r   FT)r   r   )Úarray1Úarray2Zkey1Úkey2Úmsgr   r   r   r×   R  s
    
r×   c             C   s0   | d krd S | }|  d¡rd S |  d¡r,d S |S )NrM   rþ   )Úall_eq)Úcif_block_itemÚresultr   r   r   Ú$none_if_all_question_marks_or_periodY  s     
 
 r  c          
   C   s”   t | ƒ}|d krd S y
t |¡S  tk
rŽ } zRt|ƒ}|d k	rv| d¡rv| d¡d }td|||d …  ¡ f ƒ‚nt|ƒ‚W d d }~X Y nX d S )NzInvalid integer value: r  rí   z Invalid integer value for %s: %s)	r  r   rc   rd   ra   r¦   r,   r   r  )r  rz   Ústringsrr   r  r9   r   r   r   rÇ   `  s     
rÇ   c          
   C   s”   t | ƒ}|d krd S y
t |¡S  tk
rŽ } zRt|ƒ}|d k	rv| d¡rv| d¡d }td|||d …  ¡ f ƒ‚nt|ƒ‚W d d }~X Y nX d S )NzInvalid floating-point value: r  rí   z'Invalid floating-point value for %s: %s)	r  r   r‰   rd   ra   r¦   r,   r   r  )r  rz   r  rr   r  r9   r   r   r   r{   p  s     
r{   c          
   C   s>   y
t  | ¡S  tk
r8 } ztt|ƒƒ‚W d d }~X Y nX d S )N)r   r‰   rd   r   ra   )Zflex_std_stringrr   r   r   r   Úflex_double€  s    
r  c             C   s8   t | ƒ}|d krd S y
t |¡S  tk
r2   Y nX d S )N)r  r   r‰   rd   )r  r  r   r   r   r–   †  s     
r–   c             C   s   t | tjƒr| S d S d S )N)r[   r   r\   )r  r   r   r   r˜     s    r˜   c             C   s,   t | tƒr| S t|  d¡ d¡ d¡d ƒS )zSa cif string may be quoted,
and have an optional esd in brackets associated with itú'ú"ú(r   )r[   Úfloatr  rb   )Ústringr   r   r   rX   •  s    
rX   c       
      C   sö   x¢| j  ¡ D ]”}xŽ| ¡ D ]‚}d|kr| d¡}| d¡}d ||gkr˜i }xHt||ƒD ]:\}}yt|ƒ}t|ƒ|t|ƒ< W qV tk
rŽ   Y qVX qVW |S d S qW qW |  d¡}|  d¡}	d ||	gkròyt|ƒ}t|ƒt|	ƒiS  tk
rð   Y nX d S )Nz_diffrn_radiation_wavelength.z_diffrn_radiation_wavelength.idz'_diffrn_radiation_wavelength.wavelength)r2   rû   r3   rG   r   rc   r  rd   )
rF   r.   r:   rå   Zwavelength_strsZwl_r¬   r“   Zwl_idZwavelength_strr   r   r   Úget_wavelengthsœ  s0    




r  )N)N).Ú
__future__r   r   r   Úcctbxr   r   r   r   r	   r
   Úcctbx.array_familyr   Ú	iotbx.cifÚiotbxr   Úlibtbx.utilsr   Úlibtbx.containersr   r   r   rÄ   r   Ú	six.movesr   rï   r   r   r   Úobjectr    r@   rK   ry   r¤   rØ   r×   r  rÇ   r{   r  r–   r˜   rX   r  r   r   r   r   Ú<module>   s>    ;'je   {

	