
    *j8@                        d Z ddlZddlZddlZddlmZmZmZ  ej                  e
      j                  j                         Zej                  Zedz  Zedz  Zd Zd#deded	efd
Zdadadadag adadadadadadag ag a g a!g a"da#da$da%da&da'da(da)da*da+da,da-da.da/da0da1da2da3da4da5da6da7g a8g a9i a:i a;i a<i a=i a>i a?i a@daAdaBdaCg aD eE       aFi aGdaHdaIded	efdZJd$dZKd ZLdeded	efd ZMd%ded!ed	efd"ZN	  eK        y# eO$ r Y yw xY w)&u  
config.py — Carrega configuracao de config.yaml e variables.yaml

Os arquivos YAML ficam na raiz do projeto (um nivel acima de scripts/).
Para usar arquivos alternativos, chame init_config() antes de importar
qualquer outro modulo do projeto:

    import config
    config.init_config("/caminho/para/meu_config.yaml",
                       "/caminho/para/minhas_variaveis.yaml")

Ordem de busca dos arquivos padrao:
  1. Variavel de ambiente CONFIG_FILE / VARIABLES_FILE
  2. <PROJECT_ROOT>/config.yaml e <PROJECT_ROOT>/variables.yaml
    N)datetime	timedeltadatezconfig.yamlzvariables.yamlc                    	 ddl }t        j                  |       } | j	                         st        d|  d      t        | d      5 }|j                  |      cddd       S # t        $ r t        d      w xY w# 1 sw Y   yxY w)zCCarrega um arquivo YAML; lanca FileNotFoundError com mensagem util.r   NzYPyYAML e necessario para ler os arquivos de configuracao.
Instale com: pip install pyyamlz(Arquivo de configuracao nao encontrado: z7
Crie o arquivo ou passe --config / --vars-file no CLI.zutf-8)encoding)yamlImportErrorpathlibPathexistsFileNotFoundErroropen	safe_load)pathr   fs      B/pesq/dados/sismom/SisMOM/sismom_fig/Figuras_Eta/scripts/config.py
_load_yamlr   "   s    
 <<D;;=6tf =E F
 	
 
dW	%~~a  
&	%  
.
 	

 
&	%s   A" A:"A7:B	run_inputref_datereturnc                 H   t        |       j                         } t        |       dk(  r| j                         r| S | j                         rKt        |       dk  r=| j	                  d      }|xs t        j                         }|j                  d      |z   S t        d|  d      )u^  
    Resolve o identificador da rodada para o formato completo YYYYMMDDHH.

    Formatos aceitos
    ----------------
    "2026060600"  -> "2026060600"   (YYYYMMDDHH, 10 digitos)
    "00"          -> hoje + "00"    (HH, 2 digitos — usa data do sistema ou ref_date)
    "0"           -> hoje + "00"    (H, 1 digito  — completado com zero)
    "12"          -> hoje + "12"

    Parameters
    ----------
    run_input : tag completo ou apenas a hora (HH)
    ref_date  : data de referencia (padrao: hoje, datetime.date.today())

    Raises
    ------
    ValueError se o formato nao for reconhecido.
    
      z%Y%m%dzFormato de rodada invalido: 'z8'.
Use YYYYMMDDHH (ex: 2026060600) ou HH (ex: 00 ou 12).)	strstriplenisdigitzfill_datetodaystrftime
ValueError)r   r   hourr    s       r   resolve_run_tagr$   9   s    ( I$$&I
9~	 1 1 3s9~2??1%,u{{}~~h'$..

'	{ 3@ 	A                 gQ?Fg@xDz>f4z.binz%Y%m%d%Hsaidalogsx   pngDEFLATEr      templatec                     | j                  dd      j                  dd      j                  dd      j                  dd      S )	a  Converte placeholders {yyyy}{mm}{dd}{hh} para formato strftime.

    Exemplos:
      {yyyy}{mm}{dd}{hh}  ->  %Y%m%d%H   (10 chars, padrao 2D)
      {yyyy}{dd}{hh}      ->  %Y%d%H     (8 chars, 3D sem mes)
      {yyyy}{mm}{dd}      ->  %Y%m%d     (8 chars, sem hora)
    {yyyy}z%Y{mm}z%m{dd}z%d{hh}z%H)replace)r/   s    r   _template_to_strftimer6   u   s<     WXt$WVt$WVt$WVt$	&r%   c                    | xs$ t         j                  j                  dt              } |xs$ t         j                  j                  dt              }t        j                  |       at        j                  |      at        t              }t        t              j                  dg       }|d   }|xs= t         j                  j                  dd      xs t        |j                  dd            }|st        d      t        |      at        t        t        d	d
       t        t        d
