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)