
:>"^ü*  ã               @   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	 m
 Z
 d d l m Z m Z d d l m Z d d	 l m Z Gd
 d „  d e ƒ Z d S)zgConsumer class that builds a Structure object.

This is used by the PDBParser and MMCIFparser classes.
é    N)Ú	Structure)ÚModel)ÚChain)ÚResidueÚDisorderedResidue)ÚAtomÚDisorderedAtom)ÚPDBConstructionException)ÚPDBConstructionWarningc               @   sÓ   e  Z d  Z d Z d d „  Z d d „  Z d d „  Z d d	 „  Z d
 d „  Z d d d „ Z	 d d „  Z
 d d „  Z d d „  Z d d d d „ Z d d „  Z d d „  Z d d „  Z d d „  Z d d  „  Z d S)!ÚStructureBuilderz¢Deals with constructing the Structure object.

    The StructureBuilder class is used by the PDBParser classes to
    translate a file to a Structure object.
    c             C   s   d |  _  i  |  _ d S)zInitialize the class.r   N)Úline_counterÚheader)Úself© r   ú=/tmp/pip-build-ww9dw3qa/biopython/Bio/PDB/StructureBuilder.pyÚ__init__   s    	zStructureBuilder.__init__c             C   s=   | j  ƒ  } x* | D]" } | j ƒ  } | d k r d Sq Wd S)zGReturn 1 if all atoms in the residue have a non blank altloc (PRIVATE).ú r   é   )Zget_unpacked_listZ
get_altloc)r   ÚresidueZ	atom_listÚatomÚaltlocr   r   r   Ú_is_completely_disordered$   s    z*StructureBuilder._is_completely_disorderedc             C   s   | |  _  d S)zSet header.N)r   )r   r   r   r   r   Ú
set_header/   s    zStructureBuilder.set_headerc             C   s   | |  _  d S)zmTracks line in the PDB file that is being parsed.

        Arguments:
         - line_counter - int

        N)r   )r   r   r   r   r   Úset_line_counter3   s    z!StructureBuilder.set_line_counterc             C   s   t  | ƒ |  _ d S)zeInitialize a new Structure object with given id.

        Arguments:
         - id - string

        N)r   Ú	structure)r   Zstructure_idr   r   r   Úinit_structure<   s    zStructureBuilder.init_structureNc             C   s)   t  | | ƒ |  _ |  j j |  j ƒ d S)zvCreate a new Model object with given id.

        Arguments:
         - id - int
         - serial_num - int

        N)r   Úmodelr   Úadd)r   Zmodel_idZ
serial_numr   r   r   Ú
init_modelE   s    zStructureBuilder.init_modelc             C   sh   |  j  j | ƒ rB |  j  | |  _ t j d | |  j f t ƒ n" t | ƒ |  _ |  j  j |  j ƒ d S)zcCreate a new Chain object with given id.

        Arguments:
         - chain_id - string

        z.WARNING: Chain %s is discontinuous at line %i.N)	r   Úhas_idÚchainÚwarningsÚwarnr   r
   r   r   )r   Zchain_idr   r   r   Ú
