
     iz"                         d Z ddlmZ ddlZddlZddlmZ ddlm	Z	 ddl
mZmZmZmZmZmZmZmZmZmZmZmZmZmZ dd	lmZ dd
lmZmZ d Z G d de          Z G d de          Z G d dej                   Z!dS )a  
MMTF Topology Parser
====================

Reads topology data from the `Macromolecular Transmission Format
(MMTF) format`_.  This should generally be a quicker alternative to PDB.

Makes individual models within the MMTF file available via the `models`
attribute on Universe.

.. versionadded:: 0.16.0
.. versionchanged:: 0.20.0
   Can now read files with optional fields missing/empty

.. versionchanged:: 2.0.0
   Aliased ``bfactors`` topologyattribute to ``tempfactors``.
   ``tempfactors`` is deprecated and will be removed in 3.0 (Issue #1901)
.. versionchanged:: 2.8.0
    Removed mass guessing (attributes guessing takes place now
    through universe.guess_TopologyAttrs() API).

Reads the following topology attributes:

Atoms:
 - altLoc
 - atom ID
 - tempfactor
 - bonds
 - charge
 - name
 - occupancy
 - type

Residues:
 - icode
 - resname
 - resid
 - resnum

Segments:
 - segid
 - model

 .. note::

    By default, masses will be guessed on Universe creation.
    This may change in release 3.0.
    See :ref:`Guessers` for more information.

Classes
-------

.. autoclass:: MMTFParser
   :members:

.. _Macromolecular Transmission Format (MMTF) format: https://www.rcsb.org/news/feature/65a1af31c76ca3abcc925d0c
    )defaultdictN   )base   )Topology)AltLocsAtomids	Atomnames	AtomtypesTempfactorsBondsChargesICodesOccupanciesResidsResnamesResnumsSegidsSegmentAttr)RangeSelection)dueDoic                 |    |                      d          rt          j        |           S t          j        |           S )Ngz)endswithmmtf
