B
    b3                 @   sZ   d Z ddlmZ ddlmZ dZdZG dd dZe ZG dd	 d	Z	G d
d de	Z
dS )zOutput of PDB files.    )StructureBuilder)atom_weightsz@%s%5i %-4s%c%3s %c%4i%c   %8.3f%8.3f%8.3f%s%6.2f      %4s%2s%2s
z<%s%5i %-4s%c%3s %c%4i%c   %8.3f%8.3f%8.3f %7s  %6s      %2s
c               @   s8   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d ZdS )SelectzSelect everything for PDB output (for use as a base class).

    Default selection (everything) during writing - can be used as base class
    to implement selective output. This selects which entities will be written out.
    c             C   s   dS )z/Represent the output as a string for debugging.z<Select all> )selfr   r   ,lib/python3.7/site-packages/Bio/PDB/PDBIO.py__repr__   s    zSelect.__repr__c             C   s   dS )z*Overload this to reject models for output.   r   )r   modelr   r   r   accept_model#   s    zSelect.accept_modelc             C   s   dS )z*Overload this to reject chains for output.r	   r   )r   chainr   r   r   accept_chain'   s    zSelect.accept_chainc             C   s   dS )z,Overload this to reject residues for output.r	   r   )r   residuer   r   r   accept_residue+   s    zSelect.accept_residuec             C   s   dS )z)Overload this to reject atoms for output.r	   r   )r   atomr   r   r   accept_atom/   s    zSelect.accept_atomN)	__name__
__module____qualname____doc__r   r   r   r   r   r   r   r   r   r      s   r   c               @   s    e Zd ZdZdd Zdd ZdS )StructureIOz8Base class to derive structure file format writers from.c             C   s   dS )zInitialise.Nr   )r   r   r   r   __init__:   s    zStructureIO.__init__c             C   sF  |j dkr|}n*t }|d |d |j dkrP|j|  |j| _n|d |j dkrz|jd |  nd}|| |j dkr|j	d	k	r|j	j
}||jd | _
|}|jd | |  nd|d
ddd |jd | jd |  y|j	j	j
}W n tk
r$   Y nX ||jd | _
|j}|| _d	S )z7Check what the user is providing and build a structure.SZpdb Mr   CARNZDUMr	   )levelr   Zinit_structureZinit_seg	structureaddcopyZ
init_modelZ
init_chainparentidZinit_residueZ
child_listAttributeError)r   Z
pdb_objectr   Zsbchain_idZog_chain_idr   r   r   set_structure>   s8    









zStructureIO.set_structureN)r   r   r   r   r   r&   r   r   r   r   r   7   s   r   c               @   s4   e Zd ZdZdddZdddZed	dfd
dZdS )PDBIOa  Write a Structure object (or a subset of a Structure object) as a PDB or PQR file.

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


    r   Fc             C   s   || _ || _dS )zCreate the PDBIO object.

        :param use_model_flag: if 1, force use of the MODEL record in output.
        :type use_model_flag: int
        :param is_pqr: if True, build PQR file. Otherwise build PDB file.
        :type is_pqr: Boolean
        N)use_model_flagis_pqr)r   r(   r)   r   r   r   r      s    zPDBIO.__init__  c
             C   s  |dkrd}
nd}
|j rT|j   }| tkrH|dkrHtd|j  |d}nd}|  }t|dk r|d	d
 	 rt| dk rd| }|
 }| \}}}| js| }| }n| }| }| js~yd| }W nf tk
rP   |d	kr6d}dd	l}ddlm} |d| f | ntd|| f d	Y nX |
|||||||||||||||	f}t| S yd| }W nf tk
r   |d	krd}dd	l}ddlm} |d| f | ntd|| f d	Y nX yd| }W nf tk
rd   |d	krJd}dd	l}ddlm} |d| f | ntd|| f d	Y nX |
|||||||||||||f}t| S d	S )z$Return an ATOM PDB string (PRIVATE).r   ZHETATMzATOM  XzUnrecognised element %r   z     Nr	   z%6.2fz      r   )BiopythonWarningz-Missing occupancy in atom %r written as blankzInvalid occupancy %r in atom %rz%7.4fz       z*Missing charge in atom %r written as blankzInvalid charge %r in atom %rz%6.4fz*Missing radius in atom %r written as blankzInvalid radius %r in atom %r)elementstripupper
capitalizer   
ValueErrorrjustZget_fullnamelenisalphaZ
get_altlocZ	get_coordr)   Zget_bfactorZget_occupancyZ
get_radiusZ
get_charge	TypeErrorwarningsZBior.   warnZget_full_id_ATOM_FORMAT_STRING_PQR_ATOM_FORMAT_STRING)r   r   hetfieldsegidatom_numberresnameresseqicoder%   ZchargeZrecord_typer/   nameZaltlocxyzZbfactorZ	occupancyZradiusZ
pqr_chargeZoccupancy_strr8   r.   argsr   r   r   _get_atom_line   s    ,









zPDBIO._get_atom_lineTc             C   s  | j }t|tr t|d}d}n|}d}t| jdks<| jrBd}nd}xl| j D ]\}	||	sfqTd}
|srd}|r|	d|	j
  x|	 D ]}||sq| }d}x| D ]}||sq| \}}}| }| }x| D ]}||rd}d}
|rL| }yt|}W n( tk
rJ   tt| dY nX |||||||||}|	| |s|d7 }qW qW |r|	d|||||f  qW |rT|
rT|	d qTW |r|	d |r|  d	S )
aC  Save structure to a file.

        :param file: output file
        :type file: string or filehandle

        :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.

        Typically select is a subclass of L{Select}.
        wr	   r   zMODEL      %s
z is not a number.Atom serial numbers must be numerical If you are converting from an mmCIF structure, try using preserve_atom_numbering=FalsezQTER   %5i      %3s %c%4i%c                                                      
zENDMDL
zEND   
N)rG   
isinstancestropenr5   r   r(   Zget_listr   writeZ
serial_numr   Zget_idZget_unpacked_listr   Zget_resnameZ	get_segidr   Zget_serial_numberintr3   reprclose)r   fileZselectZ	write_endZpreserve_atom_numberingZget_atom_linefpZ
close_fileZ
model_flagr
   Zmodel_residues_writtenr>   r   r%   Zchain_residues_writtenr   r<   r@   rA   r?   r=   r   sr   r   r   save"  sz    







z
PDBIO.saveN)r   F)r*   )r   r   r   r   r   rG   _selectrS   r   r   r   r   r'   q   s
   

 	r'   N)r   ZBio.PDB.StructureBuilderr   ZBio.Data.IUPACDatar   r:   r;   r   rT   r   r'   r   r   r   r   <module>   s   :