o
    Df                     @   s   d dl Z d dlZd dlZd dlZd dlZd dlZd dlmZ d dlmZ d dl	Z	zd dl
Z
W n ey9   dZ
Y nw eeZdd Zdd ZG dd	 d	ZG d
d deZeddZdefddZde	jfddZG dd dZdS )    N)Optionalxopenc                  C   s   zGt d} |  }W d   n1 sw   Y  td|}|r>tt|ddddd}|d	krCt	|t
 W S W t
 S W t
 S  tyS   Y t
 S w )
a3  
    Return the number of available virtual or physical CPUs on this system.
    The number of available CPUs can be smaller than the total number of CPUs
    when the cpuset(7) mechanism is in use, as is the case on some cluster
    systems.

    Adapted from http://stackoverflow.com/a/1006301/715090
    z/proc/self/statusNz(?m)^Cpus_allowed:\s*(.*)$   ,    1r   )openreadresearchbinintgroupreplacecountminmultiprocessing	cpu_countOSError)fstatusmres r   W/var/www/html/software/conda/envs/catlas/lib/python3.10/site-packages/cutadapt/utils.pyavailable_cpu_count   s"   	

"r   c                 C   s@   t d u rd S t t j\}}t||  |}t t j||f d S N)resourceZ	getrlimitZRLIMIT_NOFILEr   Z	setrlimit)nZsoftZhardr   r   r   raise_open_files_limit-   s
   r!   c                   @   s:   e Zd ZdZdddZedddZdd	d
Zdd ZdS )Progressz9
    Print an animated progress report to sys.stderr
    r   c                 C   s,   || _ d| _t | _| j| _|  | _dS )zQ
        every: minimum time to wait in seconds between progress updates
        r   N)_every_ntime_time_start_timescissors
_animation)selfZeveryr   r   r   __init__:   s
   
zProgress.__init__
   c                 c   s    	 dt | d fdt | d ffD ]7\}}|D ]0}dD ]+}d| }d| |  }|r6|r.dnd}||}}n|r:d	nd
}d| | | d V  qqqq)NTFr   )TF -z>8z=8z8<z8=[])range)widthZ
is_reverserangpositionZis_openleftrightscr   r   r   r(   E   s   (zProgress.scissorsFc              
   C   s   t   }|r|| j }|}n
|| j }|| j }|dk rd S |dkr$d S |s-|| jk r-d S || j }t|d }t||d  d }t|d }	|| }
|| }tdj|||	||d |
d d t| j	ddt
jd	 || _|| _d S )
Nr   r   i  <   u   {animation} {hours:02d}:{minutes:02d}:{seconds:02d} {total:13,d} reads  @  {per_item:7.1F} µs/read; {per_minute:6.2F} M reads/minuteg    .A)hoursminutessecondstotalper_itemZ
per_minuteZ	animationr   )endfile)r%   r'   r&   r$   r#   r   printformatnextr)   sysstderr)r*   r<   _finalcurrent_timeZ
time_deltadeltatr9   r:   r;   Z
per_secondr=   r   r   r   updateT   s<   






zProgress.updatec                 C   s   | j |dd ttjd dS )zA
        Print final progress reflecting the final total
        T)rE   )r?   N)rI   r@   rC   rD   r*   r<   r   r   r   stopx   s   zProgress.stopN)r   )r,   F)	__name__
__module____qualname____doc__r+   staticmethodr(   rI   rK   r   r   r   r   r"   5   s    

$r"   c                   @   s"   e Zd ZdZdddZdd ZdS )	DummyProgressz!
    Does not print anything
    Fc                 C      d S r   r   )r*   r<   rE   r   r   r   rI         zDummyProgress.updatec                 C   rS   r   r   rJ   r   r   r   rK      rT   zDummyProgress.stopNrL   )rM   rN   rO   rP   rI   rK   r   r   r   r   rR      s    
rR   Z ACGTUMRWSYKVHDBNacgtumrwsykvhdbnZ TGCAAKYWSRMBDHVNtgcaakywsrmbdhvnsc                 C   s   |  td d d S N)	translate_REVCOMP_TRANS)rU   r   r   r   reverse_complement   s   rZ   sequencec                 C   s6   | j d u rd }n| j d d d }t| jt| j|S rV   )	qualitiesdnaioSequencenamerZ   r[   )r[   r\   r   r   r   reverse_complemented_sequence   s   
r`   c                   @   sV   e Zd ZddedefddZdd Zd	d
 Zdedee fddZ	dd Z
dd ZdS )
FileOpener   Ncompression_levelthreadsc                 C   s   || _ || _dS )z
        threads -- no. of external compression threads.
            0: write in-process
            None: min(cpu_count(0, 4)
        N)rc   rd   )r*   rc   rd   r   r   r   r+      s   
zFileOpener.__init__c                 C   s8   d|v r| j nd}t||| j|d}td||| |S )Nwr   )compresslevelrd   z1Opening '%s', mode '%s' with xopen resulted in %s)rd   r   rc   loggerdebug)r*   pathmoderd   r   r   r   r   r      s   zFileOpener.xopenc                 C   s   |du rdS |  ||S )z.Return opened file or None if the path is NoneNr   )r*   ri   rj   r   r   r   xopen_or_none   s   zFileOpener.xopen_or_nonepath1path2c                 C   s8   |d u r|d urt d| ||}| ||}||fS )NzWWhen giving paths for paired-end files, only providing the second file is not supported)
ValueErrorrk   )r*   rl   rm   rj   Zfile1Zfile2r   r   r   
xopen_pair   s
   zFileOpener.xopen_pairc                 O   s6   | j |d< tj|i |}td|d |d | |S )Nopenerz/Opening %r, mode '%s' with dnaio resulted in %sr   rj   )r   r]   r
   rg   rh   )r*   argskwargsr   r   r   r   
dnaio_open   s   
zFileOpener.dnaio_openc              
   O   sp   z| j |i |}W |S  ty7 } z |jtjkr+td td | j |i |}n W Y d}~|S d}~ww )z
        Open a FASTA/FASTQ file for writing. If it fails because the number of open files
        would be exceeded, try to raise the soft limit and re-try.
        z3Too many open files, attempting to raise soft limit   N)rs   r   errnoEMFILErg   rh   r!   )r*   rq   rr   r   er   r   r   dnaio_open_raise_limit   s   

z!FileOpener.dnaio_open_raise_limit)rb   N)rM   rN   rO   r   r+   r   rk   strr   ro   rs   rx   r   r   r   r   ra      s    	ra   )r   rC   r%   ru   r   loggingtypingr   r   r]   r   ImportError	getLoggerrM   rg   r   r!   r"   rR   ry   	maketransrY   rZ   r^   r`   ra   r   r   r   r   <module>   s4    
K