
     i>                     p    d Z ddlZddlmZ  G d dej                  Z G d dej                  Zd	 ZdS )
a  OpenMM structure I/O --- :mod:`MDAnalysis.converters.OpenMM`
================================================================


Read coordinates data from a
`OpenMM <http://docs.openmm.org/latest/api-python/generated/openmm.app.simulation.Simulation.html#openmm.app.simulation.Simulation>`_
:class:`openmm.app.simulation.Simulation` with :class:`OpenMMReader`
into a MDAnalysis Universe.

Also converts other objects within the
`OpenMM Application Layer <http://docs.openmm.org/latest/api-python/app.html>`_:

- `openmm.app.pdbfile.PDBFile <http://docs.openmm.org/latest/api-python/generated/openmm.app.pdbfile.PDBFile.html#openmm.app.pdbfile.PDBFile>`_
- `openmm.app.modeller.Modeller <http://docs.openmm.org/latest/api-python/generated/openmm.app.modeller.Modeller.html#openmm.app.modeller.Modeller>`_
- `openmm.app.pdbxfile.PDBxFile <http://docs.openmm.org/latest/api-python/generated/openmm.app.pdbxfile.PDBxFile.html#openmm.app.pdbxfile.PDBxFile>`_

Example
-------
OpenMM can read various file formats into OpenMM objects.
MDAnalysis can then convert some of these OpenMM objects into MDAnalysis Universe objects.

    >>> import openmm.app as app
    >>> import MDAnalysis as mda
    >>> from MDAnalysis.tests.datafiles import PDBX
    >>> pdbxfile = app.PDBxFile(PDBX)
    >>> mda.Universe(pdbxfile)
    <Universe with 60 atoms>



Classes
-------

.. autoclass:: OpenMMSimulationReader
   :members:

.. autoclass:: OpenMMAppReader
   :members:


    N   )basec                   H    e Zd ZdZdZddddddZed	             Zd
 Zd Z	dS )OpenMMSimulationReaderzGReader for OpenMM Simulation objects


    .. versionadded:: 2.0.0
    OPENMMSIMULATIONpsnmznm/pszkJ/(mol*nm)zkJ/mol)timelengthvelocityforceenergyc                     	 ddl m} t          | |          S # t          $ r 	 ddlm} Y dS # t          $ r Y Y dS w xY ww xY w)Can this reader read *thing*?r   )
SimulationFN)
openmm.appr   
isinstanceImportErrorsimtk.openmm.app)thingr   s     f/srv/www/vhosts/g4struct/public_html/venv/lib/python3.11/site-packages/MDAnalysis/converters/OpenMM.py_format_hintz#OpenMMSimulationReader._format_hintX   s    	1------ eZ000  	 	 	777777777   uuu	s    
?,
;?;?c                 >   | j         j                                        | _        |                                 | _        | j        r|                     | j        j                   |                     | j        j	        d          | j        _	        t          | j        j        dd                    | j        j        dd <   |                     | j        j                   |                     | j        j                   |                     | j        j                   d S d S NF)inplace   )filenametopologygetNumAtomsn_atoms_mda_timestep_from_omm_contexttsconvert_unitsconvert_pos_from_native_postriclinic_dimensions_sanitize_box_angles
dimensionsconvert_velocities_from_native_velocitiesconvert_forces_from_native_forcesconvert_time_from_nativedtselfs    r   _read_first_framez(OpenMMSimulationReader._read_first_framee   s   }-99;;5577 
	6((666+/+G+G,e ,H , ,DG( &:"122&& &DGqrr" //0CDDD++DGO<<<))$'*55555
	6 
	6    c                    	 ddl m} n# t          $ r	 ddlm} Y nw xY w| j        j                            dddd          }| j        j                                                                        } | j	        |fi | j
        }d|_        |                                j        |j        d<   |                                                    |j        |j        z            j        |j        d<   |                                                    |j        |j        z            j        |j        d<   |                    d	          j        |_        t-          |j        d
d                   |j        d
d<   |                    d	          j        |_        |                    d	          j        |_        |                    d	          j        |_        |S )z-Construct Timestep object from OpenMM contextr   NT)getVelocities	getForces	getEnergyr
   potential_energykinetic_energy)asNumpyr   )openmm.unitunitr   
