o
    Rŀg+                     @   s   d Z ddl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
mZ dd	lmZ dd
lmZ e ZG dd deZdS )zWrite a MMTF file.    N)defaultdict)ascii_uppercase)MMTFEncoder)protein_letters_3to1_extended)Select)StructureIO)StructureBuilder)seq1c                   @   s4   e Zd ZdZdd ZefddZdd Zdd	 Zd
S )MMTFIOa  Write a Structure object as a MMTF file.

    Examples
    --------
        >>> from Bio.PDB import MMCIFParser
        >>> from Bio.PDB.mmtf import MMTFIO
        >>> parser = MMCIFParser()
        >>> structure = parser.get_structure("1a8o", "PDB/1A8O.cif")
        >>> io=MMTFIO()
        >>> io.set_structure(structure)
        >>> io.save("bio-pdb-mmtf-out.mmtf")
        >>> import os
        >>> os.remove("bio-pdb-mmtf-out.mmtf")  # tidy up

    c                 C   s   dS )zInitialise.N )selfr   r   G/var/www/html/myenv/lib/python3.10/site-packages/Bio/PDB/mmtf/mmtfio.py__init__*   s    zMMTFIO.__init__c                 C   s4   t |ts	tdt| dr| || dS td)a  Save the structure to a file.

        :param filepath: output file
        :type filepath: string

        :param select: selects which entities will be written.
        :type select: object

        Typically select is a subclass of L{Select}, it should
        have the following methods:

         - accept_model(model)
         - accept_chain(chain)
         - accept_residue(residue)
         - accept_atom(atom)

        These methods should return 1 if the entity is to be
        written out, 0 otherwise.
        zMWriting to a file handle is not supported for MMTF, filepath must be a string	structurez1Use set_structure to set a structure to write outN)
isinstancestr
ValueErrorhasattr_save_structure)r   filepathselectr   r   r   save-   s   

zMMTFIO.savec                 c   s6    t dD ]}t jt|dD ]}d|V  qqdS )z4Label chains sequentially: A, B, ..., Z, AA, AB etc.   )repeat N)	itertoolscountproductr   join)r   sizesr   r   r   _chain_id_iteratorL   s   zMMTFIO._chain_id_iteratorc           &         s  d\}}}}dd | j  D }d |v }t }	|	jddddd| j jd |	jdd d tt| j j}
|
	dd u r=d |
d< |
	d	d u rIg |
d	< n|
d	 g|
d	< |	j
d d |
d |
d
 |
d |
d |
d	 d dd | j  D }d|
v r|
d }| D ]<\}}g }|dd  D ]}|dd | D  q|g d dd t|D  |	j| fdd|d D |d q|g }g }t| j  D ]e\}}|sq|  }|d7 }|	j|dd | D ]=}|sqg }d}d}d}d}| D ]}|sq|d7 }| \}}}|dkrd} d}!n|dkr"d} d}!nd} d}!| }"| |ks9| dkrx|"|krx|	j|gdd|!d  |	jt||j sPd!n|j dd" |dkrh||t| d  |sp|| d#}|d7 }d}|!dkr|t |"t!d$7 }| }|"}|	j"|"|jd |jd% dkrd!n|jd% dtfd&d'| D dt |"t!d$|!dkrt#|d nd(d(d)	 | D ]8}#$|#r|d7 }|	j%|#j&|r|n|#j'|#j(dkrd!n|#j(|#j)d |#j)d |#j)d% |#j*|#j+|#j,dd*
 qq|| t#|	j-t#| }$t|D ]\}%}||	j-|$|%  d+< qq||t|  q||t|  ||	_.||	_/||	_0||	_1||	_2||	_3|	4  |	5| d S ),N)r   r   r   r   c                 S   s   g | ]}|j qS r   )serial_number.0ar   r   r   
<listcomp>V   s    z*MMTFIO._save_structure.<locals>.<listcomp>r   )total_num_bondstotal_num_atomstotal_num_groupstotal_num_chainstotal_num_modelsstructure_idr   )space_group	unit_cell
resolutionstructure_methodnamedeposition_daterelease_date)r_freer_workr/   titler2   r3   experimental_methodsc                 S   s   g | ]}|  qS r   )get_id)r$   chainr   r   r   r&   z       biomoltransr   c                 S   s   g | ]}t |qS r   )float)r$   itemr   r   r   r&      r:   )        r>   r>   g      ?c                 S   s   i | ]\}}||qS r   r   )r$   kvr   r   r   
<dictcomp>   s    z*MMTFIO._save_structure.<locals>.<dictcomp>c                    s   g | ]} | qS r   r   )r$   c)chain_id_to_idxr   r   r&      r:   )bio_assembly_indexinput_chain_indicesinput_transform)model_idchain_countT ATOMpolymerWHETATMwaterznon-polymer)chain_indicessequencedescriptionentity_type )chain_id
chain_name
num_groupsF)
custom_map   c                 3   s    | ]
}  |rd V  qdS )r   N)accept_atomr#   )r   r   r   	<genexpr>   s    
z)MMTFIO._save_structure.<locals>.<genexpr>)	
group_namegroup_numberinsertion_code
group_type
atom_count
bond_countsingle_letter_codesequence_indexsecondary_structure_type)
	atom_namer"   alternative_location_idxyz	occupancytemperature_factorelementchargerP   )6r   	get_atomsr   init_structureidset_xtal_infor   r   headergetset_header_info
get_chainsitemsextendsplit	enumerateset_bio_assembly_trans
get_modelsaccept_modelr!   set_model_infoaccept_chainget_unpacked_listaccept_residuer8   get_resnameset_entity_infoset_chain_infonextstripappendsumr	   r   set_group_infolenrY   set_atom_infor1   r"   altloccoordrj   bfactorrl   entity_listchains_per_modelgroups_per_chain	num_atomsrV   
num_chains
num_modelsfinalize_structure
write_file)&r   r   r   count_modelscount_chainscount_groupscount_atomsatom_serialsrenumber_atomsencoderheader_dict	chain_idsr;   keyvaluematrix_itemsliner   r   mimodelchain_id_iteratorr9   seqsseqprev_residue_typeprev_resnamefirst_chainresiduehetfieldresseqicoderesidue_typerR   resnameatom	start_indir   )rC   r   r   r   R   s,  	










zMMTFIO._save_structureN)	__name__
__module____qualname____doc__r   _selectr   r!   r   r   r   r   r   r
      s    r
   )r   r   collectionsr   stringr   mmtf.api.mmtf_writerr   Bio.Data.PDBDatar   Bio.PDB.PDBIOr   r   Bio.PDB.StructureBuilderr   Bio.SeqUtilsr	   r   r
   r   r   r   r   <module>   s   