o
    Mh                     @   s   d dl mZ d dlZd dlZd dlZd dlmZmZmZm	Z	 d dl
Z
d dlZd dlZG dd dZG dd dZdd	 Zd
d Zdd Zdd ZdddZdddZdd ZdS )    )PathN)PopenPIPESTDOUTDEVNULLc                   @   s<   e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdZdS )colorz[35mz[36mz[34mz[94mz[32mz[92mz[33mz[31mz[91mz[1mz[4mz[0mN)__name__
__module____qualname__ZPURPLEZCYANZBLUEZLBLUEZGREENZLGREENZYELLOWZREDLREDZBOLDZ	UNDERLINEEND r   r   S/global/cfs/cdirs/e3sm/www/hass877/share/emis_processing/FlexEmis/src/ggen/utils.pyr   
   s    r   c                   @   s   e Zd Zdd Zdd ZdS )	HidePrintc                 C   s   t j| _ttjdt _d S )Nw)sysstdout_stdoutopenosdevnull)selfr   r   r   	__enter__   s   zHidePrint.__enter__c                 C   s   t j  | jt _d S )N)r   r   closer   )r   exc_typeexc_valexc_tbr   r   r   __exit__   s   
zHidePrint.__exit__N)r   r	   r
   r   r   r   r   r   r   r      s    r   c                 C   s(   | dkrt d}| }|S t | }|S )N .)r   absolute)pathpdir_pathr   r   r   get_dir_path!   s   r$   c                 C   s6   t tt| dkrttjd |  d tj d S )Nr   
z does not exist!)lenglobstr	Exceptionr   r   r   r!   r   r   r   checker)   s   r+   c                 C   s6   t j| stdt|  d  t t|  d S d S )Nr%   z  doesn't exist. Creating one...
)r   r!   existsprintr(   makedirsr*   r   r   r   make_dir-   s   r/   c                 C   s"   t | jdD ]}|d| qd S )N    zgot line from sub: %r)iterreadlineinfo)r"   loggerliner   r   r   log_out2   s   r6   @ c                 C   s   d}g }g }d}| D ],}|t t|jd d  }||k r$|| n|| d}|| g }|d7 }q
t| |d dkrJ|| |d  t|t| krW|| |S )a  
    Splits a list of files based on the file sizes
    to handle memory issues in multiprocessing.

    Parameters
    ----------
    filelist : List
        Original list of files.

    Returns
    -------
    listoflists : List
        Split list of lists of files.

    r   i      N)r   statr(   st_sizeappendr&   )filelistlimitZsize_of_fileZlistoflistsZnew_filelistifiler   r   r   	get_sizes7   s$   



r@   r   Fc           
      C   s   t d}t| }|d|  d  |r't|tttdd}|	 \}}|jS t|tttdd}|j
| |	 \}}|d}|D ]}	||	 qC|jS )Nzlog.ggenz
[cmd]: r%   T)r   stdinstderruniversal_newlines)logging	getLoggershlexsplitr3   r   r   r   r   communicaterA   write
returncode)
cmdinphider4   Z	cmd_splitr"   op_itemsr5   r   r   r   
exec_shell[   s   


rQ   c                    s   | j }t|j}|| }tdg|dd  |d d kddgf}t|dd  |d d k}| j|    fddt	|d d d |dd d d D S )NFr8   c                    s   g | ]
\}} || qS r   r   ).0r>   jIr   r   
<listcomp>u   s    z)group_duplicate_index.<locals>.<listcomp>   )
valuesnplexsortTconcatenateallflatnonzeroindextolistzip)dfasidxbmidxr   rU   r   group_duplicate_indexm   s   .0ri   )r7   )r   F)pathlibr   r   r   rD   
subprocessr   r   r   r   rF   numpyrZ   r'   r   r   r$   r+   r/   r6   r@   rQ   ri   r   r   r   r   <module>   s"    	

$