+
    X*j).                         R t ^ RIt^ RIt^ RIHt ^ RItR R ltR R lt. ROtRR R llt	R	 R
 lt
RR R lltRR R lltR R ltR R ltRR R lltR# )u   
reader.py — Leitura de arquivos binários GrADS com TEMPLATE
Suporta: big-endian / little-endian, stream (direto) ou sequential (Fortran)
N)datetimec                0    V ^8  d   QhR\         R\         /# )   dtypereturn)str)formats   "B/pesq/dados/sismom/SisMOM/sismom_fig/Figuras_Eta/scripts/reader.py__annotate__r
      s     : : : :    c                J    \        V 4      P                  R4      '       d   R# R# )zDtype do marcador de registro Fortran (4 bytes) com o mesmo endianness
dos dados: arquivos BYTESWAPPED ("<f4") tem marcadores little-endian.<z<u4z>u4)r   
startswithr   s   &r	   _marker_dtyper      s#     J))#..59E9r   c                <    V ^8  d   QhR\         P                  RR/# )r   arrr   N)npndarray)r   s   "r	   r
   r
      s     2 2RZZ 2D 2r   c                p   \        \        P                  ! \        P                  4      4      p\        R\        V4      R,          4      p\        P                  ! RR7      ;_uu_ 4        \        P                  V \        P                  ! W,
          4      V8  &   RRR4       R#   + '       g   i     R# ; i)a/  Substitui valores UNDEF por NaN in-place.

Usa tolerancia relativa ao magnitude do UNDEF (float32) para cobrir tanto
o UNDEF padrao (9.99e20) quanto UNDEFs de grande magnitude negativa
como -2.56E+33 (GPOSETA/BESM), onde a ULP do float32 e ~3e26 e a
tolerancia fixa de 1e14 nunca identificaria o valor.
g  ļBg-C6?ignore)invalidN)	floatr   float32configUNDEFmaxabserrstatenan)r   undef32tols   &  r	   _mask_undefr"      sl     BJJv||,-G
dCL4'
(C	X	&	&+-66BFF3=!C'( 
'	&	&	&s   )1B$$B5	c                H    V ^8  d   QhR\         R\        R\         R\         /# )r   data_dir	timestampfmtr   r   r   )r   s   "r	   r
   r
   ,   s)     ) )c )h )S )RU )r   c                    VP                  V4      p\        P                   V \        P                   2p\        P
                  P                  W4      # )z?Monta o nome do arquivo com um formato de timestamp especifico.)strftimer   FILE_PREFIXFILE_SUFFIXospathjoin)r$   r%   r&   tagfnames   &&&  r	   _build_filenamer1   ,   sE    


S
!C!!"3%(:(:';<E77<<((r   c                0    V ^8  d   QhR\         R\        /# )r   r$   r%   r'   )r   s   "r	   r
   r
   3   s        r   c                   \        \        RR4      pV'       g6   \        WR4      p\        P                  P                  V4      '       d   V# R# V'       d4   \        WV4      p\        P                  P                  V4      '       d   V# \         F@  pWB8X  d   K  \        WV4      p\        P                  P                  V4      '       g   K>  Vu # 	  R# )z
Localiza o arquivo .bin para um dado timestamp.

Estrategia:
  1. Usa config.FILE_TIMESTAMP_FMT (definido por file_timestamp no config.yaml)
  2. Fallback: tenta todos os formatos em _TIMESTAMP_FORMATS
Retorna o caminho completo se encontrado, ou None.
FILE_TIMESTAMP_FMT%Y%m%d%H N)getattrr   r1   r,   r-   exists_TIMESTAMP_FORMATS)r$   r%   primary_fmtfpathr&   s   &&   r	   _resolve_filenamer<   3   s     &"6
CK R8u--u747[A77>>%  L "S977>>%  L " r   c                t    V ^8  d   QhR\         R\        R\         R\        R\         R\        P                  /# )r   r$   r%   var_name
sequentialr   r   )r   r   boolr   r   )r   s   "r	   r
   r
   S   sP     F FFF F 	F
 F ZZFr   c                8   \        W4      pVf   VP                  R4      p\        RV,           R,           V ,           R,           \        \        P
                  4      ,           R,           \        \        P                  4      ,           R,           4      hT;'       g    \        P                  p\        P                  \        P                  rWx,          p	V	^,          p
\        P                  V,          p\        VR4      ;_uu_ 4       pV'       d   \        V^,           4       F  pVP                  ^4      pV'       g   \        R	V 24      h\        \         P"                  ! V\%        V4      R
7      ^ ,          4      pVP                  V4      pVP                  ^4       W8X  g   K  TpK  	  M*W,          pVP'                  V4       VP                  V
4      pRRR4       \)        X4      V
8  d!   \+        RV RV RV
 R\)        V4       24      h\         P"                  ! VVR
