B
    §dHE  ã            %   @   s€  d Z ddlmZmZmZ ddlm  mZ ddl	m
Z
 ddl	mZ ddlZe d¡ZddlmZ ddlmZ dd	lmZmZm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Z ddlZej Z ej!Z!G dd„ deƒZ"G dd„ de#ƒZ$e$Z%dDdd„Z&dEdd„Z'G dd„ dƒZ(G dd„ de#ƒZ)dddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAg%Z*dBdC„ Z+dS )Fa  
R. J. Gildea, L. J. Bourhis, O. V. Dolomanov, R. W. Grosse-Kunstleve,
H. Puschmann, P. D. Adams and J. A. K. Howard:
iotbx.cif: a comprehensive CIF toolbox.
J. Appl. Cryst. (2011). 44, 1259-1263.

https://doi.org/10.1107/S0021889811041161

http://cctbx.sourceforge.net/iotbx_cif

é    )Úabsolute_importÚdivisionÚprint_functionN)Úrange)ÚzipZiotbx_cif_ext)Úflex)Úmiller)ÚmodelÚbuildersÚgeometry)ÚOrderedDict)ÚSorry)Ú	flat_list)Údetect_binary_file)Ú
smart_openc               @   s   e Zd ZeZejZdS )ÚCifParserErrorN)Ú__name__Ú
__module__Ú__qualname__Ú__orig_module__Ú	Exception© r   r   úq/mnt/filia/a/genomebrowser/www/genomebrowser/fleming/tools/molprobity/modules/cctbx_project/iotbx/cif/__init__.pyr   "   s   r   c               @   sV   e Zd Zddd„Zdd„ Zdd„ Zdd
d„Zddd„Zddd„Zddd„Z	dd„ Z
dS )ÚreaderNTc       	      C   s  |||g  d ¡dkst‚|| _|d kr2t |¡}n|d ks>t‚|| _d | _|d k	r^t |¡}nd}|d k	rz| 	¡ }| 
¡  tƒ }tt|ƒ|jƒ|_|j|dr¦tdƒ‚t ||||¡| _|rÜt| j ¡ ƒrÜt| j ¡ d ƒ‚|rt| j ¡ ƒrt| j ¡ d ƒ‚d S )Né   Zmemory)Úblockz'Binary file detected, aborting parsing.r   )ÚcountÚAssertionErrorÚ	file_pathr
   Zcif_model_builderÚbuilderÚoriginal_arraysr   Úfor_readingÚreadÚcloser   ÚminÚlenÚmonitor_initialÚis_binary_filer   ÚextÚfast_readerÚparserÚlexer_errorsÚparser_errors)	Úselfr   Úfile_objectZinput_stringÚ
cif_objectr   Úraise_if_errorsÚstrictZbinary_detectorr   r   r   Ú__init__(   s.    zreader.__init__c             C   s
   | j  ¡ S )N)r   r	   )r-   r   r   r   r	   J   s    zreader.modelc             C   s   | j  ¡  ¡ | j  ¡  ¡  S )N)r*   r+   Úsizer,   )r-   r   r   r   Úerror_countM   s    zreader.error_counté2   c             C   sb   |d krt j}x&| j ¡ d |… D ]}t||d q"W x&| j ¡ d |… D ]}t||d qJW d S )N)Úfile)ÚsysÚstdoutr*   r+   Úprintr,   )r-   Z
max_errorsÚoutÚmsgr   r   r   Úshow_errorsQ   s     zreader.show_errorsc             C   s2   t |  ¡ | j|tjdj}|d k	r*|| S |S d S )N)Ú	cif_modelr   Údata_block_nameÚdata_structure_builder)Úcctbx_data_structures_from_cifr	   r   r
   Úcrystal_structure_builderÚxray_structures)r-   r>   rB   r   r   r   Úbuild_crystal_structuresX   s    zreader.build_crystal_structuresc             C   s>   t |  ¡ | j|tj|d}|j| _|d k	r4|j| S |jS d S )N)r=   r   r>   r?   Úbase_array_info)r@   r	   r   r
   Úmiller_array_builderr    Úmiller_arrays)r-   r>   rD   Zcctbxdatr   r   r   Úbuild_miller_arraysc   s    
