
     i~                     l   d Z ddlZddlm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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mZ  G d dej                  Z G d de          Z d Z!d Z"d Z#d Z$d Z%d Z&d Z'd Z(d Z)d)dZ*d Z+d Z,d Z-d Z.d  Z/d! Z0d" Z1d# Z2d$ Z3d% Z4d& Z5d' Z6d( Z7dS )*aE  
Utilities for the TPRParser
===========================

Function calling order::

   (TPRParser.py call do_mtop)
   do_mtop -> do_symtab
           -> do_ffparams -> do_iparams
           -> do_moltype  -> do_atoms  -> do_atom
                                       -> do_resinfo
                          -> do_ilists
                          -> do_block
                          -> do_blocka
           -> do_molblock

Then compose the stuffs in the format :class:`MDAnalysis.Universe` reads in.

The module also contains the :func:`do_inputrec` to read the TPR header with.
    N)xdrlib   )obj)setting   )	squash_by   )Topology)Atomids	Atomnames	AtomtypesMassesChargesElementsResidsResnamesMoltypesMolnumsSegidsChainIDsBondsAngles	Dihedrals	Impropersc                   |     e Zd ZdZ fdZed             Zej        d             Zd Zd Z	d Z
d Zd	 Zd
 Z xZS )TPXUnpackerzL
    Extend the standard XDR unpacker for the specificity of TPX files.
    c                 |    t                                          |           |                                 | _        d S N)super__init__
get_buffer_buf)selfdata	__class__s     g/srv/www/vhosts/g4struct/public_html/venv/lib/python3.11/site-packages/MDAnalysis/topology/tpr/utils.pyr    zTPXUnpacker.__init__R   s0    OO%%			    c                 *    |                                  S r   )get_positionr#   s    r&   _poszTPXUnpacker._posY   s      """r'   c                 0    |                      |           d S r   )set_position)r#   values     r&   r+   zTPXUnpacker._pos]   s    %     r'   c                     | j         }||z   x}| _         | j        ||         }t          |          |k    rt          t	          j        ||          d         S Nr   )r+   r"   lenEOFErrorstructunpack)r#   	item_sizestruct_templatestart_positionend_positioncontents         r&   _unpack_valuezTPXUnpacker._unpack_valuea   sX    #1I#==ty)N<78w<<9$$N}_g66q99r'   c                 .    |                      dd          S )N   z>qr:   r*   s    r&   unpack_int64zTPXUnpacker.unpack_int64i       !!!T***r'   c                 .    |                      dd          S )Nr<   z>Qr=   r*   s    r&   unpack_uint64zTPXUnpacker.unpack_uint64l   r?   r'   c                 *    |                                  S r   )unpack_uintr*   s    r&   unpack_ushortzTPXUnpacker.unpack_ushorto   s    !!!r'   c                 .    |                      dd          S )N   z>Ir=   r*   s    r&   unpack_ucharzTPXUnpacker.unpack_ucharr        !!!T***r'   c                 R    |                                   |                                 S )aE  
        Emulate gmx_fio_do_string

        gmx_fio_do_string reads a string from a XDR file. On the contrary to the
        python unpack_string, gmx_fio_do_string reads the size as an unsigned
        integer before reading the actual string.

        See <gromacs-2016-src>/src/gromacs/fileio/gmx_system_xdr.c:454
        )
unpack_intunpack_stringr*   s    r&   	do_stringzTPXUnpacker.do_stringw   s&     	!!###r'   )__name__
__module____qualname____doc__r    propertyr+   setterr:   r>   rA   rD   rG   rL   __classcell__)r%   s   @r&   r   r   N   s         & & & & & # # X# 
[! ! [!: : :+ + ++ + +" " "+ + +
$ $ $ $ $ $ $r'   r   c                   @    e Zd ZdZed             Zd Zd Zd Zd Z	dS )TPXUnpacker2020a!  
    Unpacker for TPX files from and later than gromacs 2020.

    A new implementation of the serializer (InMemorySerializer), introduced in
    gromacs 2020, changes le meaning of some types in the file body (the header
    keep using the previous implementation of the serializer).
    c                 $    | |                                           }|                                |_        t          |d          rI|j        |j        k    r|j        |_        n,|j        |j        k    r|j        |_        nt          d          |S )Nunpack_realzUnrecognized precision)r!   r)   r+   hasattrrW   unpack_floatunpack_double