init_chainP   s    
zStructureBuilder.init_chainc             C   s   | |  _  d S)zOFlag a change in segid.

        Arguments:
         - segid - string

        N)Úsegid)r   r$   r   r   r   Úinit_segb   s    zStructureBuilder.init_segc       	      C   sø  | d k r" | d k r" d | } | | | f } | d k rÉ|  j  j | ƒ rÉt j d | | | |  j f t ƒ |  j  | } | j ƒ  d k rë | j | ƒ r¹ | |  _ | j	 | ƒ qÉt
 | | |  j ƒ } | j | ƒ | |  _ d SnÞ | | j k r-t j d | | | | |  j f t ƒ | |  _ d S|  j | ƒ sad |  _ t d | | | | f ƒ ‚ |  j  j | ƒ t
 | | |  j ƒ } t | ƒ } |  j  j | ƒ | j | ƒ | j | ƒ | |  _ d St
 | | |  j ƒ |  _ |  j  j |  j ƒ d S)	a  Create a new Residue object.

        Arguments:
         - resname - string, e.g. "ASN"
         - field - hetero flag, "W" for waters, "H" for
           hetero residues, otherwise blank.
         - resseq - int, sequence identifier
         - icode - string, insertion code

        r   ÚHZH_z7WARNING: Residue ('%s', %i, '%s') redefined at line %i.é   NzVWARNING: Residue ('%s', %i, '%s','%s') already defined with the same name at line  %i.z6Blank altlocs in duplicate residue %s ('%s', %i, '%s'))r    r   r!   r"   r   r
   Úis_disorderedZdisordered_has_idr   Zdisordered_selectr   r$   Údisordered_addÚresnamer   r	   Údetach_childr   r   )	r   r*   ÚfieldZresseqZicodeZres_idZduplicate_residueZnew_residueZdisordered_residuer   r   r   Úinit_residuek   sR    
					zStructureBuilder.init_residuec	          	   C   s  |  j  }	 |	 d k r d S|	 j | ƒ rp |	 | }
 |
 j ƒ  } | | k rp | } t j d | | |  j f t ƒ t | | | | | | | | ƒ |  _ | d k r{|	 j | ƒ rE|	 | }
 |
 j	 ƒ  d k rÞ |
 j
 |  j ƒ qx|	 j | ƒ t | ƒ } |	 j | ƒ | j
 |  j ƒ | j
 |
 ƒ |	 j ƒ  t j d |  j t ƒ q‹t | ƒ } |	 j | ƒ | j
 |  j ƒ |	 j ƒ  n |	 j |  j ƒ d S)aÈ  Create a new Atom object.

        Arguments:
         - name - string, atom name, e.g. CA, spaces should be stripped
         - coord - Numeric array (Float0, size 3), atomic coordinates
         - b_factor - float, B factor
         - occupancy - float
         - altloc - string, alternative location specifier
         - fullname - string, atom name including spaces, e.g. " CA "
         - element - string, upper case, e.g. "HG" for mercury

        Nz6Atom names %r and %r differ only in spaces at line %i.r   r'   zAWARNING: disordered atom found with blank altloc before line %i.
)r   r   Úget_fullnamer!   r"   r   r
   r   r   r(   r)   r+   r   r   Zflag_disordered)r   ÚnameZcoordZb_factorZ	occupancyr   ÚfullnameZserial_numberÚelementr   Zduplicate_atomZduplicate_fullnameZdisordered_atomr   r   r   Ú	init_atom³   sD    	
!


zStructureBuilder.init_atomc             C   s   |  j  j | ƒ d S)z)Set anisotropic B factor of current Atom.N)r   Ú
set_anisou)r   Zanisou_arrayr   r   r   r3     s    zStructureBuilder.set_anisouc             C   s   |  j  j | ƒ d S)z?Set standard deviation of anisotropic B factor of current Atom.N)r   Ú
set_siguij)r   Zsiguij_arrayr   r   r   r4     s    zStructureBuilder.set_siguijc             C   s   |  j  j | ƒ d S)z8Set standard deviation of atom position of current Atom.N)r   Ú
set_sigatm)r   Zsigatm_arrayr   r   r   r5     s    zStructureBuilder.set_sigatmc             C   s   |  j  |  j _  |  j S)zReturn the structure.)r   r   )r   r   r   r   Úget_structure  s    zStructureBuilder.get_structurec             C   s   d S)zSet symmetry.Nr   )r   Z
spacegroupÚcellr   r   r   Úset_symmetry  s    zStructureBuilder.set_symmetry)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r   r   r   r#   r%   r-   r2   r3   r4   r5   r6   r8   r   r   r   r   r      s"   			PLr   )r<   r!   ZBio.PDB.Structurer   ZBio.PDB.Modelr   ZBio.PDB.Chainr   ZBio.PDB.Residuer   r   ZBio.PDB.Atomr   r   ZBio.PDB.PDBExceptionsr	   r
   Úobjectr   r   r   r   r   Ú<module>	   s   