o
    #jc                     @   s   d Z ddlZddlZddlmZ ddlZdededefddZ			ddeded
edededej	fddZ
			ddededededef
ddZdededefddZdedefddZdS )u   
reader.py — Leitura de arquivos binários GrADS com TEMPLATE
Suporta: big-endian / little-endian, stream (direto) ou sequential (Fortran)
    N)datetimedata_dir	timestampreturnc                 C   s,   | d}tj | tj }tj| |S )zt
    Monta o nome do arquivo a partir do timestamp.
    CTL template: Eta03_BESM_2026060400+%y4%m2%d2%h2_2D.bin
    z%Y%m%d%H)strftimeconfigFILE_PREFIXFILE_SUFFIXospathjoin)r   r   tagfname r   =/dados/sismom/SisMOM/sismom_fig/Figuras_Eta/scripts/reader.py_build_filename   s   
r   Fvar_name
sequentialdtypec              
   C   s  t | |}tj|std| |ptj}tjtj}}|| }|d }	tj	| }
t
|dK}|rft|
d D ]+}|d}|sItd| ttj|ddd }||}|d ||
krd|}q9n|
|	 }|| ||	}W d	   n1 s~w   Y  t||	k rtd
| d| d|	 dt| tj||dtj}|||f}tjdd tj|t|tj dk < W d	   |S 1 sw   Y  |S )u  
    Lê um campo 2D de uma variável em um dado instante.

    Parameters
    ----------
    data_dir   : diretório onde estão os arquivos .bin
    timestamp  : datetime do passo de tempo desejado
    var_name   : nome da variável (ex: 'TP2M')
    sequential : True se o arquivo tem marcadores Fortran (4 bytes antes/depois de cada campo)
    dtype      : override do dtype (default: config.DTYPE)

    Returns
    -------
    np.ndarray shape (NY, NX) com undef substituído por np.nan
       Arquivo não encontrado:    rb   zFim inesperado do arquivo em >u4r   r   NzBytes insuficientes para 'z' em z: esperado z, lido ignore)invalid  ļB)r   r
   r   existsFileNotFoundErrorr   DTYPENXNY	VAR_INDEXopenrangereadEOFErrorintnp
frombufferseeklen
ValueErrorastypefloat32reshapeerrstatenanabsUNDEF)r   r   r   r   r   fpathnxnynfloatsnbytesZvar_idxfiZrec_len_bytesrec_lenZ
data_bytesrawoffsetarrr   r   r   
read_field   sT   








r@   c                    s  t | |}tj|std| |ptj}tjtj  t	tj
}|rug }t|d<}t|D ]/}ttj|dddd }	||	}
|d tj|
|dtjf}|| q5W d   n1 sow   Y  n,tj||d|  }j|k rtd| d	j d
|  fddt|D }i }ttj
D ]\}\}}}||  }tj|t|tj dk < |||< q|S )u   
    Lê todos os campos de um arquivo de uma vez (mais eficiente que leituras individuais).

    Returns
    -------
    dict {var_name: np.ndarray (NY, NX)}
    r   r   r   r   r   r   NzArquivo z tem z valores, esperado >= c                    s.   g | ]}|  |d      fqS )r   )r0   ).0r;   r8   r6   r7   Zraw_allr   r   
<listcomp>   s     z#read_all_fields.<locals>.<listcomp>r   )r   r
   r   r   r   r   r    r!   r"   r,   	VARIABLESr$   r%   r(   r)   r*   r&   r.   r/   r0   appendfromfilesizer-   	enumeratecopyr2   r3   r4   )r   r   r   r   r5   Znvarsarraysr:   _r<   r=   r?   Zexpectedresultr;   namer   rB   r   read_all_fieldsY   sD   




 

rN   c                 C   s   t jt| |S )z9Verifica se o arquivo correspondente ao timestamp existe.)r
   r   r   r   )r   r   r   r   r   file_exists   s   rO   c                    s    fddt jD S )z@Retorna lista de timestamps para os quais existem arquivos .bin.c                    s   g | ]	}t  |r|qS r   )rO   )rA   tr   r   r   rC      s    z-list_available_timestamps.<locals>.<listcomp>)r   
TIMESTAMPSrQ   r   rQ   r   list_available_timestamps   s   rS   )FN)__doc__r
   numpyr)   r   r   strr   boolndarrayr@   dictrN   rO   listrS   r   r   r   r   <module>   sH    
E
4