ValueError)clsunpackernew_unpackers      r&   from_unpackerzTPXUnpacker2020.from_unpacker   s    s8..0011$11338]++ 	;#x'<<<+7+D((%)???+7+E(( !9:::r'   c                     |dk     rt          d          | j        }||z   x}| _        |t          | j                  k    rt          | j        ||         }|S )Nr   z#Size of fstring cannot be negative.)r[   r+   r1   r"   r2   )r#   nr7   r8   r9   s        r&   unpack_fstringzTPXUnpacker2020.unpack_fstring   s`    q55BCCC#1A#55ty#di..((N)N<78r'   c                 .    |                      dd          S )Nr   z>Hr=   r*   s    r&   rD   zTPXUnpacker2020.unpack_ushort   rH   r'   c                 .    |                      dd          S )Nr   z>Br=   r*   s    r&   rG   zTPXUnpacker2020.unpack_uchar   rH   r'   c                 T    |                                  }|                     |          S )z+
        Emulate gmx_fio_do_string
        )rA   rb   )r#   ra   s     r&   rL   zTPXUnpacker2020.do_string   s)       ""1%%%r'   N)
rM   rN   rO   rP   classmethodr_   rb   rD   rG   rL    r'   r&   rU   rU      su          
 
 [
  + + +
+ + +
& & & & &r'   rU   c                 :      fdt          |          D             S )$mimic of gmx_fio_ndo_real in gromacsc                 8    g | ]}                                 S rg   rJ   .0ir$   s     r&   
<listcomp>zndo_int.<locals>.<listcomp>   s#    000!DOO000r'   ranger$   ra   s   ` r&   ndo_intrs      s#    0000uQxx0000r'   c                 :      fdt          |          D             S )ri   c                 8    g | ]}                                 S rg   rW   rl   s     r&   ro   zndo_real.<locals>.<listcomp>   s%    1111D111r'   rp   rr   s   ` r&   ndo_realrw      s#    1111a1111r'   c                 L    |                      t          j        | j                  S r   unpack_farrayr   DIMrW   r$   s    r&   do_rvecr}      s    gk4+;<<<r'   c                 :      fdt          |          D             S )$mimic of gmx_fio_ndo_rvec in gromacsc                 Z    g | ]'}                     t          j        j                  (S rg   ry   rl   s     r&   ro   zndo_rvec.<locals>.<listcomp>   s.    PPP!Dw{D,<==PPPr'   rp   rr   s   ` r&   ndo_rvecr      s#    PPPPuQxxPPPPr'   c                 :      fdt          |          D             S )r   c                 Z    g | ]'}                     t          j        j                  (S rg   )rz   r   r{   rJ   rl   s     r&   ro   zndo_ivec.<locals>.<listcomp>   s-    OOODw{DO<<OOOr'   rp   rr   s   ` r&   ndo_ivecr      s#    OOOOeAhhOOOOr'   c                 H    | t           j        vrt          d|  d          d S )NzYour tpx version is z*, which this parser does not support, yet )r   SUPPORTED_VERSIONSNotImplementedError)fvers    r&   fileVersion_errr      s8    7---!S4SSS
 
 	
 .-r'   c                 v    | dk    r|j         |_        dS | dk    r|j        |_        dS t          d|            )zFDefine an unpack_real method of data based on the float precision usedrF   r<   zunsupported precision: N)rY   rW   rZ   r[   )precr$   s     r&   define_unpack_realr      sM    qyy,	-9499:::r'   c                    |                                  }|                    d          st          d          |                                 }t	          ||            |                                 }t          |           d|cxk    rdk    r+n n(|                                  |                                  }|dk    r|                                 nd}|dk    r|                                  nt          j        }|                                 }|dk    r|                                 nd}|d	k     r(|                                  |                                  |dk    r|                                 nd}|                                 }	|                                 }
|                                 }|                                 }|                                 }|                                 }|                                 }d
}|t          j	        k    r|dk    r| 
                                }t          j        |||||||||	|
||||||          }|S )zCthis function is now compatible with do_tpxheader in tpxio.cpp
    s   VERSIONz$Input does not look like a TPR file.M   O      r   Q      >   N   )rL   