7      P-                  \         P.                  4      pVP1                  W34      p\3        \        RR4      '       d   VRRR1R3,          p\5        V4       V#   + '       g   i     L; i)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
Nr5   Arquivo nao encontrado para  em '' (prefixo=	, sufixo=)rbzFim inesperado do arquivo em r   zBytes insuficientes para 'z' em z: esperado z, lido YREVFNNN)r<   r)   FileNotFoundErrorreprr   r*   r+   DTYPENXNY	VAR_INDEXopenrangereadEOFErrorintr   
frombufferr   seeklen
ValueErrorastyper   reshaper7   r"   )r$   r%   r>   r?   r   r;   r/   nxnynfloatsnbytesvar_idxfirec_len_bytesrec_len
data_bytesrawoffsetr   s   &&&&&               r	   
read_fieldrh   S   s&   , h2E}  ,*S07:XE I v11235@ACGHZHZC[\^ab
 	

 ##v||EiigGkFx(G	eT		a7Q;' !q	$"%B5'#JKKbmmMuAUVWXYZVVG_
q	<$C ( %FFF6N&&.C! 
$ 3x&(
%w ?xws3xj2
 	

 --5
)
0
0
<C
++rh
C vvu%%$B$'l JE 
	s   BJ	'1J		J	c          
      T    V ^8  d   QhR\         R\        R\        R\         R\        /# )r   r$   r%   r?   r   r   )r   r   r@   dict)r   s   "r	   r
   r
      sA     J JJJ J 	J
 
Jr   c                ^   \        W4      pVf   VP                  R4      p\        RV,           R,           V ,           R,           \        \        P
                  4      ,           R,           \        \        P                  4      ,           R,           4      hT;'       g    \        P                  p\        P                  \        P                  rvWg,          p\        \        R\        \        P                  4      4      p	V'       d   . p
\        VR	4      ;_uu_ 4       p\        V	4       F  p\        \         P"                  ! VP%                  ^4      \'        V4      R
7      ^ ,          4      pVP%                  V4      pVP%                  ^4       V
P)                  \         P"                  ! WR
7      P+                  \         P,                  4      P/                  Wv34      4       K  	  RRR4       M\         P0                  ! WCR
7      pW,          pVP2                  V8  dK   \5        RV,           R,           \7        VP2                  4      ,           R,           \7        V4      ,           4      h\        V	4       Uu. uF-  pVVV,          V^,           V,           P/                  Wv34      NK/  	  p
p/ p\        P                   EFW  p\9        V\:        4      '       d
   VR,          MV^ ,          p\9        V\:        4      '       d&   \        VP=                  R^ 4      ;'       g    ^ 4      M^ p\        P>                  V,          p\        \        RR4      pV^ 8  d   . p\        V4       FS  pV
VV,           ,          PA                  4       pV'       d   VRRR1R3,          p\C        V4       VP)                  V4       KU  	  \         PD                  ! V^ R7      VV&   EK  V
V,          PA                  4       pV'       d   VRRR1R3,          p\C        V4       VVV&   EKZ  	  V#   + '       g   i     EL; iu upi )u   
Lê todos os campos de um arquivo de uma vez (mais eficiente que leituras individuais).

Returns
-------
dict {var_name: np.ndarray (NY, NX)}
Nr5   rB   rC   rD   rE   rF   NVARS_FIELDSrG   r   zArquivo z tem z valores, esperado >= namenlevrH   FrI   )axisrJ   )#r<   r)   rK   rL   r   r*   r+   rM   rN   rO   r7   rX   	VARIABLESrQ   rR   rU   r   rV   rS   r   appendrZ   r   r[   fromfilesizerY   r   
isinstancerj   getrP   copyr"   stack)r$   r%   r?   r   r;   r/   r\   r]   r^   n_fieldsall_rawra   _rd   rf   raw_allexpectedrb   resultvrm   rn   idx_yrevarrskr   s   &&&&                       r	   read_all_fieldsr      sJ    h2E}  ,*S07:XE I v11235@ACGHZHZC[\^ab
 	

 $$Eyy&))wGv~s63C3C/DEH%!8_bmmAFF1I]5=QRSTUV&&/q	MM#3::2::FNNPRxX	 %  ++e1%<<("U"W,s7<</@@()+.x=9  8_
$ AK1q5G"34<<bXF$ 	 

 F&q$//qyQqT-74-@-@s155#((q)a%.!8D4[cAg&++-DbD!G#C C 	 !
 88Dq1F4L #,##%CC"aLcF4L) , MY  
