o
    Uݢg-                     @  s  d dl mZ d dlZd dlZd dlmZ d dlmZ d dlm	Z	 e	r(d dl
mZ dZdZd	Zd
ZdZdZdZdZeZdZeZdZdZdZdZdZdZdZdZdZdZ eeeeegZ!eeeegZ"edeeeeeeeeeeiZ#edeeeeeeeeeeiZ$G dd deZ%G dd deZ&G dd dZ'd Z(d!Z)d>d(d)Z*d?d*d+Z+d?d,d-Z,d@d/d0Z-dAd2d3Z.d4d5 Z/dBd6d7Z0dCd:d;Z1d<d= Z2dS )D    )annotationsN)Iterable)Enum)TYPE_CHECKING)SequencingLibraryzGene ExpressionzCRISPR Guide CapturezAntibody CapturezAntigen CapturezMultiplexing CaptureZFEATURETESTZCustomVDJZmultiZCRISPRzCRISPR:ZANTIBODYz	Antibody:ZANTIGENzAntigen:ZMULTIPLEXINGzMultiplexing:library_type c                   @     e Zd ZdZdZdS )	ReadLevelRTLOHN)__name__
__module____qualname__r   r    r   r   e/oak/stanford/groups/akundaje/marinovg/programs/cellranger-9.0.1/lib/python/cellranger/rna/library.pyr   M       r   c                   @  r
   )	CellLevelCMOHashtagN)r   r   r   r   r   r   r   r   r   r   R   r   r   c                   @  s:   e Zd ZdZdddZdd Zdd	 Zd
d Zdd ZdS )BarcodeMultiplexingTypezYA class representing the multiplexing type, which can either be cell-level or read-level.valuestrc                 C  s   |t jjkrd| _t j| _d S |t jjkrd| _t j| _d S |tjjkr-d| _tj| _d S |tjjkr<d| _tj| _d S t	d)Nr   r   z(Invalid type for BarcodeMultiplexingType)
r   r   r   leveltyper   r   r   r   
ValueError)selfr   r   r   r   __init__Z   s   z BarcodeMultiplexingType.__init__c                 C  s   | j jS N)r   r   r   r   r   r   __str__j   s   zBarcodeMultiplexingType.__str__c                 C  s:   | j dkr| jtjkrtS | jtjkrtS tdtd)zIReturns the library associated with a given cell-level multiplexing type.r   z*Invalid CellLevel BarcodeMultiplexingType!zCMultiplexing library is undefined for this BarcodeMultiplexingType!)r   r   r   r   MULTIPLEXING_LIBRARY_TYPEr   ANTIBODY_LIBRARY_TYPEr   r    r   r   r   multiplexing_library_typem   s   
z1BarcodeMultiplexingType.multiplexing_library_typec                 C  
   | j dkS )Nr   r   r    r   r   r   is_cell_multiplexedy      
z+BarcodeMultiplexingType.is_cell_multiplexedc                 C  r%   )Nr   r&   r    r   r   r   is_read_multiplexed|   r(   z+BarcodeMultiplexingType.is_read_multiplexedN)r   r   )	r   r   r   __doc__r   r!   r$   r'   r)   r   r   r   r   r   W   s    
r   Ztarget_set_name)r	   Nlib_typer   sep
prefix_mapdict[str, str]returnc                 C  s    | t krdS || | }|| S )Nr	   )GENE_EXPRESSION_LIBRARY_TYPEget)r+   r,   r-   r   r   r   r   _get_prefix   s   r2   c                 C     t | dtS )z/Get the metric prefix for a given library type._)r2   metric_prefix_mapr+   r   r   r   get_library_type_metric_prefix      r7   c                 C  r3   )z0Gets the prefix to be used in displayed reports. )r2   report_prefix_mapr6   r   r   r   get_library_type_report_prefix   r8   r;   metricc                 C  s   t  d|  S )z=Appends the prefix for cumulative metrics onto a metric name.r4   )MULTI_REFS_PREFIX)r<   r   r   r   add_multi_prefix      r>   speciesc                 C  s   |  d| S )z=Append the species/genome name to the front of a metric name.r4   r   )r@   r<   r   r   r   add_species_prefix   r?   rA   c                 C  sB   | j d }g }|D ]}td|}|r|t|d q	|S )zGet the library info from a BAM's comment lines.

    Args:
      bam (pysam.AlignmentFile): BAM file

    Returns:
      list of dicts
    ZCOz^library_info:(.+)$   )headerrematchappendjsonloadsgroup)Zbamcomments	librariescommentmr   r   r   get_bam_library_info   s   
	rN   c                 C  s   | t kS )z)Do genomes make sense for a library type.)r0   )r   r   r   r   has_genomes   s   rO   library_infoIterable[SequencingLibrary]c                 C  s   t dd | D S )z4Sorted list of unique library types in library_info.c                 S  s   h | ]}|t  qS r   )LIBRARY_TYPE).0libr   r   r   	<setcomp>   s    z'sorted_library_types.<locals>.<setcomp>)sorted)rP   r   r   r   sorted_library_types   s   rW   c                 C  s   t | v o	| t  tvS r   )TARGET_SET_KEYDEFAULT_TARGET_SETS)libraryr   r   r   has_target_set   s   r[   )r+   r   r,   r   r-   r.   r/   r   )r+   r   r/   r   )r<   r   r/   r   )r@   r   r<   r   r/   r   )r   r   )rP   rQ   )3
__future__r   rG   rD   collections.abcr   enumr   typingr   Zcellranger.sample_bagr   r0   CRISPR_LIBRARY_TYPEr#   ANTIGEN_LIBRARY_TYPEr"   FEATURETEST_LIBRARY_TYPECUSTOM_LIBRARY_TYPEVDJ_LIBRARY_TYPEZDEFAULT_LIBRARY_TYPEr=   ZCUSTOM_METRIC_PREFIXZDISPLAY_PREFIX_CUSTOMZCRISPR_METRIC_PREFIXZDISPLAY_PREFIX_CRISPRZANTIBODY_METRIC_PREFIXZDISPLAY_PREFIX_ANTIBODYZANTIGEN_METRIC_PREFIXZDISPLAY_PREFIX_ANTIGENZMULTIPLEXING_METRIC_PREFIXZDISPLAY_PREFIX_MULTIPLEXINGrR   ZRECOGNIZED_FEATURE_TYPESZFEATURE_LIBRARY_TYPESr5   r:   r   r   r   rX   rY   r2   r7   r;   r>   rA   rN   rO   rW   r[   r   r   r   r   <module>   s   
*






