a
    h1                     @   s   d dl Z d dlZd dlZd dlZg d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!d" ZdS )#    N)z.faz.fasz.fastaz.seqz.fsaz.fnaz.ffnz.frnz.fqz.fastqc                 C   s8   |   dr$tdt| |S tj| |ddS d S )Nz.gzz.gzipzUTF-8zutf-8)encoding)lowerendswithcodecs	getreadergzipopen)fmode r   k/home/psgendb/BIRCHDEV/install/SPAdes-4.2.0-Linux/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 | _ d S r   )r   r   readliner   r   r   r   FillCash   s    
zReader.FillCashc                 C   s
   d | _ d S r   )r   r   r   r   r   	TrashCash!   s    zReader.TrashCashc                 C   s   |    | jS r   )r   r   r   r   r   r   Top$   s    z
Reader.Topc                 C   s   |    |  }|   |S r   )r   r   r   )r   resultr   r   r   r   (   s    zReader.readlinec                 C   sH   g }|   }|dks||r&d|S |   ||  qd|S N )r   joinr   appendstrip)r   r
   r   nextr   r   r   
ReadUntill.   s    
zReader.ReadUntillc                 C   s~   d}g }|   sd|  dkrd|t|    |krd||    |t|   7 }|   q||krttdd|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   ReadUntillFill8   s    ,
zReader.ReadUntillFillc                 C   s   |   dkS r   )r   r   r   r   r   r"   E   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d| d  |d ksHt |t |ksHJ || _|| _|| _d S )NZoppa)r#   sysstdoutwriteidseqqual)r   r.   r-   r/   r   r   r   r   J   s    zSeqRecord.__init__c                 C   s
   t | jS r   )r#   r.   r   r   r   r   __len__R   s    zSeqRecord.__len__c                 C   s
   | j | S r   )r.   )r   keyr   r   r   __getitem__U   s    zSeqRecord.__getitem__c                 C   s   | j d kr| j || S d S r   )r/   r   lrr   r   r   
QualSubseqX   s    
zSeqRecord.QualSubseqc                 C   s^   |dks|t | jkrVt| j|| | jd t|d  d t| d | ||S | S d S )Nr   (   -))r#   r.   r)   r-   strr6   r3   r   r   r   subseq]   s    @zSeqRecord.subseq)N)r&   r'   r(   r   r0   r2   r6   r<   r   r   r   r   r)   I   s
   
r)   c                 C   s0   |dv sJ |dkrt | S |dkr,t| S d S )N)fastafastqr=   r>   )parse_fastaparse_fastq)r   	file_typer   r   r   parsed   s
    rB   c                 c   sd   t | }| s`|  }t|dk s4|d dkr<td|dd }t||dd  V  qd S )Nr8   r   >z {FILE} is not a valid FASTA filec                 S   s
   |  dS )NrC   
startswithsr   r   r   <lambda>r       zparse_fasta.<locals>.<lambda>)r   r"   r   r   r#   r$   r!   r)   )r   readerrec_idrec_seqr   r   r   r?   l   s    r?   c                 c   s   t | }| s|  }t|dk s4|d dkr<td|dd }| }t|dk sj|d dkrrtd|t|}t||dd  |V  qd S )Nr8   r   @z {FILE} is not a valid FASTQ filec                 S   s
   |  dS )N+rD   rF   r   r   r   rH   |   rI   zparse_fastq.<locals>.<lambda>rN   )	r   r"   r   r   r#   r$   r!   r%   r)   )r   rJ   rK   rL   tmpZrec_qualr   r   r   r@   v   s    r@   c                 C   sx   |dkr.| d| j d  | | jd  nF|dkrt| d| j d  | | jd  | d | | jd  d S )Nr=   rC   
r>   rM   z+
)r,   r-   r.   r/   )recr   rA   r   r   r   r,      s    
r,   c                 C   s(   t | |D ]}||r
t||| q
d S r   )rB   r,   )input_handleroutput_handlerr
   rA   contigr   r   r   FilterContigs   s    rU   c                 C   s   t | dD ]v}d}|t|k r4|| dkr4|d7 }qt|}||kr^||d  dkr^|d8 }q<||kr
tt|j|| |j q
d S )Nr=   r   Nr8   )rB   r#   r,   r)   r.   r-   )rR   rS   rT   r4   r5   r   r   r   RemoveNs   s    

rW   c                 C   sB   |   } tj| \}}|dvr*| d }}tj|\}}||v S )Nr   r   )r   ospathsplitext)fnameZextension_listZbasename_plus_innerextZ	outer_extbasenameZ	inner_extr   r   r   check_extension   s    
r]   c                 C   s
   t | tS r   )r]   	fasta_ext	file_namer   r   r   is_fasta   s    ra   c                 C   s
   t | tS r   )r]   	fastq_extr_   r   r   r   is_fastq   s    rc   c                 C   s   t | dgS )Nz.bamr]   r_   r   r   r   is_bam   s    re   c                 C   s   t | dgS )Nz.srard   r_   r   r   r   is_sra   s    rf   c                 C   s8   t | rdS t| rdS t| r$dS t| r0dS d S d S )Nr>   r=   bamsra)rc   ra   re   rf   r_   r   r   r   get_read_file_type   s    ri   )r   r   r*   rX   r^   rb   r   r   r)   rB   r?   r@   r,   rU   rW   r]   ra   rc   re   rf   ri   r   r   r   r   <module>   s(   1
