
     i#                     r    d Z ddlZddlZddlZddlmZ ddlmc mZ ddlm	Z	  G d dej
                  ZdS )a  GAMESS trajectory reader --- :mod:`MDAnalysis.coordinates.GMS`
=================================================================

Resources: the GMS output format is a common output format for different
GAMESS distributions: US-GAMESS, Firefly (PC-GAMESS) and GAMESS-UK.

Current version was approbated with US-GAMESS & Firefly only.

There appears to be no rigid format definition so it is likely users
will need to tweak the :class:`GMSReader`.

.. autoclass:: GMSReader
   :members:

    N   )base)store_init_argumentsc                        e Zd ZdZdZdddZe fd            Zed             Z	d Z
ed	             Zd
 Zed             Zd Zd ZddZd Zd Zd Z xZS )	GMSReadera`  Reads from an GAMESS output file

    :Data:
        ts
          Timestep object containing coordinates of current frame

    :Methods:
        ``len(out)``
          return number of frames in out
        ``for ts in out:``
          iterate through trajectory

    Note
    ----
    :class:`GMSReader` can read both uncompressed (``foo.out``) and
    compressed (``foo.out.bz2`` or ``foo.out.gz``) files;
    decompression is handled on the fly


    .. versionchanged:: 0.11.0
       Frames now 0-based instead of 1-based.
       Added `dt` and `time_offset` keywords (passed to :class:`Timestep`).

    GMSpsAngstrom)timelengthc                     t          t          |           j        |fi | t          j        | j                  | _        d | _        d | _        d | _	        | 
                    d          | _        | j         | j        dvrt          d| j        z              | j
        | j        fi | j        | _        | j         |                                  d S )Nr   )optimizesurfacezWrong RUNTYP= )superr   __init__utilanyopenfilenameoutfile_n_atoms	_n_frames_runtyp	_TimesteptsruntypAttributeErrorn_atoms
_ts_kwargsn_frames_read_next_timestep)selfoutfilenamekwargs	__class__s      d/srv/www/vhosts/g4struct/public_html/venv/lib/python3.11/site-packages/MDAnalysis/coordinates/GMS.pyr   zGMSReader.__init__P   s    'i'>>v>>> |DM22
 ..## 	{555 !1DK!?@@@ $.AAAA 	  """""    c                     | j         | j         S 	 |                                 | _         | j         S # t          $ r Y dS w xY w)z!RUNTYP property of the GAMESS runNr   )r   _determine_runtypIOErrorr!   s    r%   r   zGMSReader.runtypl   sZ     <#<	 1133DL <  	 	 	11	   0 
>>c                     t          j        | j                  5 }|D ]B}t          j        d|          }|)|                    d                                          } nCd d d            n# 1 swxY w Y   |S )Nz^.*RUNTYP=([A-Z]+)\s+.*r   )r   openanyr   rematchgrouplowerr!   outlinemress        r%   r(   zGMSReader._determine_runtypx   s    \$-(( 	C  H7>>=''!****,,CE !	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 
s   AA,,A03A0c                     | j         | j         S 	 |                                 | _         | j         S # t          $ r Y dS w xY w)znumber of atoms in a frameNr   )r   _read_out_natomsr)   r*   s    r%   r   zGMSReader.n_atoms   sZ     =$= 	! 1133DM =   	 	 	11	r+   c                     t          j        | j                  5 }|D ]=}t          j        d|          }|$t          |                    d                    } n>d d d            n# 1 swxY w Y   |S )Nz*\s*TOTAL NUMBER OF ATOMS\s*=\s*([0-9]+)\s*r   )r   r-   r   r.   r/   intr0   r2   s        r%   r8   zGMSReader._read_out_natoms   s    \$-(( 	C  HA4  =aggajj//CE !	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 
s   AA''A+.A+c                     | j         | j         S 	 |                                 | _         | j         S # t          $ r Y dS w xY w)Nr   )r   _read_out_n_framesr)   r*   s    r%   r   zGMSReader.n_frames   sX    >%>!	"!4466DN >!  	 	 	11	r+   c                    | j         dk    rt          j        d          }n| j         dk    rt          j        d          }g x| _        }t	          j        | j        d          5 }d}|dk    sf|                                }t          j        ||          r7|	                    |
                                t          |          z
             |dk    fd d d            n# 1 swxY w Y   t          |          S )Nr   s   ^.NSERCH=.*r   s   ^.COORD 1=.*rbTr&   )r   r.   compile_offsetsr   r-   r   readliner/   appendtelllen)r!   triggeroffsetsr3   r4   s        r%   r<   zGMSReader._read_out_n_frames   s   ;*$$j00GG[I%%j11G"$$\$-.. 	;#Dckk||~~8GT** ;NN388::D		#9::: ckk	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 7||s   #A/CC"%C"c                     | j                             | j        |                    |dz
  | j        _        |                                 S )Nr   )r   seekr@   r   framer    )r!   rI   s     r%   _read_framezGMSReader._read_frame   s>    $-.///	'')))r&   Nc                    || j         }| j        |                                  g }g }g }d}d}| j        D ]<}| j        dk    r|dk    rt	          j        d|          d},|dk    rt	          j        d|          	 d}K|dk    rt	          j        d|          d}i|dk    r|| j        k     r|                                }|                    t          |d                              |                    t          |d                              |                    t          |d	                              |dz  }n| j        d
k    r|dk    rt	          j        d|          	 d}7|dk    rt	          j        d|          	 d}W|dk    r|| j        k     r|                                }|                    t          |d                              |                    t          |d                              |                    t          |d                              |dz  }|| j
        k    r8||j        d d <   ||j        d d <   ||j        d d <   |xj        dz  c_        |c S >t          )Nr   r   z^.NSERCH=.*r   z^ COORDINATES OF ALL ATOMS ARE    z	^\s*-+\s*      r   z#^.COORD 1=\s*([-]?[0-9]+\.[0-9]+).*z.^\s*HAS ENERGY VALUE\s*([-]?[0-9]+\.[0-9]+)\s*)r   r   open_trajectoryr   r.   r/   r   splitrB   floatr   _x_y_zrI   EOFError)	r!   r   xyzflagcounterr4   wordss	            r%   r    zGMSReader._read_next_timestep   s   :B<  """L 6	 6	D{j((AIIH^T22>DAIIH?FF  DAIIBH\4$@$@$LD1994<!7!7 JJLLEHHU58__---HHU58__---HHU58__---qLG	))AIIHCTJJ  DAIIHI4    
 D1994<!7!7 JJLLEHHU58__---HHU58__---HHU58__---qLG $-'' aaa aaaaaaA			 ( r&   c                 V    |                                   |                                  d S N)closerO   r*   s    r%   _reopenzGMSReader._reopen  s'    

r&   c                 >   | j          t          t          j        d| j                  t
          j                            | j                  s t          t          j        d| j                  t          j
        | j                  | _         | j        }d|_        | j         S )NzGMS file already openedzGMS file not found)r   r)   errnoEALREADYr   ospathexistsENOENTr   r   r   rI   )r!   r   s     r%   rO   zGMSReader.open_trajectory  s    <# 94=   w~~dm,, 	M%,(<dmLLL|DM22 W|r&   c                 X    | j         dS | j                                          d| _         dS )z)Close out trajectory file if it was open.N)r   r^   r*   s    r%   r^   zGMSReader.close  s.    <Fr&   r]   )__name__
__module____qualname____doc__formatunitsr   r   propertyr   r(   r   r8   r   r<   rJ   r    r_   rO   r^   __classcell__)r$   s   @r%   r   r   1   s6        2 F Z00E# # # # #6 	  	  X	    	! 	! X	!
 
 
 " " X"   * * *
F F F FP           r&   r   )rl   rd   rb   r.    r   MDAnalysis.lib.utillibr   r   
ReaderBaser    r&   r%   <module>rv      s   2  
			  				       " " " " " " " " " 4 4 4 4 4 4j j j j j j j j j jr&   