startswithr[   rJ   r   r   r   TPX_TAG_RELEASErW   tpxv_AddSizeFieldr>   r   	TpxHeader)r$   ver_str	precisionfileVersionfile_tagfileGenerationnatomsngtc	fep_statelambbIrbTopbXbVbFbBoxsizeOfTprBodyths                     r&   read_tpxheaderr      sH    nnGj)) A?@@@!!Iy$'''//##KK   
 
[B>>##*5*;*;T__&&&N $/"#4#4t~~':QH__F +r 1 14??qDR%0B%6%6!!!AI D
//

C??D			B			B			B??DMg///Nb4H4H))++	w	;y$D"b"dM
C 
CB Ir'   c                     t          | t          j                  }t          | t          j                  }t          | t          j                  }t          j        |||          S r   )r   r   r{   r   Box)r$   r   boxbox_relbox_vs        r&   extract_box_infor     sI    
4
%
%CtW[))GT7;''E73'''r'   FrF   c                    t          |           }t          | |           t          | |          }|                                 }g }t	          |          D ](}t          | ||          }	|                    |	           )|                                 }
t          j        |||
          }g }g }g }g }g }g }g }g }g }g }g }g }g }g }g }g }d}d}d}t	          |j	                  D ]}t          |           }|j        |j                 j                            d          }d| d| } |d d         dk    r
|dd          n|}!t	          |j                  D ]T}"|j        |j                 }#|#j        D ]c}$|                    |$j        |z              |                    |            |                    |!           |                    |$j        |z              |                    |$j                                                   |                    |$j                                                   |                    |$j                                                   |                    |           |                    |           |                    |$j                   |                    |$j                   |                    |$j                   e|dz  }|                    |#                    |                     |                    |#                    |                     |                    |#                    |                     |                    |#                    |                     ||#                                z  }||#                                z  }Vt?          tA          j!        |t@          j"                            }tG          tA          j!        |tH                              }tK          tA          j!        |tH                              }tM          tA          j!        |t@          j'                            }tQ          tA          j!        |t@          j'                            }tA          j!        |tH                    }tA          j!        |t@          j"                  }tA          j!        |tH                    }tA          j!        |tH                    }tA          j!        |t@          j"                  }|r|dz  }tA          j!        |tH                    }tS          |||||          \  }%}&\  }'}(})}*tU          |&          }+tW          |'          },tY          |(          }-t[          |)          }.tS          |*          d d	         \  }/}0t]          |0          }t_          |          }ta          tc          |          tc          |&          tc          |0          ||||||+|,|-|.||g|%|/
          }1|12                    tg          d |D                                  |12                    ti          d |D                                  |12                    tk          d |D                                  |12                    tm          d |D                                  to          |          r=tq          tA          j!        |tH                              }|12                    |           |j9        }2|dk    rd}3|                                 }4|dk     r<t	          d|2z  tu          |dz            z            D ]}|                                  |dk     r)t	          |2dz             D ]}|                                  d|cxk     rdk    r?n n<t	          |2tu          |dz            z  d	z            D ]}|                                  |dk    r| ;                                }5d|cxk     rdk     r,n n)t	          d	|2z            D ]}|                                  |dk    ra|                                 }6|                                 }7|7d	z  }8t	          |6          D ]$}t	          |8          D ]}"ty          | d           %t	          |3          D ]&}|                                 }9t{          | |9           '|                                 }:t	          |:          D ]}|                                  t	          |3          D ]B}|                                 };|;dk    r&t	          |;          D ]}| ;                                 C|dk    r8|                                 }<t{          | |<           |                                 }=|dk    r&t	          |=          D ]}|                                  |1S )Nr   zutf-8seg__   Protein_chain_r   )dtyper   )attrsatom_resindexresidue_segindexc                     g | ]}||S rg   rg   )rm   bonds     r&   ro   zdo_mtop.<locals>.<listcomp>  s    ???$????r'   c                     g | ]}||S rg   rg   )rm   angles     r&   ro   zdo_mtop.<locals>.<listcomp>  s     D D D5e D D D Dr'   c                     g | ]}||S rg   rg   )rm   dihedrals     r&   ro   zdo_mtop.<locals>.<listcomp>  ,     $1 $1 $1'/$1H $1 $1 $1r'   c                     g | ]}||S rg   rg   )rm   impropers     r&   ro   zdo_mtop.<locals>.<listcomp>  r   r'   :   
   t   r	   rF      S   w      )>	do_symtab	do_symstrdo_ffparamsrJ   rq   