parse_gzipparse)fns    h/srv/www/vhosts/g4struct/public_html/venv/lib/python3.11/site-packages/MDAnalysis/topology/MMTFParser.py_parse_mmtfr!   l   s4    	{{4 r"""z"~~    c            	           e Zd ZdZdZ ee          Zd Zed         	                    d e
eddej                  f           dS )Modelsmodelsmodelc                 \     t          j         j        j                  } fd|D             S )a\  Models in this Universe.

        The MMTF format can define various models for a given structure. The
        topology (eg residue identity) can change between different models,
        resulting in a different number of atoms in each model.

        Returns
        -------
        A list of AtomGroups, each representing a single model.
        c                 `    g | ]*}                     d                     |                    +S )zmodel {})select_atomsformat).0iselfs     r    
<listcomp>z!Models.models.<locals>.<listcomp>   s5    KKKA!!*"3"3A"6"677KKKr"   )npuniquesegmentsr%   )r-   	model_idss   ` r    r%   zModels.modelsx   s3     Idm233	KKKKKKKKr"   UniverseN)__name__
__module____qualname__attrnamesingularr   listtransplantsr%   appendproperty__doc__ r"   r    r$   r$   s   sx        HH+d##KL L L 
""	88FD$??@    r"   r$   c                       e Zd ZdZdZd ZdS )ModelSelectionr&   r%   c                     t          j        t          |          t                    }|j        }t          | j        | j                  D ]"\  }}|||k    }|||k    z  }n||k    }||z  }#||         j        S )N)dtype)	r/   zeroslenboolr%   zipupperslowersr0   )r-   groupmaskvalsupperlowerthismasks          r    applyzModelSelection.apply   s    xE

$///|T[99 	 	LE5 5=DEM)5=HDDT{!!r"   N)r4   r5   r6   tokenfieldrO   r>   r"   r    r@   r@      s-        EE" " " " "r"   r@   c                   r    e Zd ZdZed             Z ej         ed          dd          d             Z	dS )	
MMTFParserMMTFc                 6    t          | t          j                  S )zBCan parser read *thing*?

        .. versionadded:: 1.0.0
        )
isinstancer   MMTFDecoder)things    r    _format_hintzMMTFParser._format_hint   s     %!1222r"   z10.1371/journal.pcbi.1005575zMMTF ParserzMDAnalysis.topology.MMTFParser)descriptionpathc                    t          | j        t          j                  r| j        nt	          | j                  fd}j        }j        }j        }g }t          t           |d                              }t          t           |d                              }t          t           |d                              }	|                    |||	g           t          j                  r(|                    t!          j                             n6|                    t!          t#          j        |          d                     j        r2|                    t)          d j        D                                  n&|                    t)          dg|z                       t          j                  r(|                    t-          j                             n&|                    t-          d	g|z                       t          j                  r(|                    t1          j                             n&|                    t1          d
g|z                       t3          j                  }
t7          |
j                                                  }t=          fdj        D                       }|                    |
||g           j         r2|                    tC          d j         D                                  n&|                    tC          dg|z                       j"        r(|                    tG          j"                             n(|                    tG          dg|z  d                     t#          j$        t#          j        j%                  j&                  }|                    tO          |                     d tQ          j)                  D             t#          j$        t#          j        |          fdj        D                       }t#          j$        t#          j        |          j*                  }d	}g }j        D ]q}j)        |         }|d         }tW          |d
d d         |d d d                   D ],\  }}||k    r||}}|                    ||z   ||z   f           -||         z  }rj,        StW          j,        d
d d         j,        d d d                   D ]&\  }}||k    r||}}|                    ||f           '|                    t[          |                     t]          ||||||          }|S )Nc              3   X   K   j         D ]}j        |         }||          D ]}|V  d S )N)group_type_list
group_list)rQ   r,   gvalmtops       r    
iter_atomsz$MMTFParser.parse.<locals>.iter_atoms   sR      )  OA&U8  CIIII r"   formalChargeListatomNameListelementListT)guessedc                 ^    g | ]*}|                     d d                                          +S   replacestripr+   ra   s     r    r.   z$MMTFParser.parse.<locals>.<listcomp>   B        FB//5577  r"   rk   r   r   c                 6    g | ]}j         |         d          S )	groupName)r_   )r+   r,   rb   s     r    r.   z$MMTFParser.parse.<locals>.<listcomp>   s%    KKKT_Q,KKKr"   c                 ^    g | ]*}|                     d d                                          +S ri   rl   ro   s     r    r.   z$MMTFParser.parse.<locals>.<listcomp>   rp   r"   SYSTEMc                 @    i | ]\  }}|t          |d                    S )re   )rD   )r+   r,   r`   s      r    
<dictcomp>z$MMTFParser.parse.<locals>.<dictcomp>  s8     
 
 
*.!QAs1^$%%
 
 
r"   c                      g | ]
}|         S r>   r>   )r+   r,   groupID_2_natomss     r    r.   z$MMTFParser.parse.<locals>.<listcomp>
  s    ???Qa ???r"   bondAtomListr   )atom_resindexresidue_segindexattrs)/rV   filenamer   rW   r!   	num_atoms
num_groups
num_chainsr   r9   r
   r   extendrD   atom_id_listr;   r	   r/   arangealt_loc_listr   b_factor_listr   occupancy_listr   r   group_id_listr   valuescopyr   r^   ins_code_listr   chain_name_listr   repeat
num_modelschains_per_modelr$   	enumerater_   groups_per_chainrF   bond_atom_listr   r   )r-   kwargsrc   natoms	nresidues	nsegmentsr|   chargesnamestypesresidsresnumsresnamesmodsresindexsegindexoffsetbondsgtyper`   bondlistxytoprx   rb   s                           @@r    r   zMMTFParser.parse   s    dmT%566 	.=DDt}--D	 	 	 	 	 O	O	 $zz*<==>>??$zz.99::;;$zz-8899::gue,--- t !! 	CLL!2334444 LL6!2!2DAAABBB 
	1LL #'#4       LL"//000t!"" 	4LLT%7889999LLaS6\22333t"## 	4LLT%899::::LLaS6\22333 *++&-,,..//KKKKd6JKKK
 
 	fgx0111  
	3LL #'#5       LLy 011222  	GLL 4556666 LL
Y 6EEEFFFy4?33T5JKKVD\\"""
 
2;DO2L2L
 
 
 9Ii  ????$*>???
 
 9RYy1143HII
 ) 		. 		.E&A(HHQTTNHSSqSM:: 7 71q55aqAa&j!f*56666&u--FF"*#ADqD)4+>sss+C  % %1 q55aqAaV$$$$U5\\""""%
 
 
 
r"   N)
r4   r5   r6   r*   staticmethodrY   r   dciter   r   r>   r"   r    rS   rS      s|        F3 3 \3 SY*++!-  
C C 
C C Cr"   rS   )"r=   collectionsr   r   numpyr/   rk   r   core.topologyr   core.topologyattrsr   r	   r
   r   r   r   r   r   r   r   r   r   r   r   core.selectionr   r   r   r!   r$   r@   TopologyReaderBaserS   r>   r"   r    <module>r      s  08 8r $ # # # # #            $ $ $ $ $ $                                 , + + + + +              [   2" " " " "^ " " "&S S S S S( S S S S Sr"   