simtk.unitr   contextgetState	getSystemgetNumParticles	_Timestep
_ts_kwargsframegetTime_valuedatagetPotentialEnergyin_units_of	kilojoulemolegetKineticEnergygetPeriodicBoxVectorsr&   r'   r(   getPositions	positionsr5   
velocitiesr6   forces)r0   ustater    r"   s        r   r!   z5OpenMMSimulationReader._mda_timestep_from_omm_contextv   s   	######## 	# 	# 	#""""""""	# %..ddd / 
 
 -'1133CCEET^G77t77--//0$$&&221;3GHHO 	"# ""$$00qv1EFFM 	 ! #("="= #> #
 #

 	 1qrr1BCCabb))$)77>++D+99@OODO118		s   	 N)
__name__
__module____qualname____doc__formatunitsstaticmethodr   r1   r!    r2   r   r   r   H   sy           F E 
1 
1 \
16 6 6"    r2   r   c                   B    e Zd ZdZdZdddZed             Zd Zd Z	d	S )
OpenMMAppReadera  Reader for OpenMM Application layer objects

    See also `the object definition in the OpenMM Application layer <http://docs.openmm.org/latest/api-python/generated/openmm.app.simulation.Simulation.html#openmm.app.simulation.Simulation>`_

    .. versionadded:: 2.0.0
    	OPENMMAPPr   r	   )r
   r   c                     	 ddl m} t          | |j        |j        |j        f          S # t          $ r 	 ddlm} Y dS # t          $ r Y Y dS w xY ww xY w)r   r   )appFN)openmmr`   r   PDBFileModellerPDBxFiler   simtk.openmm)r   r`   s     r   r   zOpenMMAppReader._format_hint   s    	P"""""" eck3<%NOOO  	 	 	,,,,,,,,,   uuu	s$   * 
A>
AAAAc                    | j         j                                        | _        |                                 | _        | j        r|                     | j        j                   | j        j	        _|                     | j        j
        d          | j        _
        t          | j        j	        dd                    | j        j	        dd <   d S d S d S r   )r   r   r   r    _mda_timestep_from_omm_appr"   r#   r$   r%   r(   r&   r'   r/   s    r   r1   z!OpenMMAppReader._read_first_frame   s    }-99;;1133 	((666w!-/3/K/KG0% 0L 0 0, *>G&qrr** *"122&&&	 	--r2   c                    | j         }|j                                        } | j        |fi | j        }d|_        |j                                        [t          j        |j                                        j	                  |_
        t          |j        dd                   |j        dd<   t          j        |                                j	                  |_        |S )z8Construct Timestep object from OpenMM Application objectr   Nr   )r   r   r   rB   rC   rD   rM   nparrayrF   r&   r'   r(   rN   rO   )r0   
omm_objectr    r"   s       r   rg   z*OpenMMAppReader._mda_timestep_from_omm_app   s     ]
%1133T^G77t774466B&(h#99;;B' 'B# !5R]1225F G GBM!""x
 7 7 9 9 @AA	r2   N)
rT   rU   rV   rW   rX   rY   rZ   r   r1   rg   r[   r2   r   r]   r]      sl          FT**E
P 
P \
P      r2   r]   c                 `    d| z
  }t          j        t          j        | |g          d          S )zEnsure box angles correspond to first quadrant

    See `discussion on unitcell angles <https://github.com/MDAnalysis/mdanalysis/pull/2917/files#r620558575>`_
       r   )axis)ri   minrj   )anglesinverteds     r   r'   r'      s1    
 V|H6"(FH-..Q7777r2   )	rW   numpyri   coordinatesr   SingleFrameReaderBaser   r]   r'   r[   r2   r   <module>ru      s   0( (V          L L L L LT7 L L L^6 6 6 6 6d0 6 6 6r8 8 8 8 8r2   