s   CP13P*P'	c                <    V ^8  d   QhR\         R\        R\        /# )r   r$   r%   r   )r   r   r@   )r   s   "r	   r
   r
      s!     > ># >( >t >r   c                    \        W4      RJ# )zLVerifica se o arquivo correspondente ao timestamp existe (qualquer formato).N)r<   )r$   r%   s   &&r	   file_existsr      s    X1==r   c                0    V ^8  d   QhR\         R\        /# )r   r$   r   )r   list)r   s   "r	   r
   r
      s     F F F Fr   c                r    \         P                   Uu. uF  p\        W4      '       g   K  VNK  	  up# u upi )z@Retorna lista de timestamps para os quais existem arquivos .bin.)r   
TIMESTAMPSr   )r$   ts   & r	   list_available_timestampsr      s+    ((E(!K,DAA(EEEs   44c                `    V ^8  d   QhR\         R\        R\        R\        R\         R\        /# )r   r$   r%   var_level_mapr?   r   r   )r   r   rj   r@   )r   s   "r	   r
   r
      sL     ] ]]] ] 	]
 ] 
]r   c                  aaa \        W4      pVf   VP                  R4      p\        RV,           R,           V ,           R,           \        \        P
                  4      ,           R,           \        \        P                  4      ,           R,           4      hT;'       g    \        P                  p\        P                  \        P                  uooSS,          pV^,          p\        \        RR	4      oVVV3R
 lp	/ p
V'       Edf   / pVP                  4        F=  w  r\        P                  V,          pVf	   VR3W&   K(  V F  pW3WV,           &   K  	  K?  	  \        \        R\        \        P                  4      4      p/ p\        VR4      ;_uu_ 4       p\!        V4       F  p\#        \$        P&                  ! VP)                  ^4      \+        V4      R7      ^ ,          4      pVP)                  V4      pVP)                  ^4       VV9   g   Kn  VV,          w  ppV	! \$        P&                  ! VVR7      4      pVf   VVV&   K  VVP-                  V/ 4      V&   K  	  RRR4       Tp
V
# \        VR4      ;_uu_ 4       pVP                  4        F  w  r\        P                  V,          pVfK   VP/                  W,          4       VP)                  V4      pV	! \$        P&                  ! VVR7      4      W&   Kj  / pV FS  pVP/                  W,           V,          4       VP)                  V4      pV	! \$        P&                  ! VVR7      4      VV&   KU  	  VW&   K  	  RRR4       V
#   + '       g   i     EL; i  + '       g   i     T
# ; i)a  
Le apenas os campos especificos solicitados (minimo uso de memoria).

Ao inves de ler todos os nlev niveis de cada variavel 3D, le apenas os
niveis necessarios para gerar as figuras (plot_levels).

Parameters
----------
var_level_map : dict
    {var_name: None}           -> variavel 2D: le 1 campo
    {var_name: [k0, k1, ...]}  -> variavel 3D: le apenas esses indices de nivel

Returns
-------
dict:
    {var_name: np.ndarray(NY, NX)}       para vars 2D
    {var_name: {k: np.ndarray(NY, NX)}}  para vars 3D (k = indice do nivel)
Nr5   rB   rC   rD   rE   rF   rH   Fc                    < V P                  \        P                  4      P                  SS4      P	                  4       p S'       d   V R R R1R3,          p \        V 4       V # )NrI   rJ   )rZ   r   r   r[   rv   r"   )r   r   r\   r]   s   &r	   _clean%read_fields_selective.<locals>._clean  sK    jj$,,R499;DbD!G#C
r   rl   rG   r   )r<   r)   rK   rL   r   r*   r+   rM   rN   rO   r7   itemsrP   rX   rp   rQ   rR   rU   r   rV   rS   r   
setdefaultrW   )r$   r%   r   r?   r   r;   r/   r^   r_   r   r}   neededvarlevel_ksbaser   rx   tmpra   fird   rf   lev_kr   lev_dictr   r\   r]   s   &&&&&                    @@@r	   read_fields_selectiver      s   2 h2E}  ,*S07:XE I v11235@ACGHZHZC[\^ab
 	

 ##v||EiiFB2gGkFFFE*E Fz *002MC##C(D #T{!A(+xF!8$ " 3 6>3v7G7G3HI%!HobmmAFF1I]5=QRSTUV&&/q	<!'JC s%!@AC}#&C9<sB/6 &  ( M# %!!.!4!4!6'',#FF4=)&&.C"(s%)H"IFK  "H%F23ffVn&,R]]3e-L&M & #+FK "7 " MA  " Ms!   A5M'AM'?CM;'M8	;N	)r5   z%Y%d%Hz%Y%m%d)r5   )FN)__doc__r,   numpyr   r   r   r   r"   r9   r1   r<   rh   r   r   r   r    r   r	   <module>r      sZ   
 
   :2$ )@FRJZ>
F
] ]r   