o
    Uݢg                     @  s  U 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
eejejedZded< ed	 ed
 ed gZed Zed Zed Zed Zed Zed ZeegZdZed ed ed ed gZed ed eege Zed ed ed ed gZed ed ed ge Zee Zed  ed! ed" ed# gZ ed$d%gZ!e"e# Z$d&Z%d'Z&d(Z'd<d+d,Z(d=d.d/Z)d>d1d2Z*G d3d* d*eZ+e,e-e+f Z.d?d6d7Z/d@d:d;Z0dS )A    )annotationsN)OrderedDict)	TypedDict)GENE_EXPRESSION_LIBRARY_TYPEzchemistry_defs.jsonzdict[str, ChemistryDef]CHEMISTRY_DEFSzSC3Pv3HT-polyAzSC3Pv3HT-CS1ZSC5PHTZSC3Pv3LTzSC-FBZSPATIAL3Pv1zARC-v1zSC3Pv3-polyAz
SC3Pv3-CS1ZSC3Pv4zSC3Pv4-polyAz
SC3Pv4-CS1zSC3Pv4-polyA-OCMzSC3Pv4-CS1-OCMZSC3Pv1ZSC3Pv2z
SC5P-PE-v3z
SC5P-R2-v3zSC5P-R2-OCM-v3z
SC5P-R1-v3zSC5P-PEzSC5P-R2zSC5P-R1ZSCVDJzSCVDJ-R2zSCVDJ-v3zSCVDJ-R2-v3)Z
threeprimeZ	SC3P_auto)Z	fiveprimeZ	SC5P_autocustomdescriptionnamereturnChemistryDefc                   sZ   t     fddtD }t|dkrtd  t|dkr)td  |d S )z5Returns a chemistry definition dict for a given name.c                   s   g | ]
}|d   kr|qS r	    .0nr   r   c/oak/stanford/groups/akundaje/marinovg/programs/cellranger-9.0.1/lib/python/cellranger/chemistry.py
<listcomp>o       z!get_chemistry.<locals>.<listcomp>r   zCould not find chemistry named    z%Found multiple chemistries with name )CHEMISTRY_ALIASESgetDEFINED_CHEMISTRIESlen
ValueError)r	   chemistriesr   r   r   get_chemistryk   s   r   strc                   sN    fddt D }t|dkrtd  t|dkr#td  |d S )zMGiven all the loaded chemistries, return the one with a matching description.c                   s   g | ]
}|t   kr|qS r   )CHEMISTRY_DESCRIPTION_FIELDr   r   r   r   r   y   r   z2get_chemistry_from_description.<locals>.<listcomp>r   z*Could not find chemistry with description r   z,Found multiple chemistries with description )r   r   r   )r   r   r   r   r   get_chemistry_from_descriptionw   s   r   
None | strc                 C  s<   t | }d}||}|durt|dkr|d dS dS )a0  Try to load a chemistry whitelist from a description of a chemistry.

    Args:
        description:

    Returns:
        the whitelist if it's a simple chemistry or None, since we don't enforce that a whitelist exists for all
        chemistries explicitly in code
        (it's just a JSON file).
    barcodeNr   r   	whitelist)r   r   r   )r   chemr!   Zbarcode_sectionr   r   r   -get_whitelist_name_from_chemistry_description   s   
r$   c                   @  sR   e Zd ZU dZded< ded< ded< ded< d	ed
< ded< ded< ded< dS )r   zA chemistry definition.r   r	   r   z+list[dict[str, int | str | dict[str, str]]]r!   zlist[dict[str, int | str]]Zumizdict[str, int | str | None]rnaz"dict[str, int | str | None] | NoneZrna2Z	endednessZstrandednessN)__name__
__module____qualname____doc____annotations__r   r   r   r   r      s   
 chemistry_defsChemistryDefsc              
   C  sJ   t | dkrtt|  S z| t W S  ty$ } ztd|d}~ww )a  Return the only chemistry definition when there is only one.

    Return the GEX chemistry definition when there are multiple.
    Fail when there are multiple chemistry definitions and no GEX.

    This matches the implementation in the Rust ChemistryDefs type.
    r   z"no gene expression chemistry foundN)r   nextitervaluesr   KeyErrorr   )r+   excr   r   r   get_primary_chemistry_def   s   

r2   defsset[str]c                 C  sX   t  }|  D ]"}|d d }|d dksJ |d d }t|ts$J || q|S )zEGet all gel bead whitelists from the provided dict of chemistry defs.r!   r   kindZgel_beadr"   r	   )setr/   
isinstancer   add)r3   Z
whitelistsr#   Zbarcode_read_componentr"   r   r   r   "get_whitelists_from_chemistry_defs   s   r9   )r
   r   )r   r   r
   r   )r   r   r
   r    )r+   r,   r
   r   )r3   r,   r
   r4   )1
__future__r   jsonoscollectionsr   typingr   cellranger.rna.libraryr   loadopenpathjoindirname__file__r   r*   HT_CHEMISTRIESCHEMISTRY_SC3P_LTZCHEMISTRY_SC_FBZCHEMISTRY_SPATIAL3P_V1ZCHEMISTRY_ARC_V1ZCHEMISTRY_SC3P_V3_POLYAZCHEMISTRY_SC3P_V3_CS1SC3P_V3_CHEMISTRIESZSC3P_V4_PREFIXSC3P_V4_CHEMISTRIESZSC3P_CHEMISTRIESSC5P_V3_CHEMISTRIESSC5P_CHEMISTRIESZSC_GEMX_CHEMISTRIESZSCVDJ_CHEMISTRIESr   listr/   r   ZCUSTOM_CHEMISTRY_NAMEr   ZCHEMISTRY_NAME_FIELDr   r   r$   r   dictr   r,   r2   r9   r   r   r   r   <module>   s   
	