zreader.build_miller_arraysFc             C   sÚ   |d krt j| jdd}|d k	r8t| j||d ¡ ƒ}ntdd„ | j|d ¡ D ƒƒ}|}xztt|ƒƒD ]j}	|d k	r¬||	  	¡ }
|
j
||d}||	 j|||	  ¡ d||	< |d k	rh||	 j|||	  ¡ d	||	< qhW |S )
NÚcif)ÚsourceZsource_type)r>   rD   c             S   s   g | ]}t | ¡ ƒ‘qS r   )ÚlistÚvalues)Ú.0Úarraysr   r   r   ú
<listcomp>‚   s    z+reader.as_miller_arrays.<locals>.<listcomp>)rD   )Úother_symmetryÚforce)Úcrystal_symmetryÚinfo)Úanomalous_flagrR   )r   Z
array_infor   rJ   rG   rK   r   r   r%   rQ   Újoin_symmetryÚcustomized_copyrR   )r-   r>   rQ   Zforce_symmetryZmerge_equivalentsrD   Ú	anomalousrM   rO   ÚiZcrystal_symmetry_from_filer   r   r   Úas_miller_arrayss   s.    zreader.as_miller_arraysc             C   s   | j S )N)r    )r-   r   r   r   Úas_original_arrays’   s    zreader.as_original_arrays)NNNNNTT)r5   N)N)NN)NNFTNN)r   r   r   r2   r	   r4   r<   rC   rG   rX   rY   r   r   r   r   r   &   s(         


 
     
r   Úmmcifc                sr  |  ¡ }|dkst‚|dkr"d‰ nd‰ dddœ}dd	d
œ}|  ¡ }| ¡ }tdd„ |D ƒƒ}t|dƒ}dˆ  dˆ  dˆ  g}| ‡ fdd„t|ƒD ƒ¡ | ‡ fdd„t|ƒD ƒ¡ | dˆ  dˆ  dˆ  g¡ tj|d}| 	¡ }	|  ¡ }| j
}
i }x(|  ¡ D ]}| |j|j|jf¡ q W | | j¡}|d kr<| j}|d krJd}x t | 	¡ ¡D ]\}}| |
j¡}|
jr”||
jkr”d| ¡  }n|d kr®d}|| ¡  }|dkrÂd\}}n|| \}}d| }d| }|||g}dd„ | ¡ D ƒ}dd„ | ¡ D ƒ}| dg|| ¡   ¡ | dg|| ¡   ¡ | || ¡ | | ¡ ||g¡ | |¡ q\W |S )N)ÚcorecifrZ   rZ   Ú.Ú_z9International Tables Volume C Table 6.1.1.4 (pp. 500-502)z3Waasmaier & Kirfel (1995), Acta Cryst. A51, 416-431)Zit1992Zwk1995zGHenke, Gullikson and Davis, At. Data and Nucl. Data Tables, 1993, 54, 2z"Sasaki, KEK Report, 1989, 88-14, 1)ZhenkeZsasakic             S   s   g | ]}|  ¡ ‘qS r   )Ún_terms)rL   Úgaussianr   r   r   rN   ¨   s    z&atom_type_cif_loop.<locals>.<listcomp>é   z_atom_type%ssymbolz _atom_type%sscat_dispersion_realz _atom_type%sscat_dispersion_imagc                s   g | ]}d ˆ |d f ‘qS )z _atom_type%sscat_Cromer_Mann_a%ié   r   )rL   rW   )Ú	separatorr   r   rN   ®   s   c                s   g | ]}d ˆ |d f ‘qS )z _atom_type%sscat_Cromer_Mann_b%ira   r   )rL   rW   )rb   r   r   rN   °   s   z_atom_type%sscat_Cromer_Mann_cz_atom_type%sscat_sourcez"_atom_type%sscat_dispersion_source)ÚheaderzCustom %i-GaussianzŠ%i-Gaussian fit: Grosse-Kunstleve RW, Sauter NK, Adams PD:
Newsletter of the IUCr Commission on Crystallographic Computing 2004, 3, 22-31.)r\   r\   z%.5fc             S   s   g | ]}d | ‘qS )z%.5fr   )rL   Úar   r   r   rN   Ô   s    c             S   s   g | ]}d | ‘qS )z%.5fr   )rL   rd   r   r   r   rN   Õ   s    )Úlowerr   Úscattering_type_registryZunique_gaussians_as_listÚmaxÚextendr   r	   ÚloopÚas_type_gaussian_dictZscattering_type_registry_paramsÚ
scatterersÚ
setdefaultÚscattering_typeÚfpÚfdpÚgetZinelastic_form_factors_sourceÚsixÚ	iteritemsÚtableÚcustom_dictr^   Ú
array_of_aÚ
array_of_bÚcÚadd_row)Úxray_structureÚformatÚsourcesZinelastic_referencesrf   Zunique_gaussiansZmax_n_gaussiansrc   Zatom_type_loopZgaussian_dictÚparamsZfp_fdp_tableÚscZdisp_sourceZ	atom_typer_   Zscat_sourcern   ro   ÚrowZ
gaussian_aZ
gaussian_br   )rb   r   Úatom_type_cif_loop—   sr     








