
    Xf+                         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e          ZdS )zWrite a MMTF file.    N)defaultdict)ascii_uppercase)MMTFEncoder)protein_letters_3to1_extended)Select)StructureIO)StructureBuilder)seq1c                   .    e Zd ZdZd ZefdZd Z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                     dS )zInitialise.N )selfs    3lib/python3.11/site-packages/Bio/PDB/mmtf/mmtfio.py__init__zMMTFIO.__init__*   s          c                     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selects      r   savezMMTFIO.save-   sk    , (C(( 	_   4%% 	R  622222PQQQr   c              #      K   t          j        d          D ]7}t          j        t          |          D ]}d                    |          V  8dS )z4Label chains sequentially: A, B, ..., Z, AA, AB etc.   )repeat N)	itertoolscountproductr   join)r   sizess      r   _chain_id_iteratorzMMTFIO._chain_id_iteratorL   sf      OA&& 	! 	!D&tDDD ! !ggajj    !	! 	!r   c                   & d\  }}}}d | j                                         D             }d |v }t                      }	|	                    ddddd| j         j                   |	                    dd            t          t          | j         j                  }
|
	                    d          d |
d<   |
	                    d          g |
d<   n|
d         g|
d<   |	
                    d d |
d         |
d	         |
d
         |
d         |
d                    d | j                                         D             }d|
v r|
d         }|                                D ]\  }}g }|dd          D ]3}|                    d |                                D                        4|                    g d           d t          |          D             &|	                    |&fd|d         D             |           g }g }t          | j                                                   D ]\  }}                    |          s|                                 }|dz  }|	                    |d           |                                D ]0}                    |          sg }d}d}d}d}|                                D ]}                    |          s|dz  }|                                \  }}}|dk    rd} d}!n|dk    rd} d}!nd} d}!|                                }"| |k    s| dk    r|"|k    r|	                    |gdd|!           |	                    t9          |          |j                                        sdn|j                                        d            |dk    r(|                    |t?          |          z
  dz
             |s|                    |           d!}|dz  }d}|!dk    r|tA          |"tB          "          z  }| }|"}|	"                    |"|j        d         |j        d#         dk    rdn|j        d#         dt?          fd$|                                D                       dtA          |"tB          "          |!dk    rtG          |          dz
  nd%d%&	  	         |                                D ]}#$                    |#          rt|dz  }|	%                    |#j&        |r|n|#j'        |#j(        dk    rdn|#j(        |#j)        d         |#j)        d         |#j)        d#         |#j*        |#j+        |#j,        d'
  
         |                    |           tG          |	j-                  tG          |          z
  }$t          |          D ]\  }%}||	j-        |$|%z            d(<   2|                    |t?          |          z
             |                    |t?          |          z
             ||	_.        ||	_/        ||	_0        ||	_1        ||	_2        ||	_3        |	4                                 |	5                    |           d S ))N)r   r   r   r   c                     g | ]	}|j         
S r   )serial_number).0as     r   
<listcomp>z*MMTFIO._save_structure.<locals>.<listcomp>V   s    LLLALLLr   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_workr6   titler9   r:   experimental_methodsc                 6    g | ]}|                                 S r   )get_id)r+   chains     r   r-   z*MMTFIO._save_structure.<locals>.<listcomp>z   s     MMMU\\^^MMMr   biomoltransr   c                 ,    g | ]}t          |          S r   )float)r+   items     r   r-   z*MMTFIO._save_structure.<locals>.<listcomp>   s    (N(N(Nt(N(N(Nr   )        rF   rF   g      ?c                     i | ]\  }}||	S r   r   )r+   kvs      r   
<dictcomp>z*MMTFIO._save_structure.<locals>.<dictcomp>   s    "I"I"IDAq1a"I"I"Ir   c                      g | ]
}|         S r   r   )r+   cchain_id_to_idxs     r   r-   z*MMTFIO._save_structure.<locals>.<listcomp>   s    (N(N(N);(N(N(Nr   )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   F   K   | ]}                     |          d V  dS )r   N)accept_atom)r+   r,   r   s     r   	<genexpr>z)MMTFIO._save_structure.<locals>.<genexpr>   sK       ' ' !%11!44'' ' ' ' ' 'r   )	
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chargerZ   )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_residuer@   get_resnameset_entity_infoset_chain_infonextstripappendsumr
   r   set_group_infolenrd   set_atom_infor8   r*   altloccoordru   bfactorrw   entity_listchains_per_modelgroups_per_chain	num_atomsr`   
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_idsrB   keyvaluematrix_itemsliner   r   mimodelchain_id_iteratorrA   seqsseqprev_residue_typeprev_resnamefirst_chainresiduehetfieldresseqicoderesidue_typer\   resnameatom	start_indirM   s'     `                                   @r   r   zMMTFIO._save_structureR   s   @J=lL+ ML1I1I1K1KLLL---* 	 	
 	
 	
 	"=== "#t~'<==??<((0(,K%??-..6.0K*++/:;M/N.OK*+"<0f%'(9:$^4!,-?!@ 	  	
 	
 	
 NM1J1J1L1LMMM	K''%m4K)//11  
U!!!""I P PD ''(N(N(N(N(NOOOO##$8$8$8999"I"IIi4H4H"I"I"I..'*(N(N(N(NU1X(N(N(N$0 /     "4>#<#<#>#>?? |	J |	JIB&&u--  $ 7 7 9 9AL"" #    ))++ oI oI**511 $&!!"$6688 _ _G!0099 !  A%L.5nn.>.>+Hfe3'-&/!S'/&-'/&3%1133G $'888$00W5L5L//+7.%'(*(3	 0     ..%)*;%<%<.3hnn.>.> TEHNNDTDT'( /    (!++,33 ,s3C/D/D Dq H    + - KK,,,&+$) "i//tG8UVVVV(4%#*L**#*%,Z]&-jms&:&:FF
1#%#& ' ' ' '%,%>%>%@%@' ' ' $ $
 $%+/#0M, , , 8Ci7O7Os3xx!||UW13# +   ( !( 9 9 ; ;  !--d33 '1,K#11*.) (6%<KK)-); /3kS.@.@FFdk"&*Q-"&*Q-"&*Q-*..37<(,'(! 2   , C    344s4yy@	'oo I IFAsEHG'	A6zBBI ##L37G3H3H$HIIIIs3C/D/D DEEE#3 #3 ')))""$$$8$$$$$r   N)	__name__
__module____qualname____doc__r   _selectr   r'   r   r   r   r   r   r      sm             %, R R R R>! ! !E% E% E% E% E%r   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   <module>r      s          # # # # # # " " " " " " , , , , , , : : : : : :             % % % % % % 5 5 5 5 5 5      
&((~% ~% ~% ~% ~%[ ~% ~% ~% ~% ~%r   