o
    '&j%                     @   sx  d Z ddlZddlZddlZddlZed ddlmZ	 ddl
mZ ddlmZ ddlmZ zddlmZ ddlmZ dZW n eyN   dZed Y nw ddlZdd	 Ze Zd
eiZdd ZdefddZ d*ddZ!d*ddZ"d*ddZ#e$ Z%dd Z&						d+dej'dedededededefd d!Z(d"ej'dej'fd#d$Z)	d,dedej'd%e*d&ed'edefd(d)Z+dS )-u@   
plot_utils.py — Utilitarios comuns de plot para o modelo Eta
    NZAgg)datetimeTFz>[plot_utils] cartopy nao encontrado -- usando matplotlib puro.c                  C   s   g d} t jd| S )z/Colormap branco->azul escuro para precipitacao.))      ?r   r   )      ?g(\?r   )gRQ?r   r   )        gQ?gGz?)r   g(\?r   )r   皙?333333?)333333?r   g      ?precip)mcolorsZLinearSegmentedColormap	from_list)colors r   A/dados/sismom/SisMOM/sismom_fig/Figuras_Eta/scripts/plot_utils.py_precip_cmap   s   	r   r	   c                 C   s   t | trt| | S | S )z3Converte string de colormap para objeto matplotlib.)
isinstancestr_CUSTOM_CMAPSget)Z	cmap_namer   r   r   _resolve_cmap1   s   
r   var_namec                 C   sR   t j| i }t|tr|dd}|d}|d}n|\}}}t|||fS )z+Retorna (cmap, vmin, vmax) para a variavel.cmapviridisvminvmax)configCMAP_CONFIGr   r   dictr   )r   cfgZraw_cmapr   r   r   r   r   get_cmap_config8   s   


r   o   c                 C   s   t  }| j||d}|jtjdddd |jtjdddd |jtjddd	d |j	d
ddddd}d|_
d|_td|_td|_|S )z-Cria eixo com projecao PlateCarree (cartopy).)Z
projectionZ50mr   k)	linewidthcolorg?z0.4r   z0.6Tr   0.7gffffff?--)Zdraw_labelsr!   r"   alpha	linestyleF   )ccrsPlateCarreeadd_subplotZadd_featurecfeatureZ	COASTLINEZ
with_scaleZBORDERSZSTATESZ	gridlinesZ
top_labelsZright_labelsmtickerZMaxNLocatorZxlocatorZylocator)figrectprojaxglr   r   r   _setup_axes_cartopyH   s   
r2   c                 C   s*   |  |}|d |jddddd |S )zCria eixo simples sem cartopy.autoTr   r#   r$   )r!   r"   r&   )r*   Z
set_aspectgrid)r-   r.   r0   r   r   r   _setup_axes_plainX   s   

