Spaces:
Sleeping
Sleeping
| import datasets | |
| import streamlit as st | |
| from st_aggrid import AgGrid, GridOptionsBuilder, JsCode | |
| st.set_page_config(layout='wide') | |
| # parse out gene_ids from URL query args to it's possible to link to this page | |
| query_params = st.query_params | |
| if "gene_id" in query_params.keys(): | |
| gene_id = query_params["gene_id"] | |
| else: | |
| gene_id = "CNAG_04365" | |
| st.markdown(""" | |
| # CryptoCEN Top50 co-expressed partners | |
| **CryptoCEN** is a co-expression network for *Cryptococcus neoformans* built on 1,524 RNA-seq runs across 34 studies. | |
| A pair of genes are said to be co-expressed when their expression is correlated across different conditions and | |
| is often a marker for genes to be involved in similar processes. | |
| To Cite: | |
| O'Meara MJ, Rapala JR, Nichols CB, Alexandre C, Billmyre RB, Steenwyk JL, A Alspaugh JA, O'Meara TR | |
| CryptoCEN: A Co-Expression Network for Cryptococcus neoformans reveals novel proteins involved in DNA damage repair. | |
| PLoS Genet 20(2): e1011158. (2024) https://doi.org/10.1371/journal.pgen.1011158 | |
| * Code available at https://github.com/maomlab/CalCEN/tree/master/vignettes/CryptoCEN | |
| * Full network and dataset: https://huggingface.co/datasets/maomlab/CryptoCEN | |
| ## Look up top-coexpressed partners: | |
| Put in the ``CNAG_#####`` gene_id for a gene and expand the table to get the top 50 co-expressed genes. | |
| ``coexp_score`` ranges between ``[0-1]``, where ``1`` is the best and greater than ``0.85`` can be considered significant. | |
| """) | |
| top_coexp_hits = datasets.load_dataset( | |
| path = "maomlab/CryptoCEN", | |
| data_files = {"top_coexp_hits": "top_coexp_hits.tsv"}) | |
| top_coexp_hits = top_coexp_hits["top_coexp_hits"].to_pandas() | |
| col1, col2, col3 = st.columns(spec = [0.3, 0.2, 0.5]) | |
| with col1: | |
| gene_id = st.text_input( | |
| label = "Gene ID", | |
| value = f"{gene_id}", | |
| max_chars = 10, | |
| help = "CNAG Gene ID e.g. CNAG_04365") | |
| top_coexp_hits = top_coexp_hits[ | |
| top_coexp_hits.gene_id_1 == gene_id] | |
| top_coexp_hits = top_coexp_hits[[ | |
| 'gene_id_1', 'gene_symbol_1', 'description_1', | |
| 'gene_id_2', 'gene_symbol_2', 'description_2', | |
| 'coexp_score', 'blastp_EValue']] | |
| top_coexp_hits["scatter_link"] = top_coexp_hits.apply( | |
| lambda row: f"https://huggingface.co/spaces/maomlab/CryptoCEN-ExpressionScatter?gene_id_1={row.gene_id_1}&gene_id_2={row.gene_id_2}", | |
| axis = 1) | |
| top_coexp_hits.reset_index() | |
| with col2: | |
| st.text('') # help alignment with input box | |
| st.download_button( | |
| label = "Download data as TSV", | |
| data = top_coexp_hits.to_csv(sep ='\t').encode('utf-8'), | |
| file_name = f"top_coexp_hits_{gene_id}.tsv", | |
| mime = "text/csv") | |
| # third column is padding only | |
| ######### Table ######### | |
| fungidb_link_renderer = JsCode(""" | |
| class UrlCellRenderer { | |
| init(params) { | |
| this.eGui = document.createElement('a'); | |
| this.eGui.innerText = params.value; | |
| this.eGui.setAttribute('href', "https://fungidb.org/fungidb/app/record/gene/" + params.value); | |
| this.eGui.setAttribute('style', "text-decoration:none"); | |
| this.eGui.setAttribute('target', "_blank"); | |
| } | |
| getGui() { | |
| return this.eGui; | |
| } | |
| } | |
| """) | |
| coexp_scatter_link_renderer = JsCode(""" | |
| class UrlCellRenderer { | |
| init(params) { | |
| this.eGui = document.createElement('a'); | |
| this.eGui.innerText = 'plot'; | |
| this.eGui.setAttribute('href', params.value); | |
| this.eGui.setAttribute('style', "text-decoration:none"); | |
| this.eGui.setAttribute('target', "_blank"); | |
| } | |
| getGui() { | |
| return this.eGui; | |
| } | |
| } | |
| """) | |
| grid_option_builder = GridOptionsBuilder() | |
| grid_option_builder.configure_auto_height() | |
| grid_option_builder.configure_default_column( | |
| filterable=False, | |
| groupable=False, | |
| editable=False, | |
| wrapText=True, | |
| autoHeight=True) | |
| grid_option_builder.configure_column("gene_id_1", header_name="GeneID 1", pinned="left", cellRenderer=fungidb_link_renderer, width=550) | |
| grid_option_builder.configure_column("gene_symbol_1", header_name="Gene 1", pinned="left", width=500) | |
| grid_option_builder.configure_column("description_1", header_name="Description 1", width=1600) | |
| grid_option_builder.configure_column("gene_id_2", header_name="GeneID 2", pinned="left", cellRenderer=fungidb_link_renderer, width=550) | |
| grid_option_builder.configure_column("gene_symbol_2", header_name="Gene 2", pinned="left", width=500) | |
| grid_option_builder.configure_column("description_2", header_name="Description 2", width=1600) | |
| grid_option_builder.configure_column( | |
| "coexp_score", | |
| header_name="Coexp Score", | |
| type=["numericColumn", "customNumericFormat"], | |
| precision=3, | |
| width=600) | |
| grid_option_builder.configure_column( | |
| "blast_EValue", | |
| header_name="Blast E-value", | |
| type=["numericColumn", "customNumericFormat"], | |
| precision=3, | |
| width=600) | |
| grid_option_builder.configure_column( | |
| "scatter_link", | |
| header_name="Expression Scatterplot", | |
| cellRenderer=coexp_scatter_link_renderer, | |
| width=550) | |
| grid_option_builder.configure_selection(selection_mode=False, use_checkbox=False) | |
| AgGrid( | |
| data = top_coexp_hits, | |
| gridOptions = grid_option_builder.build(), | |
| fit_columns_on_grid_load=True, | |
| theme="streamlit", | |
| allow_unsafe_jscode=True) | |