do_moltypeappendr   Mtop	nmolblockdo_molblockmoltypes	molb_typenamedecode	molb_nmol	atomkindsidresidresnametypechargemasselement_symbolextendremap_bondsremap_angles
remap_dihe
remap_imprnumber_of_atomsnumber_of_residuesr   nparrayint32r   objectr   r   float32r   r   r   r   r   r   r   r   r
   r1   add_TopologyAttrr   r   r   r   anyr   atnrintrG   rw   rs   )>r$   r   tpr_resid_from_oner   symtab	ff_paramsnmoltyper   rn   moltyper   mtopbondsangles	dihedrals	impropersatomidssegidschainIDsresidsresnames	atomnames	atomtypesmolnumschargesmasseselementsatom_start_ndxres_start_ndxmolnummbmolblocksegidchainIDjmtatomkindresidx
new_residsnew_resnamesnew_moltypesnew_molnumsperres_segids
residueidsresiduenamesresidue_moltypesresidue_molnumssegidxperseg_segidstopr   SimulationAtomGroupType_sizen_atomsintermngridgrid_spacing
n_elements
group_sizen_group_namesn_grp_numbersim_excl_grp_size	mystery_ns>                                                                 r&   do_mtopr&  !  s	   t__FdFD$''I  HH8__ ! !T6400    !!I8Hh	22DEFIIGFHFHIIHGGFHNMF4>""  5  5 =.3::7CC%q%%8%%#+CRC=4D#D#D(233--(r|$$ 	5 	5Ar|,BL 9 9x{^;<<<e$$$(((hn}<=== 0 7 7 9 9:::  !5!5!7!7888  !5!5!7!7888)))v&&&x///hm,,, 78888aKF LL77888MM"//.99:::R]]>::;;;R]]>::;;;b00222NR22444MM1	54 bhwbh77788G"(9F;;;<<I"(9F;;;<<Ibhwbj999::GBHV2:66677Fx///Hhwbh///GXfF+++Fx///HXfBH---F !x///H 
6	
 