r5   c                 C   s   t rt| |S t| |S N)HAS_CARTOPYr2   r5   )r-   r.   r   r   r   
setup_axes`   s   

r8   c                   C   s    t tddstjddt_tjS )z:Retorna (ou cria) a figura reutilizavel do processo atual.r-   N      Zfigsize)getattr_proc_localpltfigurer-   r   r   r   r   _get_fign   s   rA    data	timestamp
output_dirtitle_extraunits_overridereturnc
              
   C   s  t j|dd tjdd |  tj}
W d   n1 s w   Y  |p-tj	|d}tj
	||}|	dur=|	|
}
t|\}}}|durJ|}|durP|}|durV|}|
t|
  }|du ro|jrmtt|dnd}|du r|jr~tt|d	nd
}||kr|d
 }trtjdd}t|}|jtjtj|
|||t dd}|jtjd tjd tjd tjd gt d n2t }|  t|}|j|
tjd tjd tjd tjd gdd|||dd}|d |d |j ||dddd}|j!|dd |"d}|rd| nd}|j#| d| | d| dd d! |r.|$d"d#% nd}|r8d#| nd}| d#|"d$ | d%tj& }t j'(||}|j)|tj*d&d'd
id( tret+| |S ))aI  
    Plota um campo 2D e salva como imagem.

    Otimizacoes vs versao anterior:
    - imshow (grade regular): 5-10x mais rapido que pcolormesh
    - compress_level=1: PNG mais rapido de escrever
    - Figura reutilizada por processo: sem overhead de criacao/destruicao

    Returns
    -------
    Caminho do arquivo salvo.
    Texist_okignoreinvalidNrB      r   b      r9   r<   r3   r   r   r   	transformZshadingcrslowernearestextentoriginZaspectr   r   r   interpolationLongitude (graus)Latitude (graus)vertical{Gz?Q?r0   Zorientationpadfraction
   fontsize%d/%m/%Y %HZ -- 
   r;   rf   rb    _z%Y%m%d%H.tightcompress_leveldpiZbbox_inchesZ
pil_kwargs),osmakedirsnperrstatecopyastypefloat64r   	VAR_UNITSr   VAR_DESCr   isnansizefloat
percentiler7   r?   r@   r2   
pcolormeshLONSLATSr(   r)   
set_extentrA   clearr5   imshow
set_xlabel
set_ylabelcolorbar	set_labelstrftime	set_titlereplacerV   FIG_EXTpathjoinsavefigDPIclose)rC   r   rD   rE   rF   rG   Zvmin_overrideZvmax_overrideZcmap_override
convert_fnarrunitsdescr   r   r   validr-   r0   imcbtime_strextra	extra_tagfnamefpathr   r   r   
plot_fieldy   s~   
""


$ 
r   r   c                 C   s:   t jddd | d W  d   S 1 sw   Y  dS )z Converte metros para milimetros.rK   )overrM   g     @@N)ru   rv   )r   r   r   r   m_to_mm   s   $r   accum_hours
accum_typeoutput_pathc              
   C   s  t jt jt j|dd tjdd | tj	}W d   n1 s(w   Y  d}t
j| | }	t| \}
}}d}|du rX|t|  }|jrVtt|dnd	}||kr`|d
 }trtjdd}t|}|jt
jt
j||
||t dd}|jt
jd t
jd t
jd t
jd gt d n2t }|  t|}|j|t
jd t
jd t
jd t
jd gdd|
||dd}| d |!d |j"||dddd}|j#|dd |$d}|j%|  d|	 d| d | d!| 	d"d#d$ |j&|t
j'd%d&d'id( tr	t(| |S ))zG
    Plota campo acumulado de precipitacao e salva em output_path.
    TrI   rK   rL   Nmmr   rO   g      I@r   r9   r<   r3   rQ   r   rS   rT   rV   rW   rX   r\   r]   r^   r_   r`   ra   rd   re   rg   rh   z (Acumulado zh -- z)
rj   r;   rk   ro   rp   rP   rq   ))rs   rt   r   dirnameabspathru   rv   rw   rx   ry   r   r{   r   r   r|   r}   r~   r   r7   r?   r@   r2   r   r   r   r(   r)   r   rA   r   r5   r   r   r   r   r   r   r   r   r   r   )r   rC   validityr   r   r   r   r   r   r   r   rm   r   r   r-   r0   r   r   r   r   r   r   plot_accumulation   sh   
""



r   )r   )rB   NNNNNr6   ),__doc__rs   	threadingnumpyru   Z
matplotlibZuseZmatplotlib.pyplotZpyplotr?   Zmatplotlib.colorsr   r
   Zmatplotlib.tickerZtickerr,   r   Zcartopy.crsrU   r(   Zcartopy.featurefeaturer+   r7   ImportErrorprintr   r   Z_PRECIP_CMAPr   r   r   r   r2   r5   r8   localr>   rA   ndarrayr   r   intr   r   r   r   r   <module>   s    




h