r   Ú_refln_c             C   s:   t jd| d| d| fd}x| D ]}| |¡ q$W |S )Nz	%sindex_hz	%sindex_kz	%sindex_l)rc   )r	   ri   rx   )ÚindicesÚprefixÚ
refln_loopÚhklr   r   r   Úmiller_indices_as_cif_loopß   s
    
r…   c               @   s    e Zd Zddd„Zd	dd„ZdS )
Úmiller_arrays_as_cif_blockNÚ_reflnrZ   c       	      C   sx   |  ¡ }|dkst‚|dkr"d}nd}| ¡ j|d| _|| | _| ¡  ¡ | _d | _|  	||||¡ | j 
| j¡ d S )N)r[   rZ   rZ   r\   r]   )rz   )re   r   rQ   Úas_cif_blockÚ	cif_blockr‚   r   Ú	deep_copyrƒ   Úadd_miller_arrayÚadd_loop)	r-   ÚarrayÚ
array_typeÚcolumn_nameÚcolumn_namesZmiller_index_prefixrz   Zwformatrb   r   r   r   r2   é   s    
z#miller_arrays_as_cif_block.__init__c          	      s
  |||g  d¡dkst‚|dk	r.|dks<t‚n|dk	r<|g}| ¡ rú|dkrjˆjd | ˆjd | g}nt|ƒdkszt‚d|d kr’d|d	 ksªd
|d krÐd|d	 krÐt | ¡ ¡ ¡ t 	| ¡ ¡ ¡ g}n&t 
| ¡ ¡ ¡ |jdd ¡  ¡ g}n@| ¡ rN|dkr"‡fdd„dD ƒ}nt|ƒdks4t‚dd„ | ¡  ¡ D ƒ}nì|dk	r¦| ¡ rhd}nd}ˆjd | | g}| ¡ dk	r¦| ˆjd | d ¡ t| ¡ tjƒrÄ| ¡ g}n| ¡  ¡ g}| ¡ r| ¡ dk	røt|ƒdks| ¡ dkrt|ƒdkrg }| ¡ \}}xâdD ]Ú}	| |	¡}
|
 | |	¡¡ |	dkrv| ¡  |
