Spaces:
Runtime error
Runtime error
| import datasets | |
| import streamlit as st | |
| import numpy as np | |
| import pandas as pd | |
| import altair as alt | |
| st.set_page_config(layout='wide') | |
| # parse out feature_names from URL query args to it's possible to link to this page | |
| query_params = st.query_params | |
| if "feature_name_1" in query_params.keys(): | |
| feature_name_1 = query_params["feature_name_1"] | |
| else: | |
| feature_name_1 = "B9J08_000003" | |
| if "feature_name_2" in query_params.keys(): | |
| feature_name_2 = query_params["feature_name_2"] | |
| else: | |
| feature_name_2 = "B9J08_000004" | |
| st.markdown(""" | |
| # CaurisCEN Expression Scatter | |
| **CaurisCEN** is a co-expression network for *Candida auris* built on 577 RNA-seq runs across 2 96-well plates formats in 3 biological replicas. | |
| 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: | |
| Rapala JR, MJ O'Meara, TR O'Meara | |
| CaurisCEN: A Co-Expression Network for Candida auris | |
| * Code available at https://github.com/maomlab/CaurisCEN/tree/master/vignettes/CaurisCEN | |
| * Full network and dataset: https://huggingface.co/datasets/maomlab/CaurisCEN | |
| ## Plot scatter plot expression for a pair of genes across studies. | |
| Put in the B9J08 locus tag (e.g. `B9J08_004112`) for two genes. | |
| """) | |
| gene_metadata = datasets.load_dataset( | |
| path = "maomlab/CaurisCEN", | |
| name = "gene_metadata", | |
| data_dir = "gene_metadata/data")['train'].to_pandas() | |
| expression_runs = datasets.load_dataset( | |
| path = "maomlab/CaurisCEN", | |
| name = "run_metadata", | |
| data_dir = "run_metadata/data")['train'].to_pandas() | |
| expression_matrix = datasets.load_dataset( | |
| path = "maomlab/CaurisCEN", | |
| name = "expression_matrix", | |
| data_dir = "expression_matrix")['train'].to_pandas() | |
| #DEBUG | |
| print(f"expression_matrix shape: {expression_matrix.shape}") | |
| col1, col2, col3, padding = st.columns(spec = [0.2, 0.2, 0.2, 0.4]) | |
| with col1: | |
| feature_name_1 = st.text_input( | |
| label = "Feature Name 1", | |
| value = f"{feature_name_1}", | |
| max_chars = 12, | |
| help = "B9J08 Locus Tag e.g. B9J08_000003") | |
| with col2: | |
| feature_name_2 = st.text_input( | |
| label = "Feature Name 2", | |
| value = f"{feature_name_2}", | |
| max_chars = 12, | |
| help = "B9J08 New Locus Tag e.g. B9J08_000004") | |
| # check the user input | |
| try: | |
| locus_tag_new_1 = gene_metadata.loc[gene_metadata["locus_tag_old"] == feature_name_1]["locus_tag_new"].values[0] | |
| gene_name_1 = gene_metadata.loc[gene_metadata["locus_tag_old"] == feature_name_1]["gene_name"].values[0] | |
| description_1 = gene_metadata.loc[gene_metadata["locus_tag_old"] == feature_name_1]["description"].values[0] | |
| except: | |
| st.error(f"Unable to locate locus tag for gene 1: {feature_name_1}, it should be of the form 'B9J08_#######'") | |
| try: | |
| locus_tag_new_2 = gene_metadata.loc[gene_metadata["locus_tag_old"] == feature_name_2]["locus_tag_new"].values[0] | |
| gene_name_2 = gene_metadata.loc[gene_metadata["locus_tag_old"] == feature_name_2]["gene_name"].values[0] | |
| description_2 = gene_metadata.loc[gene_metadata["locus_tag_old"] == feature_name_2]["description"].values[0] | |
| except: | |
| st.error(f"Unable to locate locus tag for gene 2: {feature_name_2}, it should be of the form 'B9J08_#######'") | |
| expression_1 = expression_matrix.loc[expression_matrix["gene"] == locus_tag_new_1].transpose().iloc[1:,0].to_numpy().astype('float64') | |
| expression_2 = expression_matrix.loc[expression_matrix["gene"] == locus_tag_new_2].transpose().iloc[1:,0].to_numpy().astype('float64') | |
| chart_data = pd.DataFrame({ | |
| "feature_name_1": feature_name_1, | |
| "feature_name_2": feature_name_2, | |
| "expression_1": expression_1, | |
| "expression_2": expression_2, | |
| "log_expression_1": np.log10(expression_1 + 1), | |
| "log_expression_2": np.log10(expression_2 + 1), | |
| "run_accession": expression_matrix.columns[1:]}) | |
| chart_data = chart_data.merge( | |
| right = expression_runs, | |
| on = "run_accession") | |
| with col3: | |
| st.text('') # help alignment with input box | |
| st.download_button( | |
| label = "Download data as TSV", | |
| data = chart_data.to_csv(sep ='\t').encode('utf-8'), | |
| file_name = f"CaurisCEN_expression_{feature_name_1}_vs_{feature_name_2}.tsv", | |
| mime = "text/csv") | |
| st.markdown(f""" | |
| #### Gene 1: | |
| * *Gene ID*: [{feature_name_1}](http://www.candidagenome.org/cgi-bin/locus.pl?locus={feature_name_1}&organism=C_auris_B8441) | |
| {'* *Gene Name*:' + gene_name_1 if gene_name_1 is not None else ''} | |
| * *Description*: {description_1} | |
| * *Top [Co-Expressed Partners](https://huggingface.co/spaces/maomlab/CaurisCEN-TopHits?feature_name={feature_name_1})* | |
| #### Gene 2: | |
| * *Gene ID*: [{feature_name_2}](http://www.candidagenome.org/cgi-bin/locus.pl?locus={feature_name_2}&organism=C_auris_B8441) | |
| {'* *Gene Name*:' + gene_name_2 if gene_name_2 is not None else ''} | |
| * *Description*: {description_2} | |
| * *Top [Co-Expressed Partners](https://huggingface.co/spaces/maomlab/CaurisCEN-TopHits?feature_name={feature_name_2})* | |
| """) | |
| chart = ( | |
| alt.Chart( | |
| chart_data, | |
| width = 750, | |
| height = 750) | |
| .mark_circle() | |
| .encode( | |
| x=alt.X("log_expression_1", title=f"Log10[{feature_name_1}+1] Expression"), | |
| y=alt.Y("log_expression_2", title=f"Log10[{feature_name_2}+1] Expression"), | |
| color=alt.Color("study_accession", title="Study Accession"), | |
| tooltip=["run_accession", "study_accession"])) | |
| st.altair_chart( | |
| chart) |