VZl 
##JL))L--k**O%m44RaR8FMM""F!!H
GJM
 %  C( ?????@@AAA D DF D D DEEFFF $1 $1Y $1 $1 $1 2 2 3 3 3 $1 $1Y $1 $1 $1 2 2 3 3 3 8}} 'BHXV<<<==X&&& >Drzz (*$//###::1t8c)a-&8&8899 " "!!!!#:: 4!8__ " "!!!!?????????4#i!m"4"44q899 " "!!!!"99&&((F????s?????1t8__ " "!!!!"99OO%%E??,,L%*J5\\ & &z** & &AT1%%%%&344 	& 	&A**JD*%%%%))}%% 	 	AOO344 	( 	(A OO--M!!}-- ( (A%%''''#::#00D*+++ ))I3;;
 9%% " "!!!!Jr'   c                 :    |                                  }||         S r   rk   )r$   r   ndxs      r&   r   r     s    
//

C#;r'   c                     |                                  }g }t          |          D ]+}|                                 }|                    |           ,|S r   )rJ   rq   rL   r   )r$   	symtab_nrr   rn   r  s        r&   r   r     sV    !!IF9  NNaMr'   c                    |                                  }|                                  }t          | |          }|dk    r|                                 nd}|                                 }t	          t          |                    D ]?}t          j        D ]0}||d         k     r"||         |d         k    r||xx         dz  cc<   1@t          | ||           t          j
        |||||          }	|	S )NB   g      (@r   r   )rJ   rs   rZ   rW   rq   r1   r   ftupd
do_iparamsr   Params)
r$   r   r   ntypesfunctypereppowfudgeQQrn   kparamss
             r&   r   r     s    ??D__FtV$$H%)RZZT!!!TF  G 3x==!! ! ! 	! 	!Aad{{x{ad22q 	!
 tXt$$$Zfh@@FMr'   c                     |                                   |                                   |                                   |                                   d S r   rv   r|   s    r&   do_harmr7    sP    r'   c                    t          |          D ]Y\  }}|t          j        t          j        t          j        t          j        t          j        t          j        fv rt          |            \|t          j	        fv rW| 
                                 | 
                                 |dk    r(| 
                                 | 
                                 |t          j        fv rR| 
                                 | 
                                 | 
                                 | 
                                 #|t          j        fv r*| 
                                 | 
                                 \|t          j        fv r| 
                                 | 
                                 | 
                                 | 
                                 | 
                                 | 
                                 | 
                                 | 
                                 |t          j        t          j        t          j        t          j        fv r>| 
                                 |                                  | 
                                 {|t          j        fv r>| 
                                 | 
                                 | 
                                 |t          j        fv rR| 
                                 | 
                                 | 
                                 | 
                                 )|t          j        fv r| 
                                 | 
                                 | 
                                 | 
                                 |dk    rP| 
                                 | 
                                 | 
                                 | 
                                 |t          j        fv r&| 
                                 t/          | d           |t          j        fv r>| 
                                 | 
                                 | 
                                 b|t          j        fv r| 
                                 | 
                                 | 
                                 |dk    r<| 
                                 | 
                                 | 
                                 |t          j        fv r>| 
                                 | 
                                 | 
                                 >|t          j        fv rO|t          j        fv r| 
                                 t|t          j        fv r>| 
                                 | 
                                 | 
                                 |t          j        fv rz| 
                                 | 
                                 | 
                                 | 
                                 | 
                                 | 
                                 J|t          j        fv rb| 
                                 | 
                                 | 
                                 |t          j         k     r| 
                                 |t          j!        fv r*| 
                                 | 
                                 |t          j"        fv rR| 
                                 | 
                                 | 
                                 | 
                                 U|t          j#        fv rf| 
                                 | 
                                 | 
                                 | 
                                 | 
                                 |t          j$        fv rR| 
                                 | 
                                 | 
                                 | 
                                 +|t          j%        t          j&        t          j'        t          j(        fv rf| 
                                 | 
                                 | 
                                 | 
                                 |                                  |t          j)        fv rX| 
                                 | 
                                 |dk    r(| 
                                 | 
                                 	(|t          j*        fv rz|                                  |                                  | 
                                 | 
                                 | 
                                 | 
                                 	|t          j+        fv rz|                                  |                                  |                                  | 
                                 | 
                                 | 
                                 
:|t          j,        fv r|dk     r(|                                  |                                  | 
                                 | 
                                 | 
                                 |dk    r<| 
                                 | 
                                 | 
                                 
|t          j-        fv r>t]          |            t]          |            t]          |            t]          |            D|t          j/        fv rM|                                  t]          |            | 
                                 | 
                                 |t          j0        fv r<t/          | t          j1                   |dk    rt/          | t          j1                   |t          j2        fv r6t/          | t          j3                   t/          | t          j3                   0|t          j4        fv r6t/          | t          j3                   t/          | t          j3                   u|t          j5        t          j6        fv r*| 
                                 | 
                                 |t          j7        fv r*| 
                                 | 
                                 |t          j8        fv r|t          j9        t          j:        fv r| 
                                 3|t          j;        t          j<        t          j=        fv r*| 
                                 | 
                                 |t          j>        t          j?        t          j@        fv r>| 
                                 | 
                                 | 
                                 |t          jA        fv r*|                                  | 
                                 |t          jB        t          jC        t          jD        fv r|dk     rP| 
                                 | 
                                 | 
                                 | 
                                 | 
                                 | 
                                 | 
                                 | 
                                 | 
                                 |t          jE        fv r*|                                  |                                  8|t          jF        fv rIt          d|           d S )N   r      H   D   zunknown functype: )H	enumerater   F_ANGLESF_G96ANGLESF_BONDS
F_G96BONDS
F_HARMONICF_IDIHSr7  F_RESTRANGLESrW   F_LINEAR_ANGLESF_FENEBONDSF_RESTRBONDS
F_TABBONDSF_TABBONDSNCF_TABANGLES	F_TABDIHSrJ   F_CROSS_BOND_BONDSF_CROSS_BOND_ANGLESF_UREY_BRADLEYF_QUARTIC_ANGLESrw   F_BHAMF_MORSEF_CUBICBONDSF_CONNBONDSF_POLARIZATIONF_ANHARM_POLF_WATER_POLF_THOLE_POLtpxv_RemoveTholeRfacF_LJF_LJ14	F_LJC14_QF_LJC_PAIRS_NBF_PIDIHSF_ANGRES	F_ANGRESZF_PDIHSF_RESTRDIHSF_DISRESF_ORIRESF_DIHRESF_POSRESr}   
F_FBPOSRES	F_CBTDIHS
NR_CBTDIHSF_RBDIHS	NR_RBDIHS
F_FOURDIHSF_CONSTR
F_CONSTRNCF_SETTLEF_VSITE1F_VSITE2
F_VSITE2FDF_VSITE3
F_VSITE3FDF_VSITE3FADF_VSITE3OUT
F_VSITE4FDF_VSITE4FDNF_VSITENF_GB12F_GB13F_GB14F_CMAPF_ENNPOTr   )r$   	functypesr   r4  rn   s        r&   r.  r.  "  sC   )$$ l@ l@1g1OW/
 
 

 DMMMM7()))s{{  """  """7*+++7&'''7'((( 4!2
 
 
 OO7-...7.///7)***rzz  """  """  """  """7+,,,T17>"""7?###rzz  """  """  """7'(((7&'''7)***7'(((7&'''7&'''g222  """7<.  7>"""7$%%%7)***g.w
 
 
 OO7&'''s{{  """  """7#$$$OOOO7#$$$OOOOOO7#$$$byy!!!!!!rzz  """  """  """7#$$$DMMMDMMMDMMMDMMMM7%&&&OODMMM7$%%%T7-...s{{w12227#$$$T7,---T7,----7%&&&T7,---T7,----7#W%78887#$$$7#$$$7#W%78887#W%79LMMM7&(:G<OPPP7#$$$OO7>7>7>BBBbyy  """  """  """  """7>"""OOOO7#$$$ %&>1&>&>???
Fr'   c                    t          | |          }t          | ||          }g }t          |j                  D ]m\  }}|                    t          j        ||j        |         |j        |         |j	        |j
        |j	                 |j        |j        |j                             nt          | |          }g g g g f\  }	}
}}|D ]f}|j        dk    rWt          j        |j         }|j        }|j        dv r&|	t)          |                    |                    z  }	X|j        dv r&|
t)          |                    |                    z  }
|j        dv r&|t)          |                    |                    z  }|j        dv r&|t)          |                    |                    z  }|j        dk    rut-          |          dk    r|d         }|	||dz   g||dz   ggz  }	|                    |          }|D ]-}|d         }|	|d         |d         g|d         |d         ggz  }	.e	 h|	r|	nd }	|
r|
nd }
|r|nd }|r|nd }t          j        |||	|
||          }t1          |            t3          |            |S )	Nr   )BONDSG96BONDSMORSE
CUBICBONDS	CONNBONDSHARMONIC	FENEBONDSRESTRAINTPOTCONSTRCONSTRNCTABBONDS
TABBONDSNC)ANGLES	G96ANGLESCROSS_BOND_BONDCROSS_BOND_ANGLEUREY_BRADLEYQANGLESRESTRANGLES	TABANGLES)PDIHSRBDIHS	RESTRDIHSCBTDIHSFOURDIHSTABDIHS)IDIHSPIDIHSSETTLEr   r   )r   do_atomsr=  atomsr   r   AtomKindr   r   resindr   mq
atomnumber	do_ilistsnrInteractionKindikiatomsr   listprocessr1   MoleculeKinddo_block	do_blocka)r$   r   r   molname	atoms_objr   r4  ailistsr   r   dihsimprilistik_objias	base_atom
all_settlesettler   s                       r&   r   r     s   f%%G vt,,I I)/** 
 
1"N1Hqx(CCL	
 	
 		 		 		 		 tT""F !#BBE64 , ,8a<<(%(3F,C { 9 9 9 fnnS11222 != = = $v~~c22333 !8 8 8V^^C00111 333V^^C00111(( s88q== #AI"IM2"IM2 EE
 "(!4!4J",  $*1I	#AYq	2#AYq	2"  $EEE'VV4F!44TD!44TDw	5&$MMG
 TNNNdOOONr'   c           	         |                                  }|                                  }g }t          |          D ]'}t          | |          }|                    |           (fdt	          | |          D             }fdt	          | |          D             }	fdt	          | |          D             }
t          | ||          }t          j        ||||	|
||          S )Nc                      g | ]
}|         S rg   rg   rm   rn   r   s     r&   ro   zdo_atoms.<locals>.<listcomp>u  s    666q666r'   c                      g | ]
}|         S rg   rg   r  s     r&   ro   zdo_atoms.<locals>.<listcomp>w  s    111!F1I111r'   c                      g | ]
}|         S rg   rg   r  s     r&   ro   zdo_atoms.<locals>.<listcomp>x  s    2221VAY222r'   )rJ   rq   do_atomr   rs   
do_resinfor   Atoms)r$   r   r   r  nresr  rn   Ar   r   typeBr   s    `          r&   r  r  k  s    			B??DE2YY  D$Q 7666GD"$5$5666I1111wtR00111D2222b 1 1222E$d33H9UBdE9hGGGr'   c                     |dk     rfdt          | |          D             }nig }t          |          D ]W}|                    |                                                     |                                  |                                  X|S )N?   c                      g | ]
}|         S rg   rg   r  s     r&   ro   zdo_resinfo.<locals>.<listcomp>  s    ;;;!F1I;;;r'   )rs   rq   r   rJ   rG   )r$   r   r   r  r   rn   s    `    r&   r  r  ~  s    byy;;;;wtT':':;;;t 	  	 AOOF4??#4#45666OOOr'   c                    |                                  }|                                  }|                                  }|                                  }|                                 }|                                 }|                                 }|                                 }	|                                 }
t          j        ||||||||	|
	  	        S r   )rW   rD   rJ   r   Atom)r$   r   r  r  mBqBtpr  ptyper  r  s              r&   r  r    s    AA					B					B					B  EOOE__F""J8Aq"b"eUFJGGGr'   c                 2   g }g }g }t          t          j                  D ]}d}t          j        D ]}||d         k     r||d         k    rd}|r+|                    d           |                    d            Z|                                 }|                    |           g }	t          |          D ])}
|	                    |                                            *|                    |	           d t          |t          j        |          D             S )NFr   r   Tc                 B    g | ]\  }}}t          j        |||          S rg   )r   Ilist)rm   ra   itrn   s       r&   ro   zdo_ilists.<locals>.<listcomp>  s<       Ar1 		!R  r'   )rq   r   F_NREr-  r   rJ   zipinteraction_types)r$   r   r  r  posr  bClearr4  ra   l_rn   s              r&   r  r    s)   	BF
C7=!!   	 	Aad{{qAaDyy 
	IIaLLLMM$ !!AIIaLLLB1XX - -		$//++,,,,MM" B 96BB   r'   c                 R   |                                  }|                                  }|                                  }|                                  }|dk    rt          | |           |                                  }|dk    rt          | |           t          j        |||||          S r0   )rJ   r   r   Molblock)r$   r   r   molb_natoms_molmolb_nposres_xAmolb_nposres_xBs         r&   r   r     s    !!I!!Ioo''Ooo''O'''oo''O'''<	9o': : :r'   c                 ^    |                                  }t          | |dz              t          S Nr   )rJ   rs   r  )r$   block_nrs     r&   r  r    s*      HD(Q,Or'   c                     |                                  }|                                  }t          | |dz              t          | |           ||fS r  )rJ   rs   )r$   r  	block_nras      r&   r  r    sO      H!!ID(Q,D)Yr'   )FrF   )8rP   numpyr   
mda_xdrlibr   r3    r   r   baser   core.topologyr
   core.topologyattrsr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   Unpackerr   rU   rs   rw   r}   r   r   r   r   r   r   r&  r   r   r   r7  r.  r   r  r  r  r  r   r  r  rg   r'   r&   <module>r     s  : *                              % % % % % %                                   (4$ 4$ 4$ 4$ 4$&/ 4$ 4$ 4$n.& .& .& .& .&k .& .& .&b1 1 1
2 2 2
= = =Q Q Q
P P P

 
 
; ; ;7 7 7t( ( (S S S Sl      *  o o odT T TnH H H&	 	 	H H H  6: : :      r'   