3
O_                 @   s   d dl Z d dlZd dlZd dlZdddddddd	gZd
dgZdd 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 Zdd Zdd Zd d! Zd"d# Zd$d% Zd&d' ZdS )(    Nz.faz.fasz.fastaz.seqz.fsaz.fnaz.ffnz.frnz.fqz.fastqc             C   s8   | j  jdr$tjdtj| |S tj| |ddS d S )N.gz.gzipzUTF-8zutf-8)encoding)r   r   )lowerendswithcodecs	getreadergzipopen)fmode r   b/home/psgendb/BIRCHDEV/pkg/SPAdes-3.15.4/linux-x86_64/share/spades/spades_pipeline/common/SeqIO.pyOpen   s    r   c               @   sL   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dS )Readerc             C   s   || _ d | _d S )N)handlercash)selfr   r   r   r   __init__   s    zReader.__init__c             C   s   | j d kr| jj | _ d S )N)r   r   readline)r   r   r   r   FillCash   s    
zReader.FillCashc             C   s
   d | _ d S )N)r   )r   r   r   r   	TrashCash    s    zReader.TrashCashc             C   s   | j   | jS )N)r   r   )r   r   r   r   Top#   s    z
Reader.Topc             C   s   | j   | j }| j  |S )N)r   r   r   )r   resultr   r   r   r   '   s    zReader.readlinec             C   sL   g }x<| j  }|dks||r(dj|S | j  |j|j  qW dj|S )N )r   joinr   appendstrip)r   r   r   nextr   r   r   
ReadUntill-   s    
zReader.ReadUntillc             C   s   d}g }x`| j   rh| j dkrh|t| j j  |krh|j| j j  |t| j j 7 }| j  q
W ||krztddj|S )Nr   r   zThe sequence and quality strings for one of reads have different length in file {FILE}. Please check the correctness of the file)EOFr   lenr   r   r   	Exceptionr   )r   Zbuf_sizeZcntr   r   r   r   ReadUntillFill7   s    0zReader.ReadUntillFillc             C   s   | j  dkS )Nr   )r   )r   r   r   r   r    D   s    z
Reader.EOFN)__name__
__module____qualname__r   r   r   r   r   r   r#   r    r   r   r   r   r      s   
r   c               @   s6   e Zd ZdddZdd Zdd Zdd	 Zd
d ZdS )	SeqRecordNc             C   s^   |d kr,t |t |kr,tjjd| d  |d ksHt |t |ksHt|| _|| _|| _d S )NZoppa)r!   sysstdoutwriteAssertionErroridseqqual)r   r-   r,   r.   r   r   r   r   I   s    zSeqRecord.__init__c             C   s
   t | jS )N)r!   r-   )r   r   r   r   __len__Q   s    zSeqRecord.__len__c             C   s
   | j | S )N)r-   )r   keyr   r   r   __getitem__T   s    zSeqRecord.__getitem__c             C   s   | j d kr| j || S d S )N)r.   )r   lrr   r   r   
QualSubseqW   s    
zSeqRecord.QualSubseqc             C   s^   |dks|t | jkrVt| j|| | jd t|d  d t| d | j||S | S d S )Nr   (   -))r!   r-   r'   r,   strr4   )r   r2   r3   r   r   r   subseq\   s    @zSeqRecord.subseq)N)r$   r%   r&   r   r/   r1   r4   r:   r   r   r   r   r'   H   s
   
r'   c             C   s0   |dkst |dkrt| S |dkr,t| S d S )Nfastafastq)r;   r<   )r+   parse_fastaparse_fastq)r   	file_typer   r   r   parsec   s
    r@   c             c   sh   t | }xZ|j sb|j j }t|dk s6|d dkr>td|jdd }t||dd  V  q
W d S )Nr6   r   >z {FILE} is not a valid FASTA filec             S   s
   | j dS )NrA   )
startswith)sr   r   r   <lambda>q   s    zparse_fasta.<locals>.<lambda>)r   r    r   r   r!   r"   r   r'   )r   readerrec_idrec_seqr   r   r   r=   k   s    
r=   c             c   s   t | }x|j s|j j }t|dk s6|d dkr>td|jdd }|j }t|dk sl|d dkrttd|jt|}t||dd  |V  q
W d S )Nr6   r   @z {FILE} is not a valid FASTQ filec             S   s
   | j dS )N+)rB   )rC   r   r   r   rD   {   s    zparse_fastq.<locals>.<lambda>rI   )	r   r    r   r   r!   r"   r   r#   r'   )r   rE   rF   rG   tmpZrec_qualr   r   r   r>   u   s    
r>   c             C   sx   |dkr.|j d| j d  |j | jd  nF|dkrt|j d| j d  |j | jd  |j d |j | jd  d S )Nr;   rA   
r<   rH   rI   z+
)r*   r,   r-   r.   )recr   r?   r   r   r   r*      s    
r*   c             C   s,   x&t | |D ]}||rt||| qW d S )N)r@   r*   )input_handleroutput_handlerr   r?   contigr   r   r   FilterContigs   s    rP   c             C   s   xt | dD ]~}d}x$|t|k r8|| dkr8|d7 }qW t|}x$||krf||d  dkrf|d8 }qDW ||krtt|j|| |j qW d S )Nr;   r   Nr6   )r@   r!   r*   r'   r-   r,   )rM   rN   rO   r2   r3   r   r   r   RemoveNs   s    rR   c             C   sB   | j  } tjj| \}}|dkr*| d }}tjj|\}}||kS )N.gz.gzipr   )rS   rT   )r   ospathsplitext)fnameZextension_listZbasename_plus_innerextZ	outer_extbasenameZ	inner_extr   r   r   check_extension   s    
rZ   c             C   s
   t | tS )N)rZ   	fasta_ext)	file_namer   r   r   is_fasta   s    r]   c             C   s
   t | tS )N)rZ   	fastq_ext)r\   r   r   r   is_fastq   s    r_   c             C   s   t | dgS )Nz.bam)rZ   )r\   r   r   r   is_bam   s    r`   c             C   s,   t | rdS t| rdS t| r$dS d S d S )Nr<   r;   bam)r_   r]   r`   )r\   r   r   r   get_read_file_type   s    rb   )r   r	   r(   rU   r[   r^   r   r   r'   r@   r=   r>   r*   rP   rR   rZ   r]   r_   r`   rb   r   r   r   r   <module>   s&   1