¡}|dt|ƒd … }n$| ¡  |
¡ }|t|ƒd d… }| ¡  |
¡}t t | ¡ |¡|¡}| ¡ dk	râ| | ¡  |
¡¡ ˆjdkrô|ˆ_ˆj ||d q*W dS | ¡ dk	r:t|ƒdkr:| | ¡  ¡ ¡ ˆj !¡ | ¡  !¡ krdˆj "| ¡ ¡s®ddl#m$} | ¡  %¡ }|ˆj|ƒ}| &d¡ !¡ r| ˆj | 'd¡¡¡ x0|D ](}| t dg| !¡ | !¡   ¡¡ q¶W x$|D ]}| !¡ | !¡ ksèt‚qèW |ˆj|ƒ}| &d	¡ !¡ rˆ| | 'd	¡¡}ˆj |¡ tˆjƒd }x,|D ]$}t(|ƒdg|  }ˆj )|¡ qTW |ˆj|ƒ}|ˆj|ƒ}| *¡ ‰ ‡ fdd„|D ƒ}ˆjdkrÌt+ˆjˆjdˆ_t,t-||ƒƒ}x|D ]}|ˆjksàt‚qàW ˆj .|¡ dS )zU
    Accepts a miller array, and one of array_type, column_name or column_names.
    Nr   )ZcalcZmeasZF_Zphase_Z_A_r   Z_B_ra   z.A_z.B_T)Údegc                s   g | ]}ˆ j d |  ‘qS )z	HL_%s_iso)r‚   )rL   Zabcd)r-   r   r   rN     s    z?miller_arrays_as_cif_block.add_miller_array.<locals>.<listcomp>ZABCDr`   c             S   s   g | ]}|  ¡ ‘qS r   )Ú	as_string)rL   Údr   r   r   rN     s    Zsquared_Ú Úsigma)ú+ú-r–   )r   )Úmatch_indicesú?é   c                s   g | ]}|  ˆ ¡‘qS r   )Úselect)rL   r“   )Úpermr   r   rN   Y  s    )r‚   )/r   r   Zis_complex_arrayr‚   r%   r   ÚrealÚdatar’   ÚimagÚabsZphasesZis_hendrickson_lattman_arrayÚas_abcdZis_xray_intensity_arrayZsigmasÚappendÚ
isinstanceÚ
std_stringrS   Zmatch_bijvoet_matesZpairs_hemisphere_selectionrh   Zsingles_hemisphere_selectionr   r›   r   r   ÚsetrQ   Z
set_sigmasrƒ   r‹   r3   Úall_eqÚcctbx.millerr˜   rŠ   ZsinglesZsingle_selectionrJ   rx   Úpermutationr…   r   r   Zadd_columns)r-   r   rŽ   r   r   rž   Zobs_extZasuZmatchesZanomalous_signÚselr   Zhemisphere_column_namesZhemisphere_dataZhemisphere_arrayr˜   Zother_indicesÚmatchr“   Zsingle_indicesZn_data_columnsr„   r~   ÚcolumnsÚkeyr   )rœ   r-   r   r‹   ú   sª    








(


z+miller_arrays_as_cif_block.add_miller_array)NNNr‡   rZ   )NNN)r   r   r   r2   r‹   r   r   r   r   r†   ç   s      
 r†   c               @   s   e Zd Zddd„ZdS )r@   Nc             K   sº  |d ks|d kst ‚|d kr*tjtjf}n|tjtjfks>t ‚|f}tƒ | _tƒ | _tƒ | _|d krtt||d 	¡ }t
|ƒs„tdƒ‚|d k	rº||krº|d kr¦d| }	nd||f }	t|	ƒ‚g }
i }xò| ¡ D ]æ\}}|d k	ræ||kræqÌxÊ|D ]Â}|tjkr&d|ksd|kr®| j |||ƒj¡ qì|tjkrìt |¡}|d k	rH|}|d k	r`|j|gd}d|ks|d	|ks|d
|krì||||d}| j || ¡ ¡ | j || ¡ ¡ qìW qÌW d S )N)r   r.   zNo data block found in CIFz!Unknown CIF data block name: "%s"z.Unknown CIF data block name "%s" in file: "%s"Z_atom_site_fract_xZ_atom_site_Cartn_x)ÚlabelsZ_refln_index_hz_refln.index_hZ_diffrn_refln)rD   Úwavelengths)r   r
   rE   rA   r   rB   rF   r    r   r	   r%   r   ÚRuntimeErrorÚitemsrl   Ú	structureZget_wavelengthsrU   rM   Z
origarrays)r-   r.   r   r=   r?   r>   rD   ÚkwdsZdata_structure_buildersr;   Úerrorsr®   r¬   r   r   Zblock_wavelengthsÚbr   r   r   r2   d  sP    

 




z'cctbx_data_structures_from_cif.__init__)NNNNNN)r   r   r   r2   r   r   r   r   r@   c  s        r@   Z_cellZ_space_groupZ_space_group_symopZ	_symmetryZ
_computingZ	_softwareZ_em_softwareZ	_citationZ_citation_authorZ_reflnsZ_reflns_shellZ_refineZ_refine_ls_restrZ_refine_ls_shellZ_pdbx_refine_tlsZ_pdbx_refine_tls_groupZ_struct_asymZ_struct_conf_typeZ_struct_confZ_struct_connZ_struct_sheetZ_struct_sheet_orderZ_struct_sheet_rangeZ_pdbx_struct_sheet_hbondZ_struct_ncs_ensZ_struct_ncs_domZ_struct_ncs_ens_genZ_struct_ncs_dom_limZ_struct_ncs_operZ_refine_ls_restr_ncsZ_entityZ_entity_polyZ_entity_poly_seqZ
_atom_typeZ
_chem_compZ_chem_comp_atomÚ
_atom_sitec          
   C   sD   |   d¡d }y
t |¡S  tk
r> } zttƒS d }~X Y nX d S )Nr\   r   )ÚsplitÚcategory_orderÚindexÚ
ValueErrorr%   )r¬   Zkey_categoryÚer   r   r   Úcategory_sort_functionÃ  s
    
r»   )rZ   )r€   ),Ú__doc__Ú
__future__r   r   r   Úboost_adaptbx.boost.pythonÚboostÚpythonÚbpÚ	six.movesr   r   rq   Ú
import_extr(   Úcctbx.array_familyr   Úcctbxr   Z	iotbx.cifr	   r
   r   Zlibtbx.containersr   Úlibtbx.utilsr   r   r   Úlibtbxr   r7   Zdistances_as_cif_loopZangles_as_cif_loopr   Úobjectr   r)   r   r…   r†   r@   r·   r»   r   r   r   r   Ú<module>   s|   
o
H
|9