d       t        t        dd       t        t        dd             at        |d         at        |d         at'        t"              D cg c]  }t         t)        |t$        z        z    c}a|d   }t        |d         at        |d         at1        |d         at1        |d         at1        |d         a|j                  d      xs g }	|j                  d      xs g }
|	D cg c]  }t1        |       c}a|
D cg c]  }t1        |       c}at=        t8              at=        t:              a t>        ret.        dkD  r0t1        tC        t8        d   t8        d   z
  t.        dz
  z  d            nda"tG        jH                  t8        tF        jJ                        a&nRt1        |j                  d      xs d      a"tG        jN                  t4        t4        t.        dz
  tD        z  z   t.              a&t@        r*tG        jH                  t:        tF        jJ                        a(n4tG        jN                  t2        t2        t,        dz
  t6        z  z   t,              a(|d   }t1        |d          a)t        |d!         a*t        |d"         jW                  d#t              a,t        |d$         a-t        |j                  d%d&            }t]        |      a/t=        |j                  d'd(            a0t=        |j                  d)d(            a1t=        |j                  d*d(            a2|d+   }t        |j                  d,d            xs  t         j                  j                  d-d      a3t        |j                  d.d            a4th        rtk        th        t              nda6t        |j                  d/d0            a7t        |j                  d1d2            a8|j                  d3i       }t        |j                  d4d5            a9t        |j                  d6d7            a:|j                  d8i       }t        |j                  d9d:            a;t        |j                  d;d            a<t        |j                  d<d=            a=t        |j                  d>d?            a>t=        |j                  d@d(            a?t=        |j                  dAd(            a@|aAt        D cg c]  }|dB   	 c}aBt        D ci c]  }|dB   |j                  dC|dB          c}aCt        D ci c]  }|dB   |j                  dDd       c}aDd}i aEt        D ]:  }|t        |dB   <   |t        t        |j                  dEd      xs d      d      z  }< |aGt        D ci c]%  }|dB   t        |j                  dEd      xs d      ' c}aHt        D ci c],  }|dB   t        |j                  dEd      xs d      dkD  rdFnd=. c}aIt        D ci c]!  }|dB   t        |j                  dGg             # c}aKt        D ci c]!  }|dB   t        |j                  dHg             # c}aLt        D cg c]  }|j                  dId(      s|dB    c}aMt        t              aOt        D ci c]M  }|dB   |j                  dJdK      |j                  dLd	      |j                  dMd	      |j                  dId(      dNO c}aPy	c c}w c c}w c c}w c c}w c c}w c c}w c c}w c c}w c c}w c c}w c c}w c c}w )Oa*  
    Inicializa (ou reinicializa) todas as constantes a partir dos arquivos YAML.

    Chamado automaticamente na importacao do modulo com os arquivos padrao.
    Pode ser chamado novamente pelo main.py quando o usuario passa --config
    ou --vars-file, ANTES de importar reader, export_cog etc.

    Parameters
    ----------
    config_file : str | Path | None
        Caminho para config.yaml (None = usa padrao ou env CONFIG_FILE)
    vars_file   : str | Path | None
        Caminho para variables.yaml (None = usa padrao ou env VARIABLES_FILE)
    CONFIG_FILEVARIABLES_FILE	variablesrunRUN_TAGr&   tagzTag da rodada nao definido.
Use --run YYYYMMDDHH ou --run HH (ex: --run 00 usa hoje 00Z),
ou defina a variavel de ambiente RUN_TAG.N         r   ntimesdt_hours)hoursgridnxnylon0lat0dlon
lat_levels
lon_levelsr'   r   r(   )dtypedlatmodelundefrM   file_prefix	{run_tag}file_suffixfile_timestampz{yyyy}{mm}{dd}{hh}fixedFyrev
sequentialpaths	data_baseSISMOM_DATA_BASEdata_dir
output_dirr)   log_dirr*   figuredpir+   extr,   cogcompressr-   zlevel	predictorr   	tile_sizer.   
fill_undeflon_180namedescriptionunitsnlev   levelsplot_levelsprecipcmapviridisvminvmax)rp   rr   rs   ro   )Qosenvironget_DEFAULT_CONFIG_DEFAULT_VARIABLESr
   r   _CONFIG_FILE
_VARS_FILEr   r   r"   r$   r<   r   intT0NTIMESDT_HOURSranger   
TIMESTAMPSNXNYfloatLON0LAT0DLON
LAT_LEVELS
LON_LEVELSboolIRREGULAR_LATIRREGULAR_LONroundDLATnparrayfloat64LATSlinspaceLONSUNDEFDTYPEr5   FILE_PREFIXFILE_SUFFIXr6   FILE_TIMESTAMP_FMT	FIXED_RUNYREV
SEQUENTIALrZ   DATA_DIR_TEMPLATE_resolve_path_templateDATA_DIR
OUTPUT_DIRLOG_DIRDPIFIG_EXTCOG_COMPRESS
COG_ZLEVELCOG_PREDICTORCOG_TILE_SIZECOG_FILL_UNDEF
COG_LON180	VARIABLES	VAR_NAMESVAR_DESC	VAR_UNITS	VAR_INDEXmaxNVARS_FIELDSVAR_NLEVVAR_NDIMlist
VAR_LEVELSVAR_PLOT_LEVELSPRECIP_VARSset
PRECIP_SETCMAP_CONFIG)config_file	vars_filerun_tagcfgvars_rawr;   raw_tagig_lat_lev_raw_lon_lev_rawvm_ts_tplpfigra   _offset_vs                      r   init_configr      s.   @ O!OKU0@BT!UI<<,L<<	*J,'C*%))+r:H e*C 	 	#::>>)R(	#swwub!" 
 8
 	

 w'GGBQK(#gal*;S1=NGAbM*,B3x=!F3z?#H>CFmLm"yq8|44mLJ v;Aqw<Bqw<B6D6D6D 55&,"L55&,"L'34|!U1X|4J'34|!U1X|4J$M$MOQTUvuUJrNZ]:rAvFJK[^xx
"**5QUU6])c*{{4a4!7<xx
"**5{{4a4!7< g,A'
#Eaj/EQ}-.66{GLKQ}-.KQUU#35IJKG.w7
 aeeGU+,IaeeFU+,DaeeL%01J w<AAEE+r23]rzz~~FXZ\7]AEE*b12N_./@'JegHQUU<12JQUU901G ''(B
C#''%%&C#''%'(G ''%
C
Y78LQ/0Ja01Mc23M#'',67N#'')67J I%./Y!F)Y/IFOPi!F)QUU=!F)<<iPHGPQy!!F)QUU7B//yQI GI '	"V*3s266&!,12A66  LMVWYqy#aeeFA&6&;!"<<YWHW`aW`RSqyAEE&O,@q(AA(E11LW`aHNWXiqy$quuXB'?"@@iXJNWXiqy$quu]B'?"@@iXO&/Ji15553I1V9iJKk"J  A 	
&	UU6I.UU6D)UU6D)eeHe,	
 	
 Ko M 54p 0PQ XaXXJsO   !``#8`(	`-  `2`7<*`<11a-&a&aa'aAac                  `    t         D  cg c]  } | j                  dd      s| d    c} S c c} w )zGRetorna lista de nomes de variaveis com enabled=true em variables.yaml.enabledTrh   )r   rv   )r   s    r   enabled_varsr   "  s+    (Cy!AEE)T,BAfIyCCCs   ++r   c                    | r|rt        |      dk  r| S | j                  d|      j                  d|      j                  d|dd       j                  d|dd       j                  d	|dd
       j                  d|d
d       S )a  
    Substitui variaveis de template em um caminho de dados.

    Variaveis suportadas
    --------------------
    {data}     -> YYYYMMDDHH  (run_tag completo)
    {run_tag}  -> YYYYMMDDHH  (alias de {data})
    {yyyy}     -> YYYY (ano 4 digitos)
    {mm}       -> MM   (mes 2 digitos)
    {dd}       -> DD   (dia 2 digitos)
    {hh}       -> HH   (hora 2 digitos)

    Exemplos
    --------
    template = "/dados/sismom/sismom_forecast/{data}/regional/eta/2D"
    run_tag  = "2026060600"
    -> "/dados/sismom/sismom_forecast/2026060600/regional/eta/2D"

    template = "/dados/sismom/sismom_forecast/{yyyy}{mm}{dd}{hh}/regional/eta/2D"
    -> "/dados/sismom/sismom_forecast/2026060600/regional/eta/2D"
    r   z{data}rR   r1   Nr>   r2   r?   r3   r@   r4   )r   r5   )r/   r   s     r   r   r   '  s    , 7c'lR&7	g	&	g	&	gbqk	*	gal	+	gal	+	gam	,r%   basec                 2   |r3d|v rt        ||       S t        j                  j                  || ddd      S t        rt        t        |       S t
        r't        j                  j                  t
        | ddd      S t        j                  j                  d|       S )uk  
    Resolve o caminho dos dados para uma rodada.

    Prioridade
    ----------
    1. --data_base CLI  (base != "")  — retrocompat ou template
    2. data_dir no config.yaml        — suporta template ou caminho fixo
    3. SISMOM_DATA_BASE env            — base fixa (retrocompat)
    4. data/ local                    — fallback de desenvolvimento
    {regionaleta2Ddata)r   rt   r   joinr   rZ   )r   r   s     r   build_data_dirr   J  s{     $;)$88ww||D':udCC%&7AAww||,gz5$OO77<<((r%   )N)NNN)r&   )P__doc__rt   r
   numpyr   r   r   r   r   r   __file__parentresolveSCRIPTS_DIRPROJECT_ROOTrw   rx   r   r   r$   r<   r|   r}   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rZ   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   ry   rz   r6   r   r   r   r   	Exception r%   r   <module>r      s    
   7 7 w||H%,,446!!!M1!$44 !.!s !e !s !J 4b!X:Qs3DtDT	"4
bu}ee2[V{ZdEW "x"&7

	U7q*!-S]
	B	22y2y"x2jTU\	
su*Bk$Z&C &C &[|D
 S  3  3  F)C )s )C )6	M 	 		s   ;D D
D