+
    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# )zŒDtype 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Ð9°EÐ9r   c                ó<   € V ^8„  d   QhR\         P                  RR/# )r   Úarrr   N)ÚnpÚndarray)r   s   "r	   r
   r
      s   € ÷ 2ñ 2”R—Z‘Zð 2 Dñ 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   € ô ”B—J’JœvŸ|™|Ó,Ó-€Gä
ˆd”C˜“L 4Õ'Ó
(€CÜ	�Š˜X×	&Ö	&Ü+-¯6©6ˆŒB�FŠF�3•=Ó! 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Ü�7‰7�<‰<˜Ó(Ð(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¸
ÓC€K÷ Ü °RÓ8ˆÜŸ™Ÿ™ u×-Ò-ˆuÐ7°4Ð7çÜ °[ÓAˆÜ�7‰7�>‰>˜%× Ò ØˆL÷ "ˆØÔÙÜ °SÓ9ˆÜ�7‰7�>‰>˜%× Ô ØŠ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ô ‡Z�Zñ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                  r‡Wx,          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       WÛ8X  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                  W‡3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 ÚYREVFºNNNéÿÿÿÿ)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Ó2€EØ‚}Ø× Ñ  Ó,ˆÜØ*¨SÕ0°7Õ:¸XÕEð Iõ Üœv×1Ñ1Ó2õ3Ø5@õAÜCGÌ×HZÑHZÓC[õ\Ø^aõbó
ð 	
ð
 ×#Ð#”v—|‘|€EÜ�i‰iœŸ™ˆØ�g€GØ˜�k€FÜ×Ñ˜xÕ(€Gä	ˆe�T×	Ô	˜aßä˜7 Q�;Ö'�Ø !§¡ q£	�ß$Ü"Ð%BÀ5À'Ð#JÓKÐKÜœbŸmšm¨MÄÈuÓAUÔVÐWXÕYÓZ�ØŸV™V G›_�
Ø—‘�q”	Ø–<Ø$’Cò (ð Õ%ˆFØ�F‰F�6ŒNØ—&‘&˜“.ˆC÷! 
ô$ ˆ3ƒx�&ÔÜØ(¨¨
°%¸°wð ?Ø�x˜w¤s¨3£x jð2ó
ð 	
ô
 �-Š-˜ 5Ô
)×
0Ñ
0´·±Ó
<€CØ
�+‰+�r�hÓ
€Cô Œv�v˜u×%Ò%Ø‘$�B�$˜�'�lˆô �Ôà€J÷E 
×	ú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"                  ! WãR
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Ó2€EØ‚}Ø× Ñ  Ó,ˆÜØ*¨SÕ0°7Õ:¸XÕEð Iõ Üœv×1Ñ1Ó2õ3Ø5@õAÜCGÌ×HZÑHZÓC[õ\Ø^aõbó
ð 	
ð
 ×$Ð$œŸ™€EÜ�y‰yœ&Ÿ)™)ˆØ�w€Gä”v˜~¬s´6×3CÑ3CÓ/DÓE€HçàˆÜ�%˜×Ô !Ü˜8–_�ÜœbŸmšm¨A¯F©F°1«I¼]È5Ó=QÔRÐSTÕUÓV�ØŸ&™& ›/�Ø—‘�q”	Ø—‘Ü—M’M #Ô3×:Ñ:¼2¿:¹:ÓF×NÑNÐPRÈxÓXöñ	 %÷ Ðô —+’+˜eÔ1ˆØÕ%ˆØ�<‰<˜(Ô"ÜØ˜UÕ" WÕ,¬s°7·<±<Ó/@Õ@Ø(õ)Ü+.¨x«=õ9óð ô ˜8”_ó
á$�ð �A˜•K 1 q¥5¨GÕ"3Ð4×<Ñ<¸b¸XÖFÙ$ð 	ð 
ð
 €FÜ×ÕˆÜ& q¬$×/Ò/ˆq�Žy°Q°qµTˆÜ-7¸¼4×-@Ò-@Œs�1—5‘5˜ Ó#×(Ð( qÔ)ÀaˆÜ×Ñ Õ%ˆäœ ¨Ó.ˆØ�!Œ8àˆDÜ˜4–[�Ø˜c A�gÕ&×+Ñ+Ó-�ß ¡D b D¨! G¥˜#Ü˜CÔ Ø—‘˜CÖ ñ	 !ô
 Ÿ8š8 D¨qÔ1ˆF�4ŒLð ˜#•,×#Ñ#Ó%ˆCß˜C¡ "  a �L�cÜ˜ÔØˆF�4ŒLñ) ð, €M÷Y ×Ðüò 
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¸×,D�AˆAÑ(Ñ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WÏ3W¾V,           &   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   ø€ Ø�j‰jœŸ™Ó$×,Ñ,¨R°Ó4×9Ñ9Ó;ˆß˜™D˜b˜D !˜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Ó2€EØ‚}Ø× Ñ  Ó,ˆÜØ*¨SÕ0°7Õ:¸XÕEð Iõ Üœv×1Ñ1Ó2õ3Ø5@õAÜCGÌ×HZÑHZÓC[õ\Ø^aõbó
ð 	
ð
 ×#Ð#”v—|‘|€EÜ�i‰iœŸ™€F€BˆØ�2�g€GØ˜�k€Fä”F˜F EÓ*€E÷ð €Fç€zð ˆØ*×0Ñ0Ö2‰MˆCÜ×#Ñ# CÕ(ˆDØÒØ # T˜{�“ã!�AØ(+ x�F !�8Ó$ó "ñ 3ô œ6 >´3´v×7GÑ7GÓ3HÓIˆØˆÜ�%˜×Ô !Ü˜H–o�ÜœbŸmšm¨A¯F©F°1«I¼]È5Ó=QÔRÐSTÕUÓV�ØŸ&™& ›/�Ø—‘�q”	Ø˜–<Ø!'¨¥‘J�C˜Ù ¤§¢¨s¸%Ô!@ÓA�CØ’}Ø#&˜˜C›à9<˜Ÿ™ s¨BÓ/°Ó6ñ &÷ ð ˆð( €Mô# �%˜×Ô !Ø!.×!4Ñ!4Ö!6‘�Ü×'Ñ'¨Õ,�ØÒ#à—F‘F˜4�=Ô)ØŸ&™& ›.�CÙ"(¬¯ª°sÀ%Ô)HÓ"I�F“Kð  "�HÛ%˜ØŸ™ ¥¨FÕ2Ô3ØŸf™f V›n˜Ù&,¬R¯]ª]¸3ÀeÔ-LÓ&M˜ ›ñ &ð #+�F“Kñ "7÷ ð" €M÷A ×Ðú÷ Öð" €Mús!   Æ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   