CoolFace
Apppublic

yzhangvi/rnaseq

sourceHugging Faceupdated 3mo agoView on Hugging Face
0likes
server.cpython-314.pyc315 linesDownload Raw Back to __pycache__
1+
2��<jf����a�0t$Rt^RIHt^RIt^RIt^RIt^RIt^RIt^RI	t	^RI3t4^RIt^RIt^RI
t
^RIHtHt^RIHt^RIHt]
P*!RR]R7^RIt^RIt^RIt]!]4P;4P<tR	R5RRR
RR.RRRRRR/RRR�^.R^RRRRRRR//RR^2R R!RR"RR#R$R%R/R&.R�OR(R)R'R*RR+R//R,R-^R.^P//t R/]!R0&R1R2lt"R3R4lt#R5R6lt$R7R8lt%R�R9R:llt&R�R;R<llt'R�R=R>llt(R?R@lt)RARBlt*RCRDlt+RERFlt,RGRHlt-R�RIRJllt.RKRLlt/RMRNlt0RORPlt1RQRRlt2RSRTlt3R�RURVllt4RWRXlt5RYRZlt6R[R\lt7R]R^lt8R_R`lt9RaRblt:RcRdlt;ReRflt<R�RgRhllt=RiRjlt>RkRllt?RmRnlt@RoRpltARqRrltBR�RsRtlltCR�RuRvlltDRwRxltER�RyRzlltFR{R|ltGR}R~ltH!RR�]4tIR�R�ltJR�R�ltK]LR�8Xd6]K!4R#R#)�z?Local RNA-seq analysis web app backed by R/Bioconductor DESeq2.)�annotationsN)�SimpleHTTPRequestHandler�ThreadingHTTPServer)�Path)�Any�ignorez'cgi' is deprecated.*)�message�category�deg�padj_cutoff皙�����?�
log2fc_cutoff��?�7gene_types�protein_coding�protein_coding_only_for_labelsT�protein_coding_only_for_heatmap�"protein_coding_only_for_enrichment�volcano�xlim�8max_labels�colors�UP�#D62728�DOWN�#1F77B4�NSz#B3B3B3�heatmap�	top_genes�clip�@�low�midz#F8FAFC�high�
group_palette�#4D4D4D�group_colors�control�KO1�KO2�9enrichment�min_overlap�	max_terms�dict[str, Any]�DEFAULT_RECIPEc�$�V^8�dQhRRRRRR/#)��baser-�override�return�)�formats"� outputs/rna_seq_webapp/server.py�__annotate__r79s!����^��~��.��c�l�/pVP4F/wr4\V\4'd\V/4W#&K+WBV&K1	VP4FZwr4\V\4'd<\VP	V4\4'd\W#,V4W#&KVWBV&K\	V#�N)�items�10isinstance�dict�11deep_merge�get)r1r2�merged�key�values&&   r6r>r>9s����F��j�j�l�12���e�T�"�"�$�U�B�/�F�K��3�K�	#�13�n�n�&�14���e�T�"�"�z�&�*�*�S�/�4�'H�'H�$�V�[�%�8�F�K��3�K�	'�15�Mr8c� �V^8�dQhRRRR/#)r0�paramsr-r3r4)r5s"r6r7r7Hs������N�r8c���VPR4pV'g\\/4pMm\V\4'd&\\\16P!V44pM2\V\4'd\\V4pM\R4h\VR,PRR44VR,R&\VR,PRR44VR,R&VR,PRR.4p\V\4'g.pVUu.uF=p\	V4P4'gK$\	V4P4NK?	upVR,R&\VR	,PR17^44VR	,R18&\VR,PR^244VR,R&\VR,PR
R44VR,R
&\VR,PR^44VR,R&\VR,PR^P44VR,R&\V4V#uupi)�analysis_recipeu 分析 recipe 格式不正确。r19rrr
rrrrrrrrr r*r+r,)r?r>r.r<�str�json�loadsr=�20ValueError�float�list�strip�int�normalize_colors)rD�raw�reciper�items&    r6�parse_reciperSHs���21�*�*�&�22'�C���N�B�/��	�C��	�	��N�D�J�J�s�O�<��	�C��	�	��N�C�0���;�<�<�#(����):�):�=�$�)O�#P�F�5�M�-� �%*�6�%�=�+<�+<�_�c�+R�%S�F�5�M�/�"����"�"�<�2B�1C�D�J��j�$�'�'��23�AK�"a���s�SW�y���O`�#4�3�t�9�?�?�#4��"a�F�5�M�,��&)�&��*;�*?�*?��b�*Q�&R�F�9��l�#�%(��	�):�)>�)>�{�B�)O�%P�F�9��k�"� %�f�Y�&7�&;�&;�F�C�&H� I�F�9��f��*-�f�\�.B�.F�.F�}�VW�.X�*Y�F�<���'�(+�F�<�,@�,D�,D�[�RT�,U�(V�F�<���%��V���M��#bs�&!I�Ic� �V^8�dQhRRRR/#)r0rBrr3�boolr4)r5s"r6r7r7bs��n�n��n��nr8c��\T;'gR4p\V4^8H;'d\VPR4;'dC\;QJd#RVR,4F'dKR#	R#!RVR,44#)��#c3�*"�TF	qR9x�K	R#5i)�0123456789abcdefABCDEFNr4��.0�chs& r6�	<genexpr>�is_hex_color.<locals>.<genexpr>ds���:m�dl�^`�AY�;Y�dl�s���NNFT)rG�len�24startswith�all�rB�texts& r6�is_hex_colorrgbsj���u�{�{���D��t�9��>�m�m�d�o�o�c�2�m�m�s�s�:m�dh�ik�dl�:m�s�s�m�s�m�s�:m�dh�ik�dl�:m�7m�mr8c� �V^8�dQhRRRR/#)r0rQr-r3�Noner4)r5s"r6r7r7gs��A�A�^�A��Ar8c��\pRFfpVR,PR/4PV4p\V4'dK>VR,R,V,VR,R,V&Kh	RFfpVR,PR/4PV4p\V4'dK>VR,R,V,VR,R,V&Kh	VR,PR4p\	V\254'g.pVUu.uF!p\V4'gK\
V4NK#	pp\V4^8dVR,R,P4pW`R,R&VR,PR4p\	V\4'g/pVP4UUu/uF-wr�\V4'gK\
V4\
V4bK/	uppVR,R&R#uupiuuppi)	rrrrr$r&N)rrr)r!r"r#)r.�26setdefaultr?rgr<rLrGrb�copyr=r;)	rQ�defaultsrArB�palette�color�
clean_paletter&�groups	&        r6rOrOgs����H�#���y�!�,�,�X�r�:�>�>�s�C���E�"�"�/7�	�/B�8�/L�S�/Q�F�9��h�'��,�$�&���y�!�,�,�X�r�:�>�>�s�C���E�"�"�/7�	�/B�8�/L�S�/Q�F�9��h�'��,�&��Y��#�#�O�4�G��g�t�$�$���-4�L�W�E��U�8K�Z�S��Z�W�M�L�27�=��A�� ��+�O�<�A�A�C�
�)6�9��o�&��)�$�(�(��8�L��l�D�)�)���T`�Tf�Tf�Th�)A�Th�L�E�lx�y~�l�)?��U��S��Z�)?�Th�)A�F�9��n�%��M��)As�G;�+G;�8H�Hc�(�V^8�dQhRRRRRRRR/#)	r0�handlerr�payloadr-�statusrNr3rir4)r5s"r6r7r7~s+����3��n��VY��dh�r8c�:�\P!VRRR7PR4pVPV4VP	RR4VP	R\\
V444VP4VPPV4R#)F)�ensure_ascii�	allow_nan�utf-8�Content-Typezapplication/json; charset=utf-8�Content-LengthN)28rH�dumps�encode�
send_response�send_headerrGrb�end_headers�wfile�write)rsrtru�bodys&&& r6�
json_responser�~su���:�:�g�E�U�C�J�J�7�S�D����&�!�����(I�J����(�#�c�$�i�.�9������M�M����r8c�0�V^8�dQhRRRRRRRRRR	R29R/#)r0rsr�content�bytes�filenamerG�content_typerurNr3rir4)r5s"r6r7r7�sD��!�!�
%�!�
�!��!��	!�30
�!�31�
!r8c��VPV4VPRV4VPRRVR24VPR\\V444VP	4VP32P
V4R#)rzzContent-Dispositionzattachment; filename="�"r{N)r~rrGrbr�r�r�)rsr�r�r�rus&&&&&r6�binary_responser��sv�����&�!������5����-�1G��z�QR�/S�T����(�#�c�'�l�*;�<������M�M���� r8c�(�V^8�dQhRRRRRRRR/#)	r0rsrrrGrurNr3rir4)r5s"r6r7r7�s0��D�D�4�D�s�D�C�D�Z^�Dr8c�(�\VRRRV/V4R#)�okF�errorN)r�)rsrrus&&&r6�error_responser��s���'�D�%��'�:�F�Cr8c� �V^8�dQhRRRR/#)r0�portrNr3�	list[str]r4)r5s"r6r7r7�s����#��)�r8c��\4p\P!4p\P!W \P\P33R7FMpV^,^,pV'gKVP
R4'dK6VPRVRV24KO	\P!\P\P4;_uu_4pVPR4VP4^,pV'd/VP
R4'gVPRVRV24RRR4\T4# \dL�i;i +'giL,;i \dL<i;i))�family�typez127.zhttp://�:N)z8.8.8.8�P)
�set�socket�gethostname�getaddrinfo�AF_INET�SOCK_STREAMrc�add�OSError�34SOCK_DGRAM�connect�getsockname�sorted)r��	addresses�hostnamerR�ip�socks&     r6�local_network_addressesr��s'���%�I�
��%�%�'���&�&�x�f�n�n�SY�Se�Se�f�D��a����B��r�"�-�-��/�/��
�
���t�1�T�F�3�4�g�
�
�]�]�6�>�>�6�+<�+<�
=�
=���L�L��)��!�!�#�A�&�B��"�-�-��/�/��
�
���t�1�T�F�3�4�	>��)�����
��
��>�
=��35�
��
�sU�A"E�3E�E�(;E9�#AE&�+E&�E9�E#�"E#�&E6	�1E9�6E9�9F�Fc� �V^8�dQhRRRR/#)r0�namerGr3r4)r5s"r6r7r7�s��-�-�#�-�#�-r8c��RPR\V444pVR,;'gRP4#)rWc3�6"�TFqR9dTMRx�K	R#5i)z[]:*?/\�_Nr4r[s& r6r^�"safe_sheet_name.<locals>.<genexpr>�s���N�I�b�j�0�b�c�9�I�s�:N�N�sheet)�joinrGrM)r��cleaneds& r6�safe_sheet_namer��s5���g�g�N�C��I�N�N�G��C�L�#�#�G�*�*�,�,r8c� �V^8�dQhRRRR/#)r0rtr-r3r�r4)r5s"r6r7r7�s��5�5�>�5�e�5r8c���\P!4pVPR4;'g/pVPR4;'g/pVPR4;'g/pVPR4;'g/PR4;'g.pVPR4;'g.pVPR4;'g/p\P!VRR7;_uu_4p\P36!/VCVCP
4U	U37u.uF?wr�R	T	R38\V39\\34'd\P!V40RR7MT41/NKA	up42p	4PVRRR
7V'dC\P43!R\P!VR^R7./4PVRRR
7.p\4pVEFKp
V
PRR4pV
PR4;'g.pV'gK;\P44!V4pVP^RV4VPV4\!V
PR4;'g"VP#4^,;'gR4p\%VR24pTp^pVV9d\%VRV24pV^,
pK"VP'V4TpV'd1RVP(9d VVR,P+V4,pVPVRVR
7EKN	V'd+\P,!VRR7PVRRR
7RFSwp	pVPV	4;'g.pV'gK+\P45!V4PVRVR
7KU	RRR4VP/4#uup46p	i +'giTP/4#;i)�summaryrDrQr47r�	contrastsr*�openpyxl)�enginerArBF�rw)�index�48sheet_name�analysis_recipe_json)rw�indent�label�contrast�resultsrq�_allr��	gene_typeT��ignore_index�all_DESeq_resultsN))�go�
GO_enrichment)�kegg�KEGG_enrichment)�io�BytesIOr?�pd�ExcelWriter�	DataFramer;r<r=rLrHr|�to_excelr��insert�appendrG�splitr�r��columns�isin�concat�getvalue)rt�outputr�rDrQ�selected_gene_typesr�r*�writerrArB�flat_frames�49used_namesr�r��rows�framerqr�r1�suffix�sheet_frames&                     r6�export_deseq_workbookr��sD��
�Z�Z�\�F��k�k�)�$�*�*��G�
�[�[��
"�
(�
(�b�F�
�[�[��
"�
(�
(�b�F�"�J�J�u�-�3�3��8�8��F�L�L�"�����K�(�.�.�B�I����\�*�0�0�b�J�	����z�	2�	2�f�50���#8�W�"7��"7�"=�"=�"?�
�"?�J�C���W�z�Z_�bf�hl�am�On�On�d�j�j��U�&K�ty�z�"?�
�	51�52�(�6��9�(�53=���L�L�0�4�:�:�f�SX�ab�3c�2d�e�f�o�o��e��
p�
���"�u�54�!�H��L�L��*�5�E��<�<�	�*�0�0�b�D����L�L��&�E��L�L��J��.����u�%�����W�-�O�O�����q�1A�O�O�Z�P�E�#�u�g�T�N�3�E��D��F��:�%�'�4�&��&��(:�;���!����N�N�5�!��K�"�{�k�6I�6I�'I�)�+�k�*B�*G�*G�H[�*\�]��� � ��u�� �G�'"�*��I�I�k��5�>�>�v�U�_r�>�s�P�J�C���>�>�#�&�,�,�"�D��t����T�"�+�+�F�%�E�+�R�Q�O553�X�?�?����U
�563�	2�X�?�?���sZ�1(O	�AO�!O	�A=O	�>57O	�	AO	�"O	�AO	�AO	�(A	O	�2O	�?,O	�O	�	O(	c� �V^8�dQhRRRR/#)r0rBrr3rGr4)r5s"r6r7r7�s��A�A��A��Ar8c�v�\V4P4pV'dVP4R8wdV#R#)�nan�Unnamed)rGrM�lowerres& r6�clean_headerr��s.���u�:����D��D�J�J�L�E�1�4�@�y�@r8c� �V^8�dQhRRRR/#)r0�	file_item�cgi.FieldStorager3zMtuple[pd.DataFrame, pd.DataFrame | None, pd.DataFrame | None, dict[str, Any]]r4)r5s"r6r7r7�s��(/�(/�#3�(/�9F�(/r8c�a�VP;'gRP4pVPP4pV'g\	R4hRpRpRVP;'gRR./pVPR4'EdE\P!\P!V44pVPVR&VPUu/uFqwP4VbK	ppVP^,p	RFp58W�9gKW�,p	M	\P!WiR7pVPF�pVP4oSR9d\P!WgR7p\;QJdV3RlR4F'gKRM	R	M!V3RlR44'gKs\P!WgR7pK�	W�R59&MoVPR4'dNVPR4'dRMRp\P!\P!V4VR
7pRVR60&M\	R4hVPU
u.uFp
\V
4NK	up
VnVe+VPU
u.uFp
\V
4NK	up
VnVe+VPU
u.uFp
\V
4NK	up
VnW�WE3#uupiuup
iuup
iuup
i)rWu上传文件为空。Nr�z
uploaded file�sheets)r�c3�,<"�TF	qS9x�K	R#5ir:r4)r\�tokenr�s& �r6r^�&read_uploaded_table.<locals>.<genexpr>61s����q�/p�e�E�>�/p�s�TF�count_sheet�	�,)�sep�fileu0请上传 .xlsx、.xls、.csv 或 .tsv 文件。)z.xlsxz.xlsmz.xltxz.xltmz.xls)�counts�62raw_countsz63raw counts�count�matrix>�meta�design�sample�samples�metadata)�64annotation�geneset�gene_setr�r�r*)z.csv�.txt�.tsv)rr)r�r�r��readrJ�endswithr��	ExcelFiler�r��sheet_names�65read_excel�any�read_csvr�r�)r�r�r�r�r�info�excelr��loweredr��	candidater�r��cr�s&             @r6�read_uploaded_tabler�sR����"�"�(�(�b�/�/�1�H��n�n�!�!�#�G���0�1�1�$(�H�'+�K�&�	�(:�(:�(M�(M�o�x�Y[�\�D����E�F�F����R�Z�Z��0�1���*�*��X��27�2C�2C�D�2C�$�:�:�<��%�2C��D��'�'��*��R�I��#�%�0���S�66���u�=���%�%�D��J�J�L�E��K�K��=�=��@���s�q�/p�q�s�s�s�q�/p�q�q�q� �m�m�E�C��&�*�]��	�	�	�3�	4�	4��'�'�(8�9�9�d�s�����R�Z�Z��0�c�:��$��]���K�L�L�/5�~�~�>�~�!�l�1�o�~�>�F�N���5=�5E�5E�F�5E��L��O�5E�F�����8C�8K�8K�L�8K�1�|�A��8K�L����[�.�.��7E��,?��F��Ls�K�67K�8K�&Kc�$�V^8�dQhRRRRRR/#)r0�df�pd.DataFrame�gene_colz68str | Noner3r�r4)r5s"r6r7r7s!����|��z��Y�r8c��.pVPFypW18XdK\P!W,RR7pVP4P	4\^\
V4R,48�gKhVPV4K{	V#)�coerce��errors��?)r�r��69to_numeric�notna�sum�maxrbr�)rrr��col�valuess&&   r6�numeric_sample_columnsr!si���G��z�z���?�����r�w�x�8���<�<�>����3�q�#�f�+��*;�#<�<��N�N�3����Nr8c�$�V^8�dQhRRRRRR/#)r0r��pd.DataFrame | None�sample_colsr�r3�dict[str, Any] | Noner4)r5s"r6r7r7's#��4�4�0�4�y�4�Mb�4r8c��VeVP'dR#VPUu/uFq"P4VbK	ppVPR4;'g+VPR4;'gVPR4pVPR4;'g+VPR4;'gVPR4pVeVfR#.pVP	4Fjwrx\W�,4P
4p	\W�,4P
4p70W�9gKKV71'gKUVPRV	RV72/4Kl	\VUu0uFq�R,kK
	up4pRVRV/#uupiuupi)	Nr��	sample_idr��	conditionrq�	treatmentr��73conditions)	�emptyr�r�r?�iterrowsrGrMr�r�)r�r$rr��74sample_col�
condition_colr�r��rowr�r(r*s&&          r6�infer_metadatar0'sC����8�>�>�>��#+�#3�#3�4�#3�a�W�W�Y��\�#3�E�4����8�$�V�V��	�	�+�(>�V�V�%�)�)�I�BV�J��I�I�k�*�Z�Z�e�i�i��.@�Z�Z�E�I�I�k�DZ�M���]�2��
�D��#�#�%����S�_�%�+�+�-����*�+�1�1�3�	�� �Y�Y��K�K��6�;�	�B�C�	&�75�T�:�T�c�[�)�)�T�:�;�J��D�,�76�3�3��
5��;s�E9�E>c� �V^8�dQhRRRR/#)r0�formr�r3�list[cgi.FieldStorage]r4)r5s"r6r7r7:s ��J�J�)�J�.D�Jr8c��RV9d.#VR,p\V\4'dTMV.pVUu.uFp\VRR4'gKVNK	up#uupi)r�r�N)r<rL�getattr)r2rRr;�entrys&   r6�get_file_itemsr7:sR��
�T���	���<�D��t�T�*�*�D���E�$�I�u�e���z�4�(H�E�E�u�I�I��Is�A�Ac� �V^8�dQhRRRR/#)r0r�rGr3r4)r5s"r6r7r7Bs��	+�	+�C�	+�C�	+r8c�6�VP4pRF=pW!9gKVPV4^,P4pV'gK;Vu#	V'd%VR,P4'dVRRpK,VPR4;'gT#)�__Nz_-. )r:r��-�.�����)rMr��isdigit)r�r�r��heads&   r6�infer_group_from_sampler@Bs{���l�l�n�G�$���>��=�=��%�a�(�.�.�0�D��t���	%�77�g�b�k�)�)�+�+��#�2�,���=�=�� �*�*�F�*r8c�$�V^8�dQhRRRRRR/#)r0r�r#r$r�r3zdict[str, str]r4)r5s"r6r7r7Ns(��I�I�!4�I�9�I�Q_�Ir8c�|�\W4pVf/#VR,Uu/uFq3R,VR,bK	up#uupi)Nr�r�r()r0)r�r$�inferredr/s&&  r6�metadata_group_maprDNsB���h�4�H����	�7?��7G�H�7G���M�3�{�+�+�7G�H�H��Hs�9c�(�V^8�dQhRRRRRRRR/#)r0r�rG�batch�usedzset[str]r3r4)r5s"r6r7r7Us(��78�79�S�80��81�H�82��83r8c�~�TpW29dVRV2p^pTpW29dVRV2pV^,
pKVPV4V#)r:r�)r�)r�rFrGrr�r1s&&&   r6�unique_sample_namerIUsX���I����g�R��v�&�	�
�F��D�84�85��f�A�f�X�&�	��!����H�H�Y���r8c�$�V^8�dQhRRRRRR/#)r0�86file_itemsr3�batch_overrideszlist[dict[str, Any]] | Noner3r-r4)r5s"r6r7r7bs+��p�p�&�p�0�p��pr8c�L�V'g\R4h.p.p.p.p\4pT;'g.p\V^R7EF�wrx\V4wr�r�V^,87\	V48dW^,88,M/p
\V
P
R4;'g*\VR,4P;'gRV24P4pRV	P9dRMV	P^,p\W�4pV'g\VR,R24h\V89V4p/pVFXp\VW�4pVVV&TPRTRTRTRVP
V4;'g\V4R	VR,/4KZ	V	PUu.uFpVV9gKVV8wgKVNK	ppV.V,V,pV	V,P!4P#VR/VCR907pVPV4R)Uu.uFpVVP9gKVNK	pp\	V4^8�d)VP!VV,P%R44Ve"\'V4pVeVP!V4TPRVR,RTRVP
RR	4R
VUu.uFpVV,NK	upRV/4EK�	\V^,R,P)\9144pVR,F/pV\VR,P)\9244,pK1	V'g\R4hRp.pVEFpVP!4pVR,P)\934VR&VVR,P+V4,P%RRR7pVUu.uF&pVR,VP9gKVR,NK(	ppVPUu.uFpVV9gKVR8wgKVNK	ppV'd!VPVR.V,,4VR.V,,pVfTMVP-VRRR7pEK	Vf\R4hRp V'dl\.P0!VRR7p V P3R\4P64P9RRR7P;4p VP-V RRR7pRp!VU"u.uF*p"0R*mP=V"P4'gK(V"NK,	p#p"V#'d'\.P0!V#RR7P%4p!VUu.uFpVR,NK	ppVFDp\.P>!VV,RR7PA^4PC^R7VV&KF	\EVUu0uFpVR,kK	upRR 7p$R!VR"VR#VR$V$R%V R&V!R'VR(\	V4/#uupiuupiuupiuupiuupiuup"iuupiuupi)+�'请选择一个或多个数据文件。)�startrFr��geneu' 没有检测到 raw count 样本列。r��original_samplerqr�)r�Nr�r��original_samplesr`u;多个文件之间没有共同 gene,无法合并分析。�first)�keep�inner��on�howu没有可合并的数据。Tr�rWF)�as_index�leftrr�r�c�H�VP4R8gVP43#)r'r[)rBs&r6�<lambda>�*prepare_uploaded_dataset.<locals>.<lambda>�s��5�;�;�=�\e�Ke�gl�gr�gr�gt�Jur8�rAr�r$�sample_meta�groups�gene_annotation�term_annotation�	file_info�common_gene_count)rP�	gene_namer��
entrezgene_id>rP�term_idr	�	term_name)#rJr��	enumeraterrbrGr?r�stemrMr�r!rDrIr�r@rl�rename�drop_duplicates�standardize_annotation_columns�astyper��merger�r��replace�npr��groupbyrS�issubsetr�fillnarr�)%rKrL�tables�all_metarrd�used_samplesr�rRr�r��sheet_annotationrr2rFrr$�	group_maprlr��renamedr�annotation_cols�	keep_cols�table�local_annotation_cols�standardized�common_genesr@�annotation_framesr/�compactrbrcr��term_framesras%&&                                   r6�prepare_uploaded_datasetr�bs�����B�C�C�!#�F�%'�H�&(�K�&(�I� �U�L�%�+�+��O� ��1�5�5���3F�t�3L�0��*�16���S��=Q�1Q�?�1�9�-�WY���H�L�L��)�[�[�T�$�z�2B�-C�-H�-H�[�[�e�TY�SZ�O�\�b�b�d��#�v�~�~�5�6�6�>�>�!�;L��,�V�>�����Z� 0�1�1X�Y�Z�Z�&�x��=�	�!#��!�F�(���E�G�$�F�6�N��O�O��g�%�v��U��Y�]�]�6�2�U�U�6M�f�6U��D��,��
�"��~�~�94�%���+�%�
�*-��/�
�C�%�	�95�96�J��0�;�>�	��y�!�&�&�(�/�/��6�8T�V�8T�/�U���
�
�e��0c� |�0c��gj�ns�n{�n{�g{���0c�� |��$�%��)����u�%:�;�K�K�F�S�T��'�9�:J�K�L��'��"�"�<�0�����D��,����t�x�x�
�v�>���E��v�F�6�N�N��E�"�K�
�	97�S6�f�v�a�y��(�/�/��4�5�L��������E�&�M�0�0��5�6�6�����V�W�W�"&�F������98�99����f�
�,�,�S�1��f�
��e�F�m�(�(��6�7�G�G��U\�G�]��08�[���C��M�U�]�]�<Z�}�s�8�}�}���[�*/�-�-�d�-�3�3�k�;Q�3�VY�]c�Vc�3�3�-��d���$�$�U�F�8�o�+E�%F�G����;�.�/��"�N�����W��U\��0]����~��6�7�7��O���)�)�$5�D�I��)�1�1�"�b�f�f�=�E�E�f�W\�E�]�c�c�e�����o�&�f��E���O�&1�z�k�U�5a�5j�5j�kp�kx�kx�5y�5�5�k�K�z���)�)�K�d�C�S�S�U��,4�5�H�S�3�x�=�=�H�K�5����m�m�F�3�K��A�H�H��K�P�P�WX�P�Y��s����X�6�X�c�S��\�\�X�6�<u�
v�F��&��{��x��&��?��?��Y��S��.�	�	��C100��!}��F��"\��d�� {��6��7sZ�	W>�*W>�3W>�X�$X�6X�?X
�
X
�;	X�	X�X�<%X�&X� X�X!c� �V^8�dQhRRRR/#)r0�pvalues�101np.ndarrayr3r4)r5s"r6r7r7�s����z��j�r8c�h�\P!V\R7p\P!V4p\P!V4pVP4'gV#\P!V4^,pV\P!W,4,pW,\V4,\P!^\V4^,4,p\PPVRRR1,4RRR1,p\P!V^^4W&V#)��dtypeNr=)
rr�asarrayrK�	ones_like�isfiniter102�where�argsortrb�arange�minimum�103accumulater)r��adjusted�finite�idx�order�rankeds&     r6�	bh_adjustr��s����j�j���.�G��|�|�G�$�H�
�[�[��
!�F��:�:�<�<���104�(�(�6�105�1�106�C���107�108�7�<�(�)�E�
�^�c�%�j�
(�2�9�9�Q��E�109�Q��+G�
G�F�
�Z�Z�
"�
"�6�$�B�$�<�
0��2��
6�F��g�g�f�a��+�H�O��Or8c� �V^8�dQhRRRR/#)r0�zr�r3r4)r5s"r6r7r7�s��_�_�*�_��_r8c���\P!VUu.uFFp\P!\	\V44\P!^4,4NKH	up\110R7#uupi)r0r�)rr�array�math�erfc�absrK�sqrt)r�rBs& r6�normal_two_sided_pr��sE��
�8�8�a�P�a�U�T�Y�Y�s�5��<�0�4�9�9�Q�<�?�@�a�P�X]�^�^��Ps�AA.c� �V^8�dQhRRRR/#)r0r�rr3z	pd.Seriesr4)r5s"r6r7r7�s��
4�
4�l�
4�y�
4r8c��VP\R7pV^8�P^R7pW,pVP^,^8�di\P111!\P!\P!V4^R74pW4R,,p\P!V^R7pMTVP^R7pV^8�P4'd \P!Ww^8�,4MRpWx,p\P!\P!V4V^8�,VR4p\P!W`PR7#)r���axisr�r�):NNNN)�to_numpyrKrd�shaperr�exp�mean�log�medianrr112r�r�r��Seriesr�)	r�r��positive_all�usable�	geo_means�ratios�factors�totals�median_totals	&        r6�median_ratio_size_factorsr��s���
�_�_�5�_�
)�F��Q�J�#�#��#�+�L�
�
!�F�
�|�|�A��!���F�F�2�7�7�2�6�6�&�>��:�;�	��G�,�,���)�)�F��+�������#��9?�!��8H�8H�8J�8J�r�y�y���113�!3�4�PS���'���h�h�r�{�{�7�+�w��{�;�W�c�J�G�
�9�9�W�N�N�3�3r8c114�,�V^8�dQhRRRRRRRRRR	/#)115r0r�rrrG�group_ar��group_br3�!tuple[pd.DataFrame, pd.DataFrame]r4)r5s"r6r7r7�s:��6�6��6��6��6��	6�116'�6r8c���W#,pW.V,,P4pWQ,P\4PP4WQ&WUV,P	R4,PV.RR7pVFBp\P!WV,RR7P^4P^R7WV&KD	WT,p\V4pVPV^R7p	W�,p117W�,pV118P^R7pVP^R7p
V	P^R7p\P!V
R,VR,,4p\P!V	R,4pVV,pVV,pVP^^R7P^4pVP^^R7P^4p^V^,,^V
^,,,\ P"!^4^,,p\P$!V\'\)V4^4,V\'\)V4^4,,V,4p\P*!\P,!V4VR	8�,VR4pVV,p\/V4p\1V4pV	P^^R7V,119\P2!V^,R	4,P^R7p\P4!R120WQ,P74RVP74RVP74R
V
P74RVP74RVRVRVRVRVP74/1214P9.RO.ROR7pV	P;^R122WQ,P744VV	3#)rWrS)�subsetrTrrr[r�r)r��ddofg��&�.>rP�baseMean�meanA�meanB�log2FoldChange�lfcSE�stat�pvalue�padj�123dispersion��	ascending)r�r�r��TTF)rlrorGrM�nermr�rrurr��divr�rr�log2�varr�r�r�rrbr�r�r�r��maximumr�r��sort_valuesr�)r�rr�r��selectedrPr�count_matrix�size_factors�124normalized�a�b�mean_a�mean_b�	base_mean�log2_fc�log_norm�log_a�log_b�var_a�var_b�
poisson_floor�ser�r�r�r�r�s&&&&                        r6�run_differential_expressionr��s$��� �H�125��h�&�126'�127,�128,�129.�C��M�(�(��-�1�1�7�7�9�C�M�130
�(�m���r�"�131#�1323�1333�H�:�G�1343�135T�C����=�=���(�;�B�B�1�E�J�J�QR�J�S�����=�L�,�\�:�L��!�!�,�Q�!�7�J���A���A�
�V�V��V�^�F�
�V�V��V�^�F����Q��'�I��g�g�v��|����5�6�G��w�w�z�C�'�(�H��W��E��W��E��I�I�1�1�I�%�,�,�Q�/�E��I�I�1�1�I�%�,�,�Q�/�E��&�1�*�%��V�a�Z�(8�8�T�X�X�a�[�A�=M�N�M�	�����S��\�1�-�-���C��L�!�8L�0L�L�}�\�	]�B�	���"�+�+�b�/�R�$�Y�/��S�	9�B��R�<�D�
��
%�F��V��D��>�>�q�q�>�1�I�=����I�YZ�N�\`�Aa�a�g�g�no�g�p�J��l�l��C�M�*�*�,��	�*�*�,��V�_�_�&��V�_�_�&��g�.�.�0��R��D��f��D��*�-�-�/�	136�
��k�0�<O�k�P�����a����!7�!7�!9�:��J��r8c�$�V^8�dQhRRRRRR/#)r0r�rr$r�r3r4)r5s"r6r7r70s!������I��,�r8c�t�W,P4pVFBp\P!W#,RR7P^4P	^R7W#&KD	\V4pVP
V^R7pVP^RVR,P\4P44V#)rrr[r�rP)rlr�rrurr�r�r�rorGr�)r�r$r�rr�r�s&&    r6�normalize_all_countsr�0s����&�+�+�-�L����M�M�,�*;�H�M�T�T�UV�W�\�\�cd�\�e����,�\�:�L��!�!�,�Q�!�7�J����a�����!6�!6�s�!;�!D�!D�!F�G��r8c�(�V^8�dQhRRRRRRRR/#)r0r�rr�rQr-r3r4)r5s"r6r7r7:s)������|��^��`l�r8c��RUu.uFq3VP9gKVNK	ppV'd5VR.V,,PR4pVPVRRR7pRVP9d
VR,VR&VR,PR4P	\1374VR&\P!VR,P138P4PR4VR,VR,4VR&RVP9dRVR&VR,PR4P	\1394VR&RVR&\VR	,R140,4p\VR	,R,4pRVPVR
,V8VR,V8�,R3&RVPVR
,V8VR,V)8,R3&V#uupi)rfr�rPrZrVrW�display_gener�141regulationr142r
rrr�r�r�rfr�rg)r�rmrprurorGrrr�rMr�rK�loc)r�r�rQrr|r�	fc_cutoffrs&&&     r6�annotate_de_resultsr�:s���&Q�k�&Q�s�\b�\j�\j�Uj�s�s�&Q�O�k���V�H��6�7�G�G��O�143��-�-�144�v�6�-�B���'�/�/�)�&�v�����"�;�/�6�6�r�:�A�A�#�F�G�K�� �h�h�w�{�';�'?�'?�'E�'E�'G�'J�'J�2�'N�PW�Xc�Pd�fm�nt�fu�v�G�N���'�/�/�)�!����"�;�/�6�6�r�:�A�A�#�F�G�K�� �G�L���f�U�m�O�4�5�I���u�
�m�4�5�K�ko�G�K�K����;�.�7�;K�3L�y�3X�Y�[g�g�h�lr�G�K�K����;�.�7�;K�3L�PY�z�3Y�Z�\h�h�i��N��!ls145�G�Gc�(�V^8�dQhRRRRRRRR/#)r0r�rr`�list[dict[str, str]]r$r�r3r4)r5s"r6r7r7Ns/������DX��gp��vB�r8c�~�\P!VPR4V,P\4R,4p\146P!VUu/uFqDR,VR,bK	up4pVP^R7pVP4pVPV,P4FqpVU	u.uFq�V	,V8XgKV	NK	p147p	V148'gK-W:,P^R7pW:,PV^R7PV^R7Wz&Ks	V#uupiuup	i)rPrr�rFr�)
rrr��	set_indexrorKr�r�r�rlr��unique�subr�)r�r`r$�149log_matrixr/�batches�overall�	correctedrFr��
batch_samples�150batch_means&&&         r6�batch_correct_log_matrixr�Ns������-�-�f�5�k�B�I�I�%�P�SV�V�W�J��i�i��L���X���G��4��L�M�G��o�o�1�o�%�G����!�I����[�)�0�0�2��.9�V�k�F�V�_�PU�=U���k�
�V����.�3�3��3�;�151�#-�#<�#@�#@��RS�#@�#T�#X�#X�Y`�gh�#X�#i�	� �3����M��Ws�D5�D:�D:c�8�V^8�dQhRRRRRRRRR	R152RR153RR
RR
/#)r0r�r�contrast_results�list[dict[str, Any]]r`r��
control_grouprG�	ko_groupsr�r$rQr-r3r4)r5s"r6r7r7\sX��3�3��3�*�3�&�3��	3�154�3��
3�
�3��3r8c�`aa�.pVR,PR4;'g.pVF�p	\P!V	R,4p155V156P'dK4V157R,R8gpV'dxRV158P9dgV159R,P\4PP4P4'dW�R,PV4,pVPV160PV.RO3,4K�	V'g
R	.R161.RVR.R
./#\P!VRR7PR4PR4P\!VR,R,44pVP'd
R	.R162.RVR.R
./#V^/oSP#\%V4U
Uu/uFwr�W�^,bK	upp
4VUu/uFq�R,VbK	upo\'VUu.uFpSV,R,S9gKVNK	upVV3RlR7p\)WV4pVPVR,V3,pVP+^R7pVP-^R7P/^^4p\1VR,R,4pVP3V^R7P5V^R7P7V)V4pR	VR,P\4P94R163VR,P\4P94RTRVUu.uFpSV,R,NK	upRVUu.uFpSV,R,NK	upR
VP;^4P<P94/#uupp
iuupiuupiuupiuupi)r164rr�r�rr�rPr�r��genes�gene_idsr�rar�Tr�rrr�rqc�f<�SPSV,R,^c4SV,R,V3#)rqrF)r?)r��165group_rank�meta_maps&��r6r]�%build_multi_heatmap.<locals>.<lambda>�s.���J�N�N�8�F�+;�G�+D�b�I�8�TZ�K[�\c�Kd�fl�mr8r_r�rr�rF)rPr�r�)r?r�r�r+r�rorGrMr166r�r�r�r�r�rmr?rN�updaterjr�r�r��stdrqrKr�r�r�tolist�roundr )r�r�r`r�r�r$rQ�framesr�r�rrT�topr�rqr/r��ordered_samplesr��expr�row_mean�row_stdrr�rrs&&&&&&&                 @@r6�build_multi_heatmapr\s1����F� ��-�+�+�L�9�?�?�R��$��
�\�\�(�9�-�
.��
�8�8�8���<� �D�(���;�"�*�*�#<��K��AW�AW�X[�A\�A`�A`�Af�Af�Ah�Al�Al�An�An��{�O�(�(�)<�=�=�D��
�
�b�f�f�T�#C�C�D�E�%����Z��Y��X�r�S[�]_�`�`�	�	�	�&�t�,�	��V�	�	���	 �	
��c�&��#�K�0�1�	2�	��y�y�y���Z��Y��X�r�S[�]_�`�`���#�J����I�i�<P�Q�<P�L�E�u�a�i�'�<P�Q�R�.9�:�k�s�H�
�s�"�k�:�H��)�U�k�F�X�f�-=�g�-F�*�-T���k�U�m��O�)��/�R�I��=�=��V��o�5�6�D��y�y�a�y� �H��h�h�A�h��&�&�q�!�,�G���	�"�6�*�+�D�������"�&�&�w�Q�&�7�<�<�d�U�D�I�A���^�$�+�+�C�0�7�7�9��C��K�&�&�s�+�2�2�4��?��?�K�?��8�F�#�G�,�,�?�K��O�L�O�&�H�V�$�W�-�-�O�L��!�'�'�!�*�#�#�*�*�,�
���R��:��U��L��Ls$�=N167�N�;N!�N!�0N&�N+c168�,�V^8�dQhRRRRRRRRRR	/#)169r0r�rr��selected_samplesr��limitrNr3r-r4)r5s"r6r7r7�s6��
�
�l�
�\�
�U^�
�gj�
�uC�
r8c�b�WR,^8�,PV4R,P4pV'g	R.RVR./#VPR4PWB3,P	\1704p\P!VR,4pVP^R7pVP^R7P^^4pVPV^R7PV^R7PRR4p	RVRVRV	P^4PP4/#)	r�rPrr�r�rr�g@g�)r?rr�r�rorKrrr�r�rrqr�r�rr	r )171r�r�rrrr�r�rrr�s172&&&&      r6�
build_heatmapr�s
���173�+�a�/�0�5�5�e�<�V�D�K�K�M�I����Y�(8�(�B�G�G�
�
!�
!�&�
)�
-�
-�i�.I�
J�
Q�
Q�RW�
X�F�����#��&�J����A��&�H��n�n�!�n�$�,�,�Q��2�G����x�a��(�,�,�W�1�,�=�B�B�4��M�A����#��!�'�'�!�*�#�#�*�*�,��r8c� �V^8�dQhRRRR/#)r0rr#r3r4)r5s"r6r7r7�s��!�!�0C�!�H[�!r8c�f�VeVP'dR#VPUu/uFqP4VbK	ppVPR4;'g+VPR4;'gVPR4pVPR4;'g]VPR4;'gDVPR4;'g+VPR4;'gVPR4pVPR	4;'gDVPR1744;'g+VPR4;'gVPR4pVPR
4;'gDVPR4;'g+VPR4;'gVPR4pVeVfR#\P175!RW,P
\4PP4RW,P
\4PP4R	V'd4W,P
\4PP4M2W,P
\4PP4R
V'd4W,P
\4PP4MR/4pWwR,PR4VR,PR4,,pVP4#uupi)NrP�gene_id�symbolrh�termr�r��176pathway_idrir��pathway�descriptionr	�ontology�source�database�177AnnotationrW)r+r�r�r?r�r�rorGrMr�rm)rrr�r�term_col�name_col�category_col�outs&       r6rnrn�sf����k�/�/�/��#.�#6�#6�7�#6�a�W�W�Y��\�#6�E�7��y�y�� �O�O�E�I�I�i�$8�O�O�E�I�I�h�<O�H��y�y��#�{�{�u�y�y��'8�{�{�E�I�I�d�O�{�{�u�y�y�Y_�O`�{�{�di�dm�dm�nz�d{�H��y�y��%�n�n����6�):�n�n�e�i�i�	�>R�n�n�V[�V_�V_�`m�Vn�H��9�9�Z�(�q�q�E�I�I�j�,A�q�q�U�Y�Y�x�EX�q�q�\a�\e�\e�fp�\q�L���8�+��178�,�,��K�)�0�0��5�9�9�?�?�A��{�,�3�3�C�8�<�<�B�B�D��(��.�5�5�c�:�>�>�D�D�F�Xc�Xm�Xt�Xt�ux�Xy�X}�X}�YD�YD�YF��\��1�8�8��=�A�A�G�G�I�_k�		179��C��&�k�n�n�R� �3�y�>�#4�#4�R�#8�8�1809�C���� � ��!
8s�L.c�$�V^8�dQhRRRRRR/#)r0�nrN�kr3rKr4)r5s"r6r7r7�s&��L�L�#�L�#�L�%�Lr8c��V^8gW8�d\R4#\P!V^,4\P!V^,4,181\P!W,182^,4,183#)�z-inf)rKr��lgamma)r'r(s&&r6�184log_chooser,�sP���1�u����V�}���;�;�q�1�u�����A��E� 2�2�T�[�[�����5K�K�Kr8c185�,�V^8�dQhRRRRRRRRRR/#)r0r(rN�186population�	successes�drawsr3rKr4)r5s"r6r7r7�s6��Z�Z�C�Z�S�Z�S�Z��Z��Zr8c	�|a�\W#4p.p\W^,4FJpVP\W&4\W,187W6,1884,\W4,1894KL	V'gR#\	V4o\R\190P!S4\V3RlV44,4#)rarc3�^<"�TF"p\P!VS,1914x�K$	R#5ir:)r�r�)r\rB�max_logs& �r6r^�hypergeom_sf.<locals>.<genexpr>�s#����+X�SW�%�D�H�H�U�W�_�,E�,E�SW�s�*-)�min�ranger�r,rr�r�r)r(r.r/r0�upper�logs�xr3s&&&&   @r6�hypergeom_sfr:�s�����	�!�E�
�D�
�1�a�i�
 �����J�y�,�z�*�:P�RW�R[�/\�\�_i�jt�_|�|�}�!����$�i�G��s�D�H�H�W�%��+X�SW�+X�(X�X�Y�Yr8c192�,�V^8�dQhRRRRRRRRRR	/#)193r0r�rrr#r�rKrr3r-r4)r5s"r6r7r7�sA��9P�9P�
�9P�$�9P��9P��	9P�194�9Pr8c�d�\V4pVf	RRRRR./#\VR,P\44p\VVR,V8*VR,P	4V8�,VR	,^8�,,R,P\44pWDR,PV4,p\
V4p\
V4p	V^8XgV	^8Xd	RR195RRR./#.p196VP.RO4pVF�wwr�r�\VR,4p\
V4p\VV,4p\
V4pV^8dKK\VVVV	4pV197PRVR
V
RVRVRVRV	RVRRPVR,4/4K�	V198'g	RR199RRR./#\P!V2004p\VR,P44VR&VR,VR,,VR&VP!.RO.ROR7P#^P4pRR201RRR\%V4/#)N�	availableFru|未找到注释表。可在 Excel 中加入 annotation/go/kegg sheet,列名包含 gene、term_id、term_name、category。�termsrPr�r�r�Tu$当前阈值下没有显著基因。r	rhri�overlap�	term_size�significant_genesr�r�, �N�Nu-没有达到最小重叠数的富集条目。�202gene_ratior�rW�r	rhri�r�r�r?r�)rnr�rorGr�r�rbrsr�r:r�r�r�r�r�r�r�r?�
clean_records)r�rr�rr��universe�sig�annr.r0r��groupedr	rhrir��203term_genesr/r?r(r��enricheds&&&&                  r6�run_enrichmentrO�sL��2�+�>�L������V��R�204�	205��7�6�?�)�)�#�.�/�H�206
��
�V�_��
+��'�(�,�,�.�)�;�
=��z�"�Q�&�
(�	207��		��&��+��C��F�+�0�0��:�208;�C��X��J���H�E��Q��%�1�*��T�9�.T�V]�_a�b�b�!#�D��k�k�>�?�G�18�-�&��I���v��'�209��210�O�	���c�)�*����L���q�5���a��Y��>������H��7��Y��1��Y�#�U��&�����7�3�<�0�	
�	211�29�*��T�9�.]�_f�hj�k�k��|�|�D�!�H� ��(�!3�!<�!<�!>�?�H�V��%�i�0�8�<O�3P�P�H�\���#�#�$A�M`�#�a�f�f�gi�j�H���y�"�g�}�X�7N�O�Or8c�(�V^8�dQhRRRRRRRR/#)r0r�r�rr#rQr-r3r4)r5s"r6r7r7s6��S�S�*�S�$�S�
�S��	Sr8c�r�\V4pVf	RRRRR./#.p\VR,R,4p\VR,R,4p\VR	,R212,4p\VR	,R,4pVR,PR4;'g.p	VEFYp213\P214!V215R
,4pVP'dK5\VR,P\44pW3R,PV4,p
\V4pV^8XdK�R&EF�wppV^8�d&VVR,V8*VR,V8�,,pM%VVR,V8*VR,V)8*,,pV	'dyRVP9dhVR,P\4PP4P4'd VVR,PV	4,p\VR,P\44p\V4pV^8XdEKV
P.R'O4F�wwpppp\VR,4p\V4p\!VV,4p\V4pVV8dKM\#VVVV4pVP%RV216R,RVRVRVRVRVRVRVRVRRP'VR,4/2174K�	EK�	EK\	V'g
RRRR R.R!.R"./#\P218!V4p\)VR,P+44VR&VR,VR,,VR#&VP-.R(O.R)OR$7P/V^,4pVR,P\4PP14PP3R"4pVV(,P/V4pVV,P/V4p RRRR%R\5V4R!\5V4R"\5V 4/#)*Nr=Fru�未找到 GO/KEGG 注释表。可在 Excel 中加入 annotation/go/kegg sheet,列名包含 gene、term_id、term_name、category。r>r219r
rr*r+r,rr�rPr�r�r�r	rhrir�r��	directionr?r@rAr�rrBrCTu<当前阈值下没有达到最小重叠数的富集条目。r�r�rEr�rW))rra)rr=rFrGr�)rnrKrNr?r�r�r+r�rorGr�rbr�rMr220rsr�r:r�r�r�r�r�r?r��containsrH)!r�rrQr�r�r�rr+r,r�r�r�rIrKr.rR�sign�	sig_framerJr0r	rhrir�rMr/r?r(r�rN�is_keggr�r�s!&&&                              r6�run_multi_enrichmentrWs��2212�+�>�L������_��R�222�	223�"$�D��f�U�m�O�4�5�I���u�
�m�4�5�K��f�\�*�=�9�:�K��F�<�(��5�6�I� ��-�+�+�L�9�?�?�R��$���,�,�x�	�2�3���=�=�=���w�v��-�-�c�2�3����/�4�4�X�>�?����]�224���?��8�O�I�t��a�x�#��V�_��3��/�0�I�=�?��	�225$��V�_��3��/�0�Y�J�>�@��	�#�{�i�6G�6G�'G�I�Va�Lb�Li�Li�jm�Ln�Lr�Lr�Lx�Lx�Lz�L~�L~�MA�MA�%�i��&<�&A�&A�BU�&V�W�	��i��'�.�.�s�3�4�C���H�E���z��9<���Ei�9j�5�.��7�I�� ��v��/�226��227�O�	� ��c�!1�2����L���{�?��%�a��Y��F�����"�H�W�$5�#�Y�"�H�!�7�#�Y�!�1�#�Y�+�U� �&�����7�3�<�!8��
�:k�# 9�%�b��T�9�.l�nu�wy�{�BD�FL�NP�Q�	Q��|�|�D�!�H� ��(�!3�!<�!<�!>�?�H�V��%�i�0�8�<O�3P�P�H�\���#�#�$A�M`�#�a�f�f�gp�st�gt�u�H��z�"�)�)�#�.�2�2�8�8�:�>�>�G�G��O�G�	�7�(�	�	 �	 ��	+�B��G��!�!�)�,�D��T��2���x�(��m�B���
�d�#��r8c�$�V^8�dQhRRRRRR/#)r0rrrz228int | Noner3r�r4)r5s"r6r7r7[s"��	�	�l�	�:�	�AU�	r8c���VeVPV4pVP\P\P).\P4pVP\P!V4R4PRR7pVFYp\VP44F9wrV\V\P4'gK'VP4WE&K;	K[	V#)N�records��orient)r?rqrr�infr�r�r��notnull�to_dictrLr;r<�genericrR)rr�cleanrZr/rArBs&&     r6rHrH[s�����
�W�W�U�^���J�J��������(�"�&�&�1�E��k�k�"�*�*�U�+�T�2�:�:�)�:�L�G����s�y�y�{�+�J�C��%����,�,� �:�:�<���,���Nr8c�8�V^8�dQhRRRRRRRRR	RR229RRRR
R/#)r0r�rr$r�r`r�r�rGr�rQr-�speciesr3r4)r5s"r6r7r7gsb��.C�.C��.C��.C�&�.C��	.C�230�.C�
�
.C��.C��.Cr8c231��\R,pVP4'g\R4hRUu.uFq�VP9gKVNK	p	pR.V,V	,p232W233,P	4pVR,P\4VR&VFSp\P!W�,RR7P^4P4P\4W�&KU	\P!V4pV.RO,pRVRVRVRV/p
\P!R	R2347;_uu_4p\V4pVR,pVR,pVR
,pVR,pVP!VRR7VP!VRR7VP#\$P&!V
RR7RR7R\
V4\
V4\
V4\
V4\
V4.p\(P*!VRRRR7pVP,^8wdJVP.;'gVP0;'gRP34p\RVRR24hVP4'g\R4h\$P4!VP7RR74uuRRR4#uupi +'giR#;i)zdeseq_pipeline.Ru,找不到 R 分析脚本 deseq_pipeline.R。rPrrr�r�rFrc�rna_seq_deseq_)�prefixz235counts.csvzmetadata.csvzparams.jsonzresult.jsonFr�r�ry)�encoding�RscriptTiX)�capture_outputrf�timeoutuR DESeq2 分析失败uR DESeq2 分析失败:Nu$R DESeq2 分析没有生成结果。r�)r�rFrqi0���)�APP_DIR�existsrJr�rlrorGr�rrur	rNr��tempfile�TemporaryDirectoryr�to_csv�236write_textrHr|�237subprocess�run�238returncode�stderr�stdoutrMrI�	read_text)r�r$r`r�r�rQrc�scriptrr|�export_cols�
export_counts�meta_dfrD�tmp�tmp_path�counts_path�
metadata_path�params_path�output_path�cmd�procrs&&&&&&&                r6�run_r_deseq_pipeliner�gsc���)�
)�F��=�=�?�?��G�H�H�&Q�k�&Q�s�\b�\j�\j�Uj�s�s�&Q�O�k��(�[�(�?�:�K��'�,�,�.�M�)�&�1�8�8��=�M�&�����]�]�=�+=�h�O�V�V�WX�Y�_�_�a�h�h�il�m�
����l�l�;�'�G��2�3�G����Y��6��7�	�F�239�	$�	$�,<�	=�	=����9����-�� �>�1�
���.����.�����[���6����}�E��2����t�z�z�&�u�E�PW��X��#�f�+�s�;�'7��]�9K�S�Q\�M]�_b�cn�_o�p���~�~�c�$�T�3�O���?�?�a���{�{�L�L�d�k�k�L�L�5L�S�S�U�G��7�����7H�I�J�J��!�!�#�#��C�D�D��z�z�+�/�/��/�A�B�#240>�	=��!l� 241>�	=�	=�s*�J4�242J4�;C1J9�-J9�7J9�90J9�9K243	c�$�V^8�dQhRRRRRR/#)r0rKr3rDr-r3r4)r5s"r6r7r7�s#��9�9� 6�9��9�Sa�9r8c
�8�\V4p\YPR4;'g.4pVR,pVPR4;'g244VR,p\V\4'g\R4hVUu/uF+qfPR4VR,9gK!VR,VbK-	pp\
V4\
VR,48wd\R4hVR,Uu.uFq�V,NK
	ppVF\p\VPR4;'gR4P4VR&VR,'dKI\VR,R	24h	\VPR2454;'gR4P4p	\VPR4;'gR
4P4P4p246V247R 9d\R4hVPR4;'g.p\V\4'g\R4hVUu.uF]p\V4P4'gK$\V4P4V	8wgKD\V4P4NK_	ppV'g\R4hVUu.uFqfR,V	8XgKVR,NK	p
pV
'g\RV	24hVF8pVUu.uFqfR,V8XgKVNK	up'dK,\RV24h	\VVR,VV	VVV248R7pRVR,RVR,/VR&R249V	RVRV250RVR,R,RVR,R,RVR,R,/VR&RVP9dl\VR,P4P4Uu.uF/p\V4P4'gK$\V4NK1	up4VR&V#uupiuupiuupiuupiuupiuupi)!rLr�r`u样本分组格式不正确。r�r$u样本分组信息不完整。rqrWu 没有 group。r�r'rc�humanu'Species 只能选择 human 或 mouse。r�uKO 分组格式不正确。u-请至少选择一个 KO / treatment group。u找不到 control group:u!找不到 KO / treatment group:�r�r$r`r�r�rQrc�filesrdrerrr251r�r
rrDr�>r��mouse)rSr�r?r<rLrJrbrGrMr�r�r�r��dropnar�)rKrDrQ�datasetr�r`r/rr�r�rcr�rq�control_samplesrtrRs&&              r6�analyze_payloadr��s���
�&�
!�F�&�z�:�:�>O�3P�3V�3V�TV�W�G�
�X�
�F��*�*�]�+�E�E�w�}�/E�K��k�4�(�(��9�:�:�.9�i�k�s�W�W�X�=N�RY�Zg�Rh�=h�"��H�
�s�"�k�H�i�252�8�}��G�M�2�3�3��9�:�:�29�-�2H�I�2H��F�#�#�2H�K�I����3�7�7�7�+�1�1�r�2�8�8�:��G���7�|�|���H�
��.>�?�@�@��253��254�255�?�3�@�@�y�A�G�G�I�M��&�*�*�Y�'�2�2�7�3�9�9�;�A�A�C�G��(�(��B�C�C��256�257�;�'�-�-�2�I��i��&�&��6�7�7�1:�y���c�%�j�>N�>N�>P�#�UX�Y^�U_�Ue�Ue�Ug�kx�Ux�#��U��!�!�#��I�y���H�I�I�0;�]���7�|�}�?\�}�s�8�}�}��O�]���5�m�_�E�F�F���*�D�{��'�l�e�.C���{�D�D��@���H�I�I��#���M�*��#�����G�	���%��W�%8�9��G�F�O�258	���Y��7��f�U�m�L�1��V�E�]�?�3��v�e�}�]�3�
�G�H���f�n�n�$� &�f�[�>Q�>X�>X�>Z�>a�>a�>c�'y�>c�d�gj�ko�gp�gv�gv�gx�	��D�	�>c�'y� z�����N��ej��J��z��^��E��2(zsH�O>�#O>�)P�"!P�P�(P�P
�2
P
� P�4P�=!P�#Pc�$�V^8�dQhRRRRRR/#)r0rKr3rDr%r3r-r4)r5s"r6r7r7�s$���� 6��@U��ao�r8c�D�T;'g/p\YPR4;'g.4pVR,pR.pRF&pWSP9gKVPV4K(	VP	VR,R,4W4,P^4P
\P\P).\P4P\P!W4,P^44R4p.pRVP9di\VR,P4P4Uu.uF/p\!V4P#4'gK$\!V4NK1	up4pRR	R259RVR,R
VR
,/R\%VP4RRRVR,RVR,RVR,RVRRVP9RRVP9RVR,RJR\&RVP)RR7/
#uupi)rLr�rPrfr�r$:N�NNr�Trr�rdrer�rr`rar�
has_gene_name�
has_gene_type�has_annotationrcrQ�previewrZr[)rfr�)r�r?r�r��extendr?rqrrr]r�r�r�r^r�r�r�rGrMrLr.r_)	rKrDr�r��preview_colsrr�rrRs	&&       r6�inspect_payloadr��s���
�\�\�r�F�&�z�:�:�>O�3P�3V�3V�TV�W�G�
�X�
�F��8�L�)���.�.� �����$�*�����
�.�r�2�3��"�'�'��*�2�2�B�F�F�R�V�V�G�3D�b�f�f�M�S�S�TV�T^�T^�_e�_s�_x�_x�yz�_{�T|�C�D�G��J��f�n�n�$��6�+�3F�3M�3M�3O�3V�3V�3X�n�3X�4�\_�`d�\e�\k�\k�\m�Y�S��Y�3X�n�o�260��d���W�[�)���)<�!=�261�	�4����'��F��w�}�-��w�}�-��'�(�#��j������6������6��'�"3�4�D�@��.��7�?�?�)�?�4�!���os�!H�:Hc��V^8�dQhRR/#)r0r3r�r4)r5s"r6r7r7�s��,'�,'�9�,'r8c�,�\P!^4p\^R4Uu.uF pR\V4P	^42NK"	pp.R,Op.p\V4EFbwrVVP
^R4pRpRp	V^*8dVPRR4pM$^*Tu;8:d^R8dMMVPRR4p^FTu;8:d^v8dMMVPR	R2624p	M$^vTu;8:d^�8dMMVPRR4p	.R-Op263WwV,Wy,WwV,Wy,.p\W�4UU
u.uF=wr�\^\VPW�,W�,R,444NK?	ppp
V^	,^8wdR
MRpVPRVRRV^,2RV/\\W>44C4EKe	\P!V4p.pRRRVR,3RRRVR,3RRRVR,3RRRVR ,VR!,,3RR"R#VR$,VR%,,3RR&R'VR(,3.pVF*wppppVFpVPRVR)VR*VR+V/4K	K,	V\P!V43#uupiuup
pi).�i��Genei@rg������@g@g264ףp=265�?rg������@gffffff@g{�G�z�?g���Q��?r�lncRNArPrf�GNr��GOz266GO:0006955zimmune response:N�FNz267GO:0008283zcell proliferation:�#�Nz268GO:0006915zapoptotic process:r��N�KEGG�hsa04630zJAK-STAT signaling pathway:N�7N:i,iTN�hsa04110z269Cell cycle:�2�xN:ihi�N�hsa04010zMAPK signaling pathway:r���Nrhrir	)�270B1_control�B1_KO1�B1_KO2�271B2_control�B2_KO1�B2_KO2)rrr��z�G��?r�r�)�random�Randomr6rG�zfillrj�randint�uniform�ziprrN�gaussr�r=r�r�)�rng�irr�r�r�rPr1�ko1_fold�ko2_fold�batch_shift�meansr��shiftr�r�r>�	term_defsr	rhr��	gene_lists                      r6�make_demo_datar��s���272�-�-��273�C�/4�Q��}�=�}�!�t�C��F�L�L��O�$�
%�}�E�=�R�G�
�D� ��'����{�{�2�t�$�������2�:��{�{�3��,�H�
�5�
�2�
��{�{�4��-�H�
������{�{�3��,�H�
�E�
�C�
��{�{�4��.�H�7���h�����h��PT�P_�`��_b�ch�_v�w�_v�P[�PT�#�a��S�Y�Y�t�|�T�\�D�5H�I�J�K�_v��w�(-��	�Q��$�H�	�������r�%�!�)��-��Y�
��s�7�+�,�	
�	274�#(�2�\�\�$�
�F��E�	
�|�.��c�275�;�	
�|�1�5��=�A�	
�|�0�%��-�@�	��9�5��:��g��;V�W�	��\�5��=�5��>�+I�J�	��5�u�W�~�F�
�I�/8�*��'�4���D��L�L�&�$�	�7�K��z�[c�d�e��/8��2�<�<��&�&�&��U
>��$xs�&J�3AJc��V^8�dQhRR/#)r0r3r-r4)r5s"r6r7r7$s��%�%�n�%r8c���\4wr\/4pRRRRRRRRRR/RR	RR276RRRR277RR/RRRRRRRRRR/RR
RRRRRRRR/RRRR278RRRR279RR/RRRRRRRRRR/.pVUu.uFqDR,NK
	ppRpR280R.p\VVVVVVRR7pRRRRRRVR,/RRRRRVR,/.R\\	V44/VR&RVRVRRRVR,R ,R!VR,R!,/VR"&V#uupi)#r�r�rQr'rF�batch1rqr�zdemo_batch1.xlsxr�r(r�r)r��batch2zdemo_batch2.xlsxr�r�r�r�r�r�r�:N�N:r�NNrerr�r�rcr�r281r
rrD)r�rSr�rNrb)	r��_annotationsrQr`r/r$r�r�rts	         r6�demo_payloadr�$s���)�+��F�
�"�
�F�	�<�!2�I�w��RY�[d�fl�oA�	B�	�8�.��w��'�SX�Z`�bt�u�	�8�.��w��'�SX�Z`�bt�u�	�<�!2�I�w��RY�[d�fl�oA�	B�	�8�.��w��'�SX�Z`�bt�u�	�8�.��w��'�SX�Z`�bt�u�
�K�-8�8�K�S�x�=�=�K�K�8��M����I�"����#�����G�	�
�+�W�h�	�;�WY�?�[�
�+�W�h�	�;�WY�?�[�282�	�S��V��-��G�F�O�	���Y��7��V�E�]�?�3��v�e�}�]�3��G�H���N��59s� C/c�Xa�]tRtRtRV3RlltRRltRV3RlltRR	ltR283tV;t	#)�284AppHandleriLc�$�V^8�dQhRRRRRR/#)r0�argsr�kwargsr3rir4)r5s"r6r7�AppHandler.__annotate__Ms&��B�B�c�B�S�B�T�Br8c	�F<�\SV`!VR\\4/VBR#)�	directoryN)�super�__init__rGrk)�selfr�r��	__class__s&*,�r6r��AppHandler.__init__Ms���
���$�A�#�g�,�A�&�Ar8c�$�V^8�dQhRRRRRR/#)r0r5rGr�rr3rir4)r5s"r6r7r�Ps!����#��c��d�r8c	�(�\W,4R#r:)�print)r�r5r�s&&*r6�log_message�AppHandler.log_messagePs��
�f�m�r8c��V^8�dQhRR/#�r0r3rir4)r5s"r6r7r�Ss��	�	��	r8c	�<�VPR8Xd\V\44R#VPR8XdRVn\SV`4R# \d"p\	T\T4R4Rp?R#Rp?ii;i)z	/api/demoi�N�/z/index.html)�pathr�r��	Exceptionr�rGr��do_GET)r��excr�s& �r6r��AppHandler.do_GETSsj����9�9��#�
4��d�L�N�3�
��9�9���%�D�I�
������
4��t�S��X�s�3�3���
4�s�A�A>�A9�9A>c��V^8�dQhRR/#r�r4)r5s"r6r7r�^s��%0�%0��%0r8c	�V�VPR8Xd�\VPPRR44p\P285!VPPV4PR4;'gR4p\V4p\VVRR4R#VPR9d\VR286R4R#\P!VPPRR
44wrVVR8wd\VR4R#\!VR,R4VR&\P"!VPVPRR/R7p\%V4pV'g\VR4R#\P287!VP'R4;'gR4p	VPR	8Xd
\)W�4pM\+W�4p\-W4R# \d"p\T\T4R4Rp?R#Rp?ii;i \d"p\T\T4R4Rp?R#Rp?ii;i)z/api/export_deseqzcontent-length�0ryz{}zDESeq2_all_results.xlsxzAapplication/vnd.openxmlformats-officedocument.spreadsheetml.sheet�N�/api/inspectzUnknown endpoint.i�zcontent-typerWzmultipart/form-datau请使用表单上传文件。�boundary�REQUEST_METHOD�POST)�fp�headers�environrNrD>�/api/analyzer�)r�rNr�r?rHrI�rfiler�decoder�r�r�r�rG�cgi�parse_headerr��FieldStorager7r�r�r�r�)288r��lengthrt�workbookr��ctype�pdictr2rKrDs289&         r6�do_POST�AppHandler.do_POST^s����9�9�+�+�
4��T�\�\�-�-�.>��D�E���*�*�T�Z�Z�_�_�V�%<�%C�%C�G�%L�%T�%T�PT�U��0��9�����-�W�	�
��9�9�<�<��4�!4�c�:���'�'����(8�(8���(L�M����)�)��4�!A�B��!�%�290�"3�W�=��j�����4�:�:�t�|�|�N^�`f�Mg�h��#�D�)�291���4�!J�K��	0��Z�Z��
�
�h� 7� ?� ?�4�@�F��y�y�N�*�)�*�=��)�*�=���$�(��/�
4��t�S��X�s�3�3���
4��0�	0��4��S��3�/�/��	0�s<�A%G
�9 G
�)'G<�:G<�
G9�G4�4G9�<H(�H#�#H()r�)292�__name__�293__module__�__qualname__�__firstlineno__r�r�r�r��__static_attributes__�
__classcell__)r�s@r6r�r�Ls(���B�B��	�	�%0�%0r8r�c� �V^8�dQhRRRR/#)r0�	preferredrNr3r4)r5s"r6r7r7�s����3��3�r8c�6�\W^2,4Fnp\P!\P\P4;_uu_4pVP	RV34^8wdVuuRRR4u#RRR4Kp	V# +'giK�;i)r��	127.0.0.1N)r6r�r�r��294connect_ex)rr�r�s&  r6�choose_portr�sr���i�R��0��
�]�]�6�>�>�6�+=�+=�
>�
>�$�����T�2�3�q�8��?�
>�8�?�
>�1���?�
>�
>�s�B�Bc��V^8�dQhRR/#r�r4)r5s"r6r7r7�s����d�r8c295��\P!4pVPR\PPRR4R7VPR\\
\PPRR44R7VP4p\VP4p\VPV3\4pVPR9d0\RV24\V4Fp\R	V24K	M-\R296VPRV24\RV,4VP4R
#)z--host�HOSTr)�defaultz--port�PORT�8787)r�rz4RNA-seq web app running locally at http://127.0.0.1:zLAN access: z"RNA-seq web app running at http://r�zBFor LAN access, start with: HOST=0.0.0.0 PORT=%s python3 server.pyN>�::�0.0.0.0)�argparse�ArgumentParser�add_argument�osr�r?rN�297parse_argsrr�r�hostr�r�r��
serve_forever)�parserr�r��server�addresss     r6�mainr�s���
�
$�
$�
&�F�298����"�*�*�.�.���*M��N�299����s�C��300�301���v�v�8V�4W��X�����D��t�y�y�!�D�
 �$�)�)�T�!2�J�
?�F��y�y�%�%�
�D�T�F�K�L�.�t�4�G��L��	�*�+�5�	�2�4�9�9�+�Q�t�f�E�F�
�R�UY�Y�Z�302���r8�__main__i����)r%rrz#047C7Bz#B7791Fz#28724Fz#8B4F9F)��)r�r:)r�)r�)M�__conditional_annotations__�__doc__�303__future__rrr�rHr�rr�r�rqrm�warnings�http.serverrr�pathlibr�typingr�filterwarnings�DeprecationWarningr��numpyrr�pandasr��__file__�resolve�parentrkr.�__annotations__r>rSrgrOr�r�r�r�r�r�r�rr!r0r7r@rDrIr�r�r�r�r�r�r�r�rrrnr,r:rOrWrHr�r�r�r�r�r�rrr�)rs@r6�<module>r,s(���E�"��	���	�
�
����E�������*A�L^�_�304����x�.�305 �306 �307"�308)�309)��310��t����'�(�(�$�)�4�,�d�
����Q���b��4��F�I�t�Y�G��311��R����5�)�U�I�v�y�I��f���I�u�i��	�R����q��R��+"����8��4n�312A�.�!�D��*-�3135�pA�314(/�V�4�&J�	+�I�315�p�f�_�
4� 6�r��(�3�l
� !�,L�Z�9P�xS�l	�.C�b9�x�B,'�^%�P70�)�70�t��"�z���F�r8