From ff70ce0eda6b307245a3f9acc36f3bf678a80595 Mon Sep 17 00:00:00 2001 From: Andrew Jenkins Van Dusen Date: Mon, 28 Jul 2025 17:44:33 -0400 Subject: [PATCH 1/2] Added folder for ChEA-KG Time Series --- .../chea_kg_time_series_appyter/README.md | 16 + .../chea_kg_time_series_appyter/appyter.json | 35 + .../chea_kg_ts_appyter.ipynb | 1991 +++++++++++++++++ .../requirements.txt | 17 + .../static/chea_kg_ts_appyter.png | Bin 0 -> 123363 bytes 5 files changed, 2059 insertions(+) create mode 100644 appyters/chea_kg_time_series_appyter/README.md create mode 100644 appyters/chea_kg_time_series_appyter/appyter.json create mode 100644 appyters/chea_kg_time_series_appyter/chea_kg_ts_appyter.ipynb create mode 100644 appyters/chea_kg_time_series_appyter/requirements.txt create mode 100644 appyters/chea_kg_time_series_appyter/static/chea_kg_ts_appyter.png diff --git a/appyters/chea_kg_time_series_appyter/README.md b/appyters/chea_kg_time_series_appyter/README.md new file mode 100644 index 00000000..15ca8183 --- /dev/null +++ b/appyters/chea_kg_time_series_appyter/README.md @@ -0,0 +1,16 @@ +# ChEA-KG Time Series Appyter + +Given either raw time series RNA-seq data or pre-computed DEGs at each time point, the ChEA-KG-TS Appyter visualizes on a regulatory subnetwork how the enriched TFs at one time point regulate the enriched TFs at the subsequent time point, therefore enabling users to understand how the TF landscape governing a biological process evolves over time. The Appyter also determines which modules of TFs may be targeting similar genes at each time point by visualizing how the enriched TFs cluster on a UMAP plot. The Appyter also outputs the average rank of each enriched TF within the ChEA3 gene set libraries, enabling users to see which TFs may play a more substantial role in dictating the gene expression changes at each time point. + +## Launching the appyter +```bash +appyter --profile=biojupies chea_kg_time_series_appyter.ipynb +``` + +As long as the terminal is open, the appyter should be available at https://localhost:5000/ + +## Developing the appyter +The appyter can be developed with any jupyter notebook compatible editor. +```bash +jupyter chea_kg_time_series_appyter.ipynb +``` diff --git a/appyters/chea_kg_time_series_appyter/appyter.json b/appyters/chea_kg_time_series_appyter/appyter.json new file mode 100644 index 00000000..0288a037 --- /dev/null +++ b/appyters/chea_kg_time_series_appyter/appyter.json @@ -0,0 +1,35 @@ +{ + "$schema": "https://raw.githubusercontent.com/MaayanLab/appyter-catalog/main/schema/appyter-validator.json", + "name": "chea_kg_ts_appyter", + "title": "ChEA-KG-TS_Appyter", + "version": "0.0.1", + "description": "An Appyter that visualizes the enriched TFs at each time point from time series RNA-seq data using a regulatory subnetwork and UMAP plot.", + "image": "chea_kg_ts_appyter.png", + "authors": [ + { + "name": "Andrew Van Dusen", + "email": "avandusen30@gmail.com" + } + ], + "url": "https://github.com/MaayanLab/chea_kg_ts_appyter", + "tags": [ + "Enrichment Analysis", + "Transcription Factors", + "Gene Regulatory Network", + "Time Series", + "RNA-seq", + "Differential Expression Analysis", + "ChEA-KG" + ], + "license": "CC-BY-NC-SA-4.0", + "appyter": { + "file": "chea_kg_ts_appyter.ipynb", + "profile": "biojupies", + "extras": [ + "ipywidgets", + "toggle-code", + "hide-code" + ] + }, + "public": true +} diff --git a/appyters/chea_kg_time_series_appyter/chea_kg_ts_appyter.ipynb b/appyters/chea_kg_time_series_appyter/chea_kg_ts_appyter.ipynb new file mode 100644 index 00000000..d5073a12 --- /dev/null +++ b/appyters/chea_kg_time_series_appyter/chea_kg_ts_appyter.ipynb @@ -0,0 +1,1991 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "id": "098e6ee1", + "metadata": {}, + "outputs": [], + "source": [ + "#%%appyter init\n", + "from appyter import magic\n", + "magic.init(lambda _=globals: _())" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "318f5c72", + "metadata": {}, + "outputs": [], + "source": [ + "%%appyter hide_code\n", + "\n", + "{% do SectionField(\n", + " name= 'title_section',\n", + " title= 'Provide a title for your study.'\n", + ") %}" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8c5147c1", + "metadata": {}, + "outputs": [], + "source": [ + "%%appyter code_eval\n", + "\n", + "{% set study_title = TextField(\n", + " name= 'user_inputted_study_title',\n", + " label= 'Title',\n", + " default= '',\n", + " section = 'title_section',\n", + ") %}\n", + "\n", + "study_title = {{study_title}}" + ] + }, + { + "cell_type": "markdown", + "id": "21f0d221", + "metadata": {}, + "source": [ + "#
REPORT
" + ] + }, + { + "cell_type": "markdown", + "id": "0c671de6", + "metadata": {}, + "source": [ + "# ChEA-KG-TS: Temporal Transitions of Transcription Factor Regulatory Modules\n", + "\n", + "Given time series RNA-seq data from either humans or mice, this Appyter first determines which transcription factors are enriched for the differentially expressed genes (DEGs) found at each time point. DEGs are computed using [DESeq2](https://genomebiology.biomedcentral.com/articles/10.1186/s13059-014-0550-8) (Love et al., 2014) or [Characteristic Direction](https://bmcbioinformatics.biomedcentral.com/articles/10.1186/1471-2105-15-79) (Clark et al., 2014) by comparing gene expression at adjacent time points (*t0 vs t1, t1 vs t2, t2 vs t3, ... , tn-1 vs tn*) or comparing to the initial time point (*t0 vs t1, t0 vs t2, t0 vs t3, ... , t0 vs tn*). Thus, there are 4 different options for computing DEGs. Next, the enriched transcription factors for each set of DEGs are determined using [ChEA3](https://maayanlab.cloud/chea3/) (Keenan et al., 2019). \n", + "\n", + "Afterwards, the Appyter plots a [ChEA-KG](https://chea-kg.maayanlab.cloud/) (project led by Anna Byrd) regulatory subnetwork of the enriched TFs at each time point, enabling users to determine how the enriched TFs at one time point regulate the TFs at the subsequent time point. A UMAP plot of the enriched TFs is also generated, providing users with visualization of enriched TFs that act in modules based on their shared target genes. \n", + "\n", + "If users have pre-computed the up- and downregulated DEGs at each time point, they can opt to upload a GMT file of those DEGs to *directly* visualize the enriched TFs. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f72b2957", + "metadata": {}, + "outputs": [], + "source": [ + "from IPython.display import display, Markdown\n", + "display(Markdown(f\"# __Study title:__ {study_title}\"))" + ] + }, + { + "cell_type": "markdown", + "id": "6695dcf3", + "metadata": {}, + "source": [ + "## Loading the necessary packages" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "aaad10ef", + "metadata": {}, + "outputs": [], + "source": [ + "# general\n", + "import pandas as pd\n", + "import numpy as np\n", + "import json\n", + "import requests\n", + "import urllib\n", + "from IPython.display import display, FileLink, HTML, Markdown\n", + "import time\n", + "import os\n", + "\n", + "# differential gene expression\n", + "from maayanlab_bioinformatics.dge import deseq2_differential_expression\n", + "from maayanlab_bioinformatics.dge import characteristic_direction\n", + "from maayanlab_bioinformatics.dge import up_down_from_characteristic_direction\n", + "\n", + "# time series enriched TF subnetwork visualization\n", + "from ipycytoscape import CytoscapeWidget\n", + "from dash import html\n", + "\n", + "# bar chart\n", + "import plotly.graph_objects as go\n", + "import plotly.io as pio\n", + "import uuid\n", + "import html\n", + "from pathlib import Path\n", + "\n", + "# enriched TF UMAP visualization\n", + "from sklearn.feature_extraction.text import TfidfVectorizer\n", + "import scanpy as sc\n", + "import anndata\n", + "from copy import deepcopy\n", + "from collections import OrderedDict\n", + "from bokeh.io import output_notebook, show\n", + "from bokeh.io.export import export_png\n", + "from bokeh.plotting import figure\n", + "from bokeh.models import ColumnDataSource, HoverTool, Slider, CustomJS, Title, Label\n", + "from bokeh.layouts import column\n", + "from PIL import Image\n", + "output_notebook()" + ] + }, + { + "cell_type": "markdown", + "id": "e6bfe09b", + "metadata": {}, + "source": [ + "## Step 1. Computing DEGs for the raw gene counts matrix\n", + "\n", + "DEGs are computed using [DESeq2](https://genomebiology.biomedcentral.com/articles/10.1186/s13059-014-0550-8) (Love et al., 2014) or [Characteristic Direction](https://bmcbioinformatics.biomedcentral.com/articles/10.1186/1471-2105-15-79) (Clark et al., 2014) by comparing gene expression at adjacent time points (*t0 vs t1, t1 vs t2, t2 vs t3, ... , tn-1 vs tn*) or comparing to the initial time point (*t0 vs t1, t0 vs t2, t0 vs t3, ... , t0 vs tn*). All in all, there are 4 different methods of computing DEGs." + ] + }, + { + "cell_type": "markdown", + "id": "e4ceb21b", + "metadata": {}, + "source": [ + "Upload fields are for (1) a raw gene counts matrix and (2) experiment metadata from a time series RNA-seq experiment. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "70226435", + "metadata": {}, + "outputs": [], + "source": [ + "%%appyter hide_code\n", + "\n", + "{% do SectionField(\n", + " name= 'section0',\n", + " title= 'Upload files to this section ONLY if you are uploading raw time series RNA-seq data.'\n", + ") %}\n", + "\n", + "{% do SectionField(\n", + " name= 'section1',\n", + " title= '1. Upload raw gene counts matrix.'\n", + ") %}\n", + "\n", + "{% do SectionField(\n", + " name= 'section2',\n", + " title= '2. Upload experiment metadata.'\n", + ") %}\n", + "\n", + "{% do SectionField(\n", + " name= 'section3',\n", + " title= '3. Choose whether you would like to calculate differentially expressed genes using DESeq2, CD, or both.'\n", + ") %}\n", + "\n", + "{% do SectionField(\n", + " name= 'section4',\n", + " title= '4. Choose the number of top enriched TFs to include in the visualizations.'\n", + ") %}\n", + "\n", + "{% do SectionField(\n", + " name= 'section5',\n", + " title= '5. Provide a short description of your study (optional).'\n", + ") %}" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "aa272ef5", + "metadata": {}, + "outputs": [], + "source": [ + "%%appyter code_eval\n", + "\n", + "{% set dataset1 = FileField(\n", + " name= 'dataset1',\n", + " label= 'Raw gene counts matrix',\n", + " default= '',\n", + " examples= {'Raw gene counts from TRAIL-treated TNBC cell line': 'https://drive.google.com/uc?export=download&id=1WFtUIXO2b3rbiStJ7Hf8Bx7NrfheEM9L'},\n", + " section= 'section1'\n", + ") %}\n", + "\n", + "ds1 = {{dataset1}}\n", + "\n", + "{% do DescriptionField(\n", + " name= 'description',\n", + " text= 'Ensure that the columns are labeled exactly as \"sample_name\" and \"time_pt_annotation\". See example for how to format experiment metadata file.',\n", + " section= 'section2'\n", + ") %}\n", + "\n", + "{% set dataset2 = FileField(\n", + " name= 'dataset2',\n", + " label= 'Experiment metadata',\n", + " default= '',\n", + " examples= {'Samples taken from TRAIL-treated TNBC cell line': 'https://drive.google.com/uc?export=download&id=1iyGR_LC2MPHQ0LyobzMFULbGIYFSYH2Y'},\n", + " section= 'section2'\n", + ") %}\n", + "\n", + "ds2 = {{dataset2}}\n", + "\n", + "{% set chosen_method = ChoiceField(\n", + " name= 'chosen_dge_method',\n", + " label= 'Differential gene expression method(s)',\n", + " default= 'DESeq2',\n", + " choices= {'DESeq2': '1', 'Characteristic Direction': '2', 'Both': '3'},\n", + " section= 'section3'\n", + ") %}\n", + "\n", + "dge_method = {{chosen_method}}\n", + "dge_method = str(dge_method)\n", + "\n", + "{% set chosen_num = ChoiceField(\n", + " name= 'chosen_num_tfs',\n", + " label= 'Number of top enriched TFs',\n", + " default= '5',\n", + " choices= {'5': '1', '10': '2'},\n", + " section= 'section4'\n", + ") %}\n", + "\n", + "num_tfs = {{chosen_num}}\n", + "num_tfs = str(num_tfs)\n", + "\n", + "{% set user_description = TextField(\n", + " name= 'user_description',\n", + " label= 'Description',\n", + " default= '',\n", + " section = 'section5',\n", + ") %}\n", + "\n", + "umap_desc = {{user_description}}\n", + "\n", + "compute_degs = False\n", + "if ds1 != '' and ds2 != '':\n", + " compute_degs = True\n", + "\n", + "if num_tfs == '1':\n", + " num_tfs = 5\n", + "if num_tfs == '2':\n", + " num_tfs = 10" + ] + }, + { + "cell_type": "markdown", + "id": "f56cbfd2", + "metadata": {}, + "source": [ + "### Differential Expression Method Option 1: DESeq2\n", + "[PyDESeq2](https://pydeseq2.readthedocs.io/en/stable/), the Python implementation of DESeq2 (Love et al., 2014), is used to compute the DEGs of time series RNA-seq data given a user-inputted raw gene counts matrix and sample metadata file describing the time points. \n", + "\n", + "DEGs are computed by comparing gene expression at adjacent time points (*t0 vs t1, t1 vs t2, t2 vs t3, ... , tn-1 vs tn*) or with the initial time point (*t0 vs t1, t0 vs t2, t0 vs t3, ... , t0 vs tn*)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "de7d6b9e", + "metadata": {}, + "outputs": [], + "source": [ + "if compute_degs:\n", + " raw_counts = pd.read_csv(ds1)\n", + " sample_metadata = pd.read_csv(ds2)\n", + "\n", + " time_pt_list = []\n", + " for time_pt in sample_metadata[\"time_pt_annotation\"].tolist():\n", + " if time_pt not in time_pt_list:\n", + " time_pt_list.append(time_pt)\n", + "\n", + " time_pt_dict = {}\n", + " for i, time_pt in enumerate(time_pt_list):\n", + " samples_at_time_pt = sample_metadata.loc[sample_metadata[\"time_pt_annotation\"] == time_pt, \"sample_name\"].astype(str).tolist()\n", + " subset_counts = raw_counts[[\"gene_id\"] + samples_at_time_pt]\n", + " rev_subset_counts = subset_counts.set_index(\"gene_id\")\n", + " time_pt_dict[i] = (time_pt, rev_subset_counts)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "219cdcb4", + "metadata": {}, + "outputs": [], + "source": [ + "### [DESeq2] finding the DEGs from adjacent time pt comparisons\n", + "if compute_degs and (dge_method == '1' or dge_method == '3'):\n", + " adj_time_pt_comparisons = []\n", + " adj_time_pt_degs = []\n", + " for i in range(len(time_pt_list) - 1):\n", + " controls, cases = time_pt_dict[i][1], time_pt_dict[i+1][1]\n", + " results_df = deseq2_differential_expression(controls, cases)\n", + "\n", + " p_vals = [0.05] + [10**(-i) for i in range(2, 21, 1)]\n", + " significant_genes = results_df[results_df[\"padj\"] < p_vals[0]]\n", + " up_count = (significant_genes[\"log2FoldChange\"] > 0).sum()\n", + " down_count = (significant_genes[\"log2FoldChange\"] < 0).sum()\n", + "\n", + " idx = 1\n", + " while (up_count + down_count) > 2000:\n", + " significant_genes = results_df[results_df[\"padj\"] < p_vals[idx]]\n", + " up_count = (significant_genes[\"log2FoldChange\"] > 0).sum()\n", + " down_count = (significant_genes[\"log2FoldChange\"] < 0).sum()\n", + " idx += 1\n", + "\n", + " ctrl_time_pt, case_time_pt = time_pt_dict[i][0], time_pt_dict[i+1][0]\n", + " adj_time_pt_comparisons.append(f\"{ctrl_time_pt} v {case_time_pt}\")\n", + "\n", + " file = f\"deseq2_{case_time_pt}_v_{ctrl_time_pt}.csv\"\n", + " significant_genes.to_csv(file)\n", + " adj_time_pt_degs.append(file)\n", + "\n", + " print(f\"time point comparison: {ctrl_time_pt}_v_{case_time_pt}\")\n", + " print(f\"total DEGs: {up_count + down_count}, up genes: {up_count}, down genes: {down_count}, padj: {p_vals[idx-1]}\")\n", + " print()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8d5be5a8", + "metadata": {}, + "outputs": [], + "source": [ + "### [DESeq2] finding the DEGs from time pt 0 comparisons\n", + "if compute_degs and (dge_method == '1' or dge_method == '3'):\n", + " time_pt_0_comparisons = []\n", + " time_pt_0_degs = []\n", + " for i in range(1, len(time_pt_list)):\n", + " controls, cases = time_pt_dict[0][1], time_pt_dict[i][1]\n", + " results_df = deseq2_differential_expression(controls, cases)\n", + "\n", + " p_vals = [0.05] + [10**(-i) for i in range(2, 21, 1)]\n", + " significant_genes = results_df[results_df[\"padj\"] < p_vals[0]]\n", + " up_count = (significant_genes[\"log2FoldChange\"] > 0).sum()\n", + " down_count = (significant_genes[\"log2FoldChange\"] < 0).sum()\n", + "\n", + " idx = 1\n", + " while (up_count + down_count) > 2000:\n", + " significant_genes = results_df[results_df[\"padj\"] < p_vals[idx]]\n", + " up_count = (significant_genes[\"log2FoldChange\"] > 0).sum()\n", + " down_count = (significant_genes[\"log2FoldChange\"] < 0).sum()\n", + " idx += 1\n", + "\n", + " ctrl_time_pt, case_time_pt = time_pt_dict[0][0], time_pt_dict[i][0]\n", + " time_pt_0_comparisons.append(f\"{ctrl_time_pt} v {case_time_pt}\")\n", + "\n", + " file = f\"deseq2_{case_time_pt}_v_{ctrl_time_pt}.csv\"\n", + " significant_genes.to_csv(file)\n", + " time_pt_0_degs.append(file)\n", + "\n", + " print(f\"time point comparison: {ctrl_time_pt}_v_{case_time_pt}\")\n", + " print(f\"total DEGs: {up_count + down_count}, up genes: {up_count}, down genes: {down_count}, padj: {p_vals[idx-1]}\")\n", + " print()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "903a7430", + "metadata": {}, + "outputs": [], + "source": [ + "def up_gene_list(input_csv, filename=None):\n", + " \"\"\"\n", + " Outputs list of upregulated DEGs from DESeq2 results CSV.\n", + " \"\"\"\n", + " df = pd.read_csv(input_csv)\n", + " row_filter = df[\"log2FoldChange\"] > 0\n", + " filtered = df.loc[row_filter, df.columns[0]]\n", + " gene_ids = list(filtered)\n", + "\n", + " up_list = []\n", + " for gene in gene_ids:\n", + " if \"_\" in gene:\n", + " up_list.append(gene.split(\"_\", 1)[1])\n", + " else:\n", + " up_list.append(gene)\n", + "\n", + " return up_list\n", + "\n", + "\n", + "def down_gene_list(input_csv, filename=None):\n", + " \"\"\"\n", + " Outputs list of downregulated DEGs from DESeq2 results CSV.\n", + " \"\"\"\n", + " df = pd.read_csv(input_csv)\n", + " row_filter = df[\"log2FoldChange\"] < 0\n", + " filtered = df.loc[row_filter, df.columns[0]]\n", + " gene_ids = list(filtered)\n", + "\n", + " down_list = []\n", + " for gene in gene_ids:\n", + " if \"_\" in gene:\n", + " down_list.append(gene.split(\"_\", 1)[1])\n", + " else:\n", + " down_list.append(gene)\n", + "\n", + " return down_list\n", + "\n", + "\n", + "def csv_to_gmt(input_csv_list, comparisons, filename):\n", + " gmt_dict = {}\n", + " for i, file in enumerate(input_csv_list):\n", + " up_genes = up_gene_list(file)\n", + " down_genes = down_gene_list(file)\n", + " print(f\"up genes: {len(up_genes)}, down genes: {len(down_genes)}\")\n", + " gmt_dict[f\"{comparisons[i]} up genes\"] = up_genes\n", + " gmt_dict[f\"{comparisons[i]} down genes\"] = down_genes\n", + "\n", + " with open(filename, \"w\") as file:\n", + " for s,t in gmt_dict.items():\n", + " file.write(str(s) + \"\\t\\t\" + \"\\t\".join(t) + \"\\n\")\n", + " print(\"Finished creating the GMT file containing the PyDESeq2 DEGs at each time point.\")\n", + " return filename\n", + "\n", + "if compute_degs and (dge_method == '1' or dge_method == '3'):\n", + " deseq2_degs_gmt_1 = csv_to_gmt(adj_time_pt_degs, adj_time_pt_comparisons, \"appyter_deseq2_adj_time_pt_degs.gmt\")\n", + " deseq2_degs_gmt_2 = csv_to_gmt(time_pt_0_degs, time_pt_0_comparisons, \"appyter_deseq2_compare_w_time_pt_0_degs.gmt\")" + ] + }, + { + "cell_type": "markdown", + "id": "16b27a30", + "metadata": {}, + "source": [ + "### Differential Expression Method Option 2: Characteristic Direction\n", + "\n", + "The [Characteristic Direction](https://bmcbioinformatics.biomedcentral.com/articles/10.1186/1471-2105-15-79) method (Clark et al., 2014) is used to compute the DEGs of time series RNA-seq data given a user-inputted raw gene counts matrix and sample metadata file describing the time points. \n", + "\n", + "DEGs are computed by comparing gene expression at adjacent time points (*t0 vs t1, t1 vs t2, t2 vs t3, ... , tn-1 vs tn*) or with the initial time point (*t0 vs t1, t0 vs t2, t0 vs t3, ... , t0 vs tn*)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8468437f", + "metadata": {}, + "outputs": [], + "source": [ + "### [CD] finding the DEGs from adjacent time pt comparisons\n", + "def run_chea_kg(gene_list, num_tfs):\n", + " \"\"\"\n", + " Outputs JSON of TF subnetwork best corresponding to input gene list.\n", + " \"\"\"\n", + " CHEA_KG = 'https://chea-kg.maayanlab.cloud/api/enrichment'\n", + "\n", + " description = \"insert description here\"\n", + " payload = {\n", + " 'list': (None, \"\\n\".join(gene_list)),\n", + " 'description': (None, description)\n", + " }\n", + " response=requests.post(f\"{CHEA_KG}/addList\", files=payload)\n", + " time.sleep(0.2)\n", + " data = json.loads(response.text)\n", + "\n", + " q = {\n", + " 'min_lib': 3, # minimum number of libraries that a TF must be ranked in\n", + " 'libraries': [\n", + " {'library': \"Integrated--meanRank\", 'term_limit': num_tfs} # edit term_limit to change number of top-ranked TFs\n", + " ],\n", + " 'limit':50, # controls number of edges returned - may cause issues with visualization if too large\n", + " 'userListId': data['userListId']\n", + " }\n", + " query_json=json.dumps(q)\n", + " res = requests.post(CHEA_KG, data=query_json)\n", + " if res.ok:\n", + " data = json.loads(res.text)\n", + " return data\n", + " else:\n", + " data = None\n", + " return res.text\n", + "\n", + "\n", + "def top_tfs(gene_list, num_tfs=5):\n", + " \"\"\"\n", + " Returns a list of the top N most enriched TFs corresponding to an input gene list.\n", + " \"\"\"\n", + " enriched_tfs = run_chea_kg(gene_list, num_tfs)\n", + " tfs_list = []\n", + " for node in enriched_tfs[\"nodes\"]:\n", + " tfs_list.append(node[\"data\"][\"label\"])\n", + " return tfs_list\n", + "\n", + "\n", + "if compute_degs and (dge_method == '2' or dge_method == '3'):\n", + " cd_adj_time_pt_comparisons = []\n", + " cd_degs_1 = []\n", + " cd_tf_time_dict_1 = {}\n", + " for i in range(len(time_pt_list) - 1):\n", + " ctrl_time_pt, case_time_pt = time_pt_dict[i][0], time_pt_dict[i+1][0]\n", + " cd_adj_time_pt_comparisons.append(f\"{ctrl_time_pt} v {case_time_pt}\")\n", + "\n", + " controls, cases = time_pt_dict[i][1], time_pt_dict[i+1][1]\n", + " results_df = characteristic_direction(controls, cases)\n", + "\n", + " up_genes = up_down_from_characteristic_direction(results_df).up\n", + " up_list = []\n", + " for gene in up_genes:\n", + " if \"_\" in gene:\n", + " up_list.append(gene.split(\"_\", 1)[1])\n", + " else:\n", + " up_list.append(gene)\n", + "\n", + " down_genes = up_down_from_characteristic_direction(results_df).down\n", + " down_list = []\n", + " for gene in down_genes:\n", + " if \"_\" in gene:\n", + " down_list.append(gene.split(\"_\", 1)[1])\n", + " else:\n", + " down_list.append(gene)\n", + "\n", + " cd_degs_1.append((up_list, down_list))\n", + " cd_tf_time_dict_1[i] = (top_tfs(up_list, num_tfs), top_tfs(down_list, num_tfs))\n", + "\n", + " print(f\"time point comparison: {ctrl_time_pt}_v_{case_time_pt}\")\n", + " print(f\"total DEGs: {len(up_list) + len(down_list)}, up genes: {len(up_list)}, down genes: {len(down_list)}\")\n", + " print()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f86251ef", + "metadata": {}, + "outputs": [], + "source": [ + "### [CD] finding the DEGs from time pt 0 comparisons\n", + "if compute_degs and (dge_method == '2' or dge_method == '3'):\n", + " cd_time_pt_0_comparisons = []\n", + " cd_degs_2 = []\n", + " cd_tf_time_dict_2 = {}\n", + " for i in range(1, len(time_pt_list)):\n", + " ctrl_time_pt, case_time_pt = time_pt_dict[0][0], time_pt_dict[i][0]\n", + " cd_time_pt_0_comparisons.append(f\"{ctrl_time_pt} v {case_time_pt}\")\n", + "\n", + " controls, cases = time_pt_dict[0][1], time_pt_dict[i][1]\n", + " results_df = characteristic_direction(controls, cases)\n", + "\n", + " up_genes = up_down_from_characteristic_direction(results_df).up\n", + " up_list = []\n", + " for gene in up_genes:\n", + " if \"_\" in gene:\n", + " up_list.append(gene.split(\"_\", 1)[1])\n", + " else:\n", + " up_list.append(gene)\n", + "\n", + " down_genes = up_down_from_characteristic_direction(results_df).down\n", + " down_list = []\n", + " for gene in down_genes:\n", + " if \"_\" in gene:\n", + " down_list.append(gene.split(\"_\", 1)[1])\n", + " else:\n", + " down_list.append(gene)\n", + "\n", + " cd_degs_2.append((up_list, down_list))\n", + " cd_tf_time_dict_2[i-1] = (top_tfs(up_list, num_tfs), top_tfs(down_list, num_tfs))\n", + "\n", + " print(f\"time point comparison: {ctrl_time_pt}_v_{case_time_pt}\")\n", + " print(f\"total DEGs: {len(up_list) + len(down_list)}, up genes: {len(up_list)}, down genes: {len(down_list)}\")\n", + " print()" + ] + }, + { + "cell_type": "markdown", + "id": "f5424dc0", + "metadata": {}, + "source": [ + "## Step 2. Performing TF enrichment analysis\n", + "\n", + "The DEGs computed in Step 1 are submitted to [ChEA3](https://maayanlab.cloud/chea3/) (Keenan et al., 2019) for TF enrichment analysis. The output from this step is a set of enriched TFs for each up and down gene set at each time point. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b0175641", + "metadata": {}, + "outputs": [], + "source": [ + "def run_chea_kg(gene_list, num_tfs):\n", + " \"\"\"\n", + " Outputs JSON of TF subnetwork best corresponding to input gene list.\n", + " \"\"\"\n", + " CHEA_KG = 'https://chea-kg.maayanlab.cloud/api/enrichment'\n", + "\n", + " description = \"searching for enriched TFs\"\n", + " payload = {\n", + " 'list': (None, \"\\n\".join(gene_list)),\n", + " 'description': (None, description)\n", + " }\n", + " response=requests.post(f\"{CHEA_KG}/addList\", files=payload)\n", + " time.sleep(0.2)\n", + " data = json.loads(response.text)\n", + "\n", + " q = {\n", + " 'min_lib': 3, # minimum number of libraries that a TF must be ranked in\n", + " 'libraries': [\n", + " {'library': \"Integrated--meanRank\", 'term_limit': num_tfs} # edit term_limit to change number of top-ranked TFs\n", + " ],\n", + " 'limit':50, # controls number of edges returned - may cause issues with visualization if too large\n", + " 'userListId': data['userListId']\n", + " }\n", + " query_json=json.dumps(q)\n", + "\n", + " res = requests.post(CHEA_KG, data=query_json)\n", + " if res.ok:\n", + " data = json.loads(res.text)\n", + " return data\n", + " else:\n", + " data = None\n", + " return res.text\n", + "\n", + "\n", + "def top_tfs(gene_list, num_tfs=5):\n", + " \"\"\"\n", + " Returns a list of the top N most enriched TFs corresponding to an input gene list.\n", + " \"\"\"\n", + " enriched_tfs = run_chea_kg(gene_list, num_tfs)\n", + " tfs_list = []\n", + " for node in enriched_tfs[\"nodes\"]:\n", + " tfs_list.append(node[\"data\"][\"label\"])\n", + " return tfs_list" + ] + }, + { + "cell_type": "markdown", + "id": "a7aa8d98", + "metadata": {}, + "source": [ + "## Step 3. Constructing the regulatory subnetwork\n", + "\n", + "In step 3, a network that connects the enriched TFs at each time point is constructed. A JSON file describing the regulatory subnetwork of enriched TFs is created. Edges between enriched TF nodes are determined using [ChEA-KG](https://chea-kg.maayanlab.cloud/) (project led by Anna Byrd). " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "28ddb535", + "metadata": {}, + "outputs": [], + "source": [ + "def fetch_chea_kg_data(start_tf, end_tf):\n", + " \"\"\"\n", + " Outputs JSON data for shortest path connecting two TFs.\n", + " \"\"\"\n", + " base_url = \"https://chea-kg.maayanlab.cloud/api/knowledge_graph\"\n", + "\n", + " query_filter = {\n", + " \"start\": \"Transcription Factor\",\n", + " \"start_field\": \"label\",\n", + " \"start_term\": start_tf,\n", + " \"end\": \"Transcription Factor\",\n", + " \"end_field\": \"label\",\n", + " \"end_term\": end_tf\n", + " }\n", + "\n", + " encoded_filter = urllib.parse.quote(str(query_filter).replace(\"'\", '\"'))\n", + " full_url = f\"{base_url}?filter={encoded_filter}\"\n", + "\n", + " response = requests.get(full_url)\n", + " response.raise_for_status()\n", + " return response.json()\n", + "\n", + "\n", + "def get_tf_node_info(tf_label):\n", + " \"\"\"\n", + " Gets node information associated with single TF.\n", + " \"\"\"\n", + " base_url = \"https://chea-kg.maayanlab.cloud/api/knowledge_graph\"\n", + "\n", + " query_filter = {\n", + " \"start\": \"Transcription Factor\",\n", + " \"start_field\": \"label\",\n", + " \"start_term\": tf_label\n", + " }\n", + " encoded_filter = urllib.parse.quote(str(query_filter).replace(\"'\", '\"'))\n", + " full_url = f\"{base_url}?filter={encoded_filter}\"\n", + "\n", + " response = requests.get(full_url)\n", + " response.raise_for_status()\n", + " data = response.json()\n", + "\n", + " for node in data[\"nodes\"]:\n", + " if node[\"data\"][\"label\"] == tf_label:\n", + " return node\n", + " raise ValueError(f\"Node for TF '{tf_label}' not found in response.\")\n", + "\n", + "\n", + "def get_tf_edge_info(tf_label):\n", + " \"\"\"\n", + " Returns edge info if TF is autoregulatory.\n", + " \"\"\"\n", + " base_url = \"https://chea-kg.maayanlab.cloud/api/knowledge_graph\"\n", + "\n", + " query_filter = {\n", + " \"start\": \"Transcription Factor\",\n", + " \"start_field\": \"label\",\n", + " \"start_term\": tf_label\n", + " }\n", + " encoded_filter = urllib.parse.quote(str(query_filter).replace(\"'\", '\"'))\n", + " full_url = f\"{base_url}?filter={encoded_filter}\"\n", + "\n", + " response = requests.get(full_url)\n", + " response.raise_for_status()\n", + " data = response.json()\n", + "\n", + " for edge in data[\"edges\"]:\n", + " if edge[\"data\"][\"source_label\"] == tf_label and edge[\"data\"][\"target_label\"] == tf_label:\n", + " return edge\n", + " raise ValueError(f\"Self-edge for TF '{tf_label}' not found in response.\")\n", + "\n", + "\n", + "def create_tf_time_series_graph(tf_time_dict, num_comparisons, filename):\n", + " \"\"\"\n", + " Creates network of TFs given differentially expressed genes at each time point.\n", + " \"\"\"\n", + " subnetwork = {\"nodes\": [], \"edges\": []}\n", + " for time in tf_time_dict.keys():\n", + " up_tfs = tf_time_dict[time][0]\n", + " down_tfs = tf_time_dict[time][1]\n", + "\n", + " for tf in up_tfs:\n", + " node_info = get_tf_node_info(tf)\n", + " node_info[\"data\"][\"color\"] = \"#80eaff\"\n", + " node_info[\"data\"][\"id\"] = f\"{node_info['data']['label']}_up_{time}\"\n", + " subnetwork[\"nodes\"].append(node_info)\n", + "\n", + " for tf in down_tfs:\n", + " node_info = get_tf_node_info(tf)\n", + " node_info[\"data\"][\"color\"] = \"#ff8a80\"\n", + " node_info[\"data\"][\"id\"] = f\"{node_info['data']['label']}_down_{time}\"\n", + " subnetwork[\"nodes\"].append(node_info)\n", + "\n", + " print(\"Creating time series TF subnetwork data structure...\")\n", + " print(\"Case 1 = connecting two different TFs at adjacent time points\")\n", + " print(\"Case 2 = connecting the same TF at adjacent time points\")\n", + " for i in range(num_comparisons-1):\n", + " for j, source_tf_list in enumerate(tf_time_dict[i]):\n", + " for k, target_tf_list in enumerate(tf_time_dict[i+1]):\n", + " for source_tf in source_tf_list:\n", + " for target_tf in target_tf_list:\n", + " if source_tf != target_tf:\n", + " data = fetch_chea_kg_data(source_tf, target_tf)\n", + " if len(data[\"nodes\"]) == 2 and len(data[\"edges\"]) == 1:\n", + " if data[\"edges\"][0][\"data\"][\"source_label\"] == source_tf and \\\n", + " data[\"edges\"][0][\"data\"][\"target_label\"] == target_tf:\n", + " if j == 0 and k == 0:\n", + " data[\"edges\"][0][\"data\"][\"source\"] = f\"{source_tf}_up_{i}\"\n", + " data[\"edges\"][0][\"data\"][\"target\"] = f\"{target_tf}_up_{i+1}\"\n", + " elif j == 0 and k == 1:\n", + " data[\"edges\"][0][\"data\"][\"source\"] = f\"{source_tf}_up_{i}\"\n", + " data[\"edges\"][0][\"data\"][\"target\"] = f\"{target_tf}_down_{i+1}\"\n", + " elif j == 1 and k == 0:\n", + " data[\"edges\"][0][\"data\"][\"source\"] = f\"{source_tf}_down_{i}\"\n", + " data[\"edges\"][0][\"data\"][\"target\"] = f\"{target_tf}_up_{i+1}\"\n", + " elif j == 1 and k == 1:\n", + " data[\"edges\"][0][\"data\"][\"source\"] = f\"{source_tf}_down_{i}\"\n", + " data[\"edges\"][0][\"data\"][\"target\"] = f\"{target_tf}_down_{i+1}\"\n", + " subnetwork[\"edges\"].append(data[\"edges\"][0])\n", + " print(\"Edge added to subnetwork (case 1)\")\n", + " else:\n", + " if len(source_tf_list) != 0:\n", + " try:\n", + " edge = get_tf_edge_info(source_tf)\n", + " if j == 0 and k == 0:\n", + " edge[\"data\"][\"source\"] = f\"{source_tf}_up_{i}\"\n", + " edge[\"data\"][\"target\"] = f\"{target_tf}_up_{i+1}\"\n", + " elif j == 0 and k == 1:\n", + " edge[\"data\"][\"source\"] = f\"{source_tf}_up_{i}\"\n", + " edge[\"data\"][\"target\"] = f\"{target_tf}_down_{i+1}\"\n", + " elif j == 1 and k == 0:\n", + " edge[\"data\"][\"source\"] = f\"{source_tf}_down_{i}\"\n", + " edge[\"data\"][\"target\"] = f\"{target_tf}_up_{i+1}\"\n", + " elif j == 1 and k == 1:\n", + " edge[\"data\"][\"source\"] = f\"{source_tf}_down_{i}\"\n", + " edge[\"data\"][\"target\"] = f\"{target_tf}_down_{i+1}\"\n", + " subnetwork[\"edges\"].append(edge)\n", + " print(\"Edge added to subnetwork (case 2)\")\n", + " except ValueError:\n", + " continue\n", + " output_path = f\"{filename}.json\"\n", + " with open(output_path, \"w\") as outfile:\n", + " json.dump(subnetwork, outfile, indent=4)\n", + " print(\"Finished creating the time series TF subnetwork graph.\")\n", + " print()\n", + " return output_path\n", + "\n", + "\n", + "def gmt_to_tf_time_dict(gmt_file, num_tfs):\n", + " \"\"\"\n", + " Converts GMT file containing DEGs to tf_time_dict.\n", + " \"\"\"\n", + " print(\"Processing GMT file of DEGs...\")\n", + " with open(gmt_file, 'r') as f:\n", + " lines = f.readlines()\n", + "\n", + " temp_dict = {}\n", + " degs_list = []\n", + " for line in lines:\n", + " tokens = line.split(\"\\t\\t\")\n", + " term = tokens[0]\n", + " genes = [x.split(',')[0].strip() for x in tokens[1].split('\\t')]\n", + " degs_list.append(genes)\n", + " temp_dict[term] = top_tfs(genes, num_tfs) # edit this step to also find the top 10 TFs\n", + "\n", + " new_degs_list = []\n", + " for i in range(0, len(degs_list), 2):\n", + " new_degs_list.append((degs_list[i], degs_list[i+1]))\n", + "\n", + " comparisons = list(temp_dict.keys())\n", + " new_comparisons = []\n", + " for item in comparisons:\n", + " comp = item.rsplit(' ', 2)[0] # extracts \"Hour 1 vs Hour 0\" from \"Hour 1 vs Hour 0 up genes\" in GMT file\n", + " if comp not in new_comparisons:\n", + " new_comparisons.append(comp)\n", + "\n", + " j = 0\n", + " tf_time_dict = {}\n", + " for i in range(len(comparisons) // 2):\n", + " tf_time_dict[i] = (temp_dict[comparisons[j]], temp_dict[comparisons[j+1]])\n", + " j += 2\n", + " return tf_time_dict, new_comparisons, new_degs_list" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ea6a3d5d", + "metadata": {}, + "outputs": [], + "source": [ + "%%appyter hide_code\n", + "\n", + "{% do SectionField(\n", + " name= 'gmt_section_header',\n", + " title= 'Upload files to this section ONLY if you pre-computed up and down DEGs and saved them in a GMT file.'\n", + ")%}\n", + "\n", + "{% do SectionField(\n", + " name= 'gmt_data',\n", + " title= '1. Upload differentially expressed genes as a GMT file.'\n", + ")%}\n", + "\n", + "{% do SectionField(\n", + " name= 'tf_section',\n", + " title= '2. Choose the number of top enriched TFs to include in the visualizations.'\n", + ") %}\n", + "\n", + "{% do SectionField(\n", + " name= 'final_section',\n", + " title= '3. Provide a short description of your study (optional).'\n", + ") %}" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a693db24", + "metadata": {}, + "outputs": [], + "source": [ + "%%appyter code_eval\n", + "\n", + "{% do DescriptionField(\n", + " name= 'description_2',\n", + " text= 'Each row should consist of either the \"up\" or \"down\" differentially expressed genes at each time point comparison. The first element of each row should be formatted exactly as \"{time point comparison} up genes\" or \"{time point comparison} down genes\". See example files for how to format the input GMT file.',\n", + " section= 'gmt_data'\n", + ") %}\n", + "\n", + "{% set dataset3 = FileField(\n", + " name= 'dataset3',\n", + " label= 'GMT file containing DEGs from ADJACENT TIME POINT COMPARISONS',\n", + " default= '',\n", + " examples= {'First set of DEGs from TRAIL-treated TNBC cell line': 'https://drive.google.com/uc?export=download&id=1Ut7M5GErrTcZD_MDgkA4PD2qCl8Bn4Yj'},\n", + " section= 'gmt_data'\n", + ") %}\n", + "\n", + "ds3 = {{dataset3}}\n", + "\n", + "{% set dataset4 = FileField(\n", + " name= 'dataset4',\n", + " label= 'GMT file containing DEGs from COMPARISONS WITH TIME POINT 0',\n", + " default= '',\n", + " examples= {'Second set of DEGS from TRAIL-treated TNBC cell line': 'https://drive.google.com/uc?export=download&id=1UNHrktxI5asnvVniUZgnZphFR8qw4VIo'},\n", + " section= 'gmt_data'\n", + ") %}\n", + "\n", + "ds4 = {{dataset4}}\n", + "\n", + "{% set chosen_num = ChoiceField(\n", + " name= 'chosen_num_tfs_2',\n", + " label= 'Number of top enriched TFs',\n", + " default= '5',\n", + " choices= {'5': '1', '10': '2'},\n", + " section= 'tf_section'\n", + ") %}\n", + "\n", + "if not compute_degs:\n", + " num_tfs = {{chosen_num}}\n", + " num_tfs = str(num_tfs)\n", + "\n", + " if num_tfs == '1':\n", + " num_tfs = 5\n", + " if num_tfs == '2':\n", + " num_tfs = 10\n", + "\n", + "{% set user_description_2 = TextField(\n", + " name= 'user_description_2',\n", + " label= 'Description',\n", + " default= '',\n", + " section = 'final_section',\n", + ") %}\n", + "\n", + "if not compute_degs:\n", + " umap_desc = {{user_description_2}}" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "cde58a65", + "metadata": {}, + "outputs": [], + "source": [ + "if compute_degs and (dge_method == '1' or dge_method == '3'):\n", + " deseq2_tf_time_dict_1, deseq2_adj_time_pt_comparisons, deseq2_degs_1 = gmt_to_tf_time_dict(deseq2_degs_gmt_1, num_tfs)\n", + " deseq2_subnetwork_data_1 = create_tf_time_series_graph(deseq2_tf_time_dict_1, len(deseq2_adj_time_pt_comparisons), \"appyter_deseq2_adj_time_pts_top_5_tfs\")\n", + "\n", + " deseq2_tf_time_dict_2, deseq2_time_pt_0_comparisons, deseq2_degs_2 = gmt_to_tf_time_dict(deseq2_degs_gmt_2, num_tfs)\n", + " deseq2_subnetwork_data_2 = create_tf_time_series_graph(deseq2_tf_time_dict_2, len(deseq2_time_pt_0_comparisons), \"appyter_deseq2_compare_w_time_pt_0_top_5_tfs\")\n", + "\n", + "if compute_degs and (dge_method == '2' or dge_method == '3'):\n", + " cd_subnetwork_data_1 = create_tf_time_series_graph(cd_tf_time_dict_1, len(cd_adj_time_pt_comparisons), \"appyter_cd_adj_time_pts_top_5_tfs\")\n", + " cd_subnetwork_data_2 = create_tf_time_series_graph(cd_tf_time_dict_2, len(cd_time_pt_0_comparisons), \"appyter_cd_compare_w_time_pt_0_top_5_tfs\")\n", + "\n", + "if not compute_degs:\n", + " if ds3:\n", + " tf_time_dict_1, comparisons_1, deseq2_degs_1 = gmt_to_tf_time_dict(ds3, num_tfs)\n", + " subnetwork_data_1 = create_tf_time_series_graph(tf_time_dict_1, len(comparisons_1), \"appyter_deseq2_adj_time_pts_top_5_tfs\")\n", + "\n", + " if ds4:\n", + " tf_time_dict_2, comparisons_2, deseq2_degs_2 = gmt_to_tf_time_dict(ds4, num_tfs)\n", + " subnetwork_data_2 = create_tf_time_series_graph(tf_time_dict_2, len(comparisons_2), \"appyter_deseq2_compare_w_time_pt_0_top_5_tfs\")" + ] + }, + { + "cell_type": "markdown", + "id": "b3140530", + "metadata": {}, + "source": [ + "## Step 4. Visualizing the enriched TFs within a time series regulatory subnetwork\n", + "\n", + "The JSON file created in step 3 is used to visualize the regulatory network using ball-and-stick diagrams. Blue and red nodes correspond to TFs enriched for upregulated and downregulated gene sets at the given time point, respectively. Activation (green) or inhibition (red) arrows are drawn between TFs at adjacent time points (as determined by [ChEA-KG](https://chea-kg.maayanlab.cloud/)), therefore forming a regulatory subnetwork of all the enriched TFs. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d715c5cb", + "metadata": {}, + "outputs": [], + "source": [ + "def export_cytoscape_json(data, filename):\n", + " with open(filename, \"w\") as f:\n", + " json.dump(data, f, indent=2)\n", + " display(FileLink(filename))\n", + "\n", + "\n", + "def visualize_network_2(data, filename):\n", + " row_col_dict = {}\n", + " for node in data[\"nodes\"]:\n", + " if \"position\" in node:\n", + " continue\n", + " node_id = node[\"data\"][\"id\"]\n", + " row_index = int(node_id.split(\"_\")[-1])\n", + " col_index = row_col_dict.get(row_index, 1)\n", + " row_col_dict[row_index] = col_index + 1 # sets the col_index for the next node in that row\n", + " node[\"position\"] = {\"x\": col_index * 150, \"y\": row_index * 150}\n", + "\n", + " cyto_widget = CytoscapeWidget()\n", + " cyto_widget.graph.add_graph_from_json(data)\n", + " cyto_widget.set_layout(name='preset')\n", + "\n", + " cyto_widget.set_style([{\n", + " 'selector': 'node',\n", + " 'style': {\n", + " 'label': 'data(label)',\n", + " 'background-color': 'data(color)',\n", + " 'border-width': 'data(borderWidth)',\n", + " 'border-color': 'data(borderColor)',\n", + " 'width': 50,\n", + " 'height': 50,\n", + " 'font-size': '16px',\n", + " 'font-weight': 'bold',\n", + " 'text-valign': 'center',\n", + " 'text-halign': 'center'\n", + " }\n", + " }, {\n", + " 'selector': '.row-label',\n", + " 'style': {\n", + " 'label': 'data(label)',\n", + " 'background-color': '#ffffff',\n", + " 'color': '#000000',\n", + " 'font-size': '20px',\n", + " 'width': 5,\n", + " 'height': 5,\n", + " 'text-valign': 'center',\n", + " 'text-halign': 'center'\n", + " }\n", + " }, {\n", + " 'selector': 'edge',\n", + " 'style': {\n", + " 'width': 3,\n", + " 'line-color': 'data(lineColor)',\n", + " 'target-arrow-color': 'data(lineColor)',\n", + " 'target-arrow-shape': 'data(directed)',\n", + " 'curve-style': 'bezier',\n", + " 'arrow-scale': 1.5\n", + " }\n", + " }])\n", + "\n", + " display(cyto_widget)\n", + " json_filename = f\"{filename}.json\"\n", + " export_cytoscape_json(data, json_filename)\n", + "\n", + "\n", + "def run_visualization(input_json, comparisons, filename):\n", + " if isinstance(input_json, dict):\n", + " data = input_json\n", + " else:\n", + " with open(input_json, \"r\") as input_file:\n", + " data = json.load(input_file)\n", + "\n", + " nodes = data[\"nodes\"]\n", + " for i, comparison in enumerate(comparisons):\n", + " label_node = {\n", + " 'data': {\n", + " 'id': f'row_label_{i}',\n", + " 'label': comparison,\n", + " 'color': '#ffffff',\n", + " 'borderColor': '#ffffff',\n", + " 'borderWidth': 0\n", + " },\n", + " 'classes': 'row-label',\n", + " 'position': {\"x\": 0, \"y\": i * 150}\n", + " }\n", + " nodes.append(label_node)\n", + "\n", + " visualize_network_2(data, filename)\n", + " return \"VISUALIZATION HAS RUN\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "0e94259d", + "metadata": {}, + "outputs": [], + "source": [ + "if compute_degs and (dge_method == '1' or dge_method == '3'):\n", + " for i, comparison in enumerate(deseq2_adj_time_pt_comparisons):\n", + " all_enriched_tfs = list(deseq2_tf_time_dict_1[i][0]) + list(deseq2_tf_time_dict_1[i][1])\n", + " # print(all_enriched_tfs)\n", + "\n", + " up_enriched_tfs = []\n", + " for tf in all_enriched_tfs:\n", + " if tf in deseq2_degs_1[i][0]:\n", + " up_enriched_tfs.append(tf)\n", + " print(f\"{comparison} enriched TFs found in {comparison} up genes: {up_enriched_tfs}\")\n", + "\n", + " if i < (len(deseq2_adj_time_pt_comparisons) - 1):\n", + " up_enriched_tfs = []\n", + " for tf in all_enriched_tfs:\n", + " if tf in deseq2_degs_1[i+1][0]:\n", + " up_enriched_tfs.append(tf)\n", + " print(f\"{comparison} enriched TFs found in {deseq2_adj_time_pt_comparisons[i+1]} up genes: {up_enriched_tfs}\")\n", + "\n", + " down_enriched_tfs = []\n", + " for tf in all_enriched_tfs:\n", + " if tf in deseq2_degs_1[i][1]:\n", + " down_enriched_tfs.append(tf)\n", + " print(f\"{comparison} enriched TFs found in {comparison} down genes: {down_enriched_tfs}\")\n", + "\n", + " if i < (len(deseq2_adj_time_pt_comparisons) - 1):\n", + " down_enriched_tfs = []\n", + " for tf in all_enriched_tfs:\n", + " if tf in deseq2_degs_1[i+1][1]:\n", + " down_enriched_tfs.append(tf)\n", + " print(f\"{comparison} enriched TFs found in {deseq2_adj_time_pt_comparisons[i+1]} down genes: {down_enriched_tfs}\")\n", + "\n", + " run_visualization(deseq2_subnetwork_data_1, deseq2_adj_time_pt_comparisons, \"deseq2_adj_time_pt_visualization\")\n", + " display(Markdown(f\"##### *__Figure 1.1__: Subnetwork of enriched TFs determined from comparing gene expression at adjacent time points (DEGs computed using PyDESeq2). Blue TFs are enriched for up genes while red TFs are enriched for down genes. Activation and inhibition arrows depict the potential regulatory effects of a TF in an earlier time point on a TF in the subsequent time point.*\"))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "eeae420a", + "metadata": {}, + "outputs": [], + "source": [ + "if compute_degs and (dge_method == '1' or dge_method == '3'):\n", + " for i, comparison in enumerate(deseq2_time_pt_0_comparisons):\n", + " all_enriched_tfs = list(deseq2_tf_time_dict_2[i][0]) + list(deseq2_tf_time_dict_2[i][1])\n", + " # print(all_enriched_tfs)\n", + "\n", + " up_enriched_tfs = []\n", + " for tf in all_enriched_tfs:\n", + " if tf in deseq2_degs_2[i][0]:\n", + " up_enriched_tfs.append(tf)\n", + " print(f\"{comparison} enriched TFs found in {comparison} up genes: {up_enriched_tfs}\")\n", + "\n", + " if i < (len(deseq2_time_pt_0_comparisons) - 1):\n", + " up_enriched_tfs = []\n", + " for tf in all_enriched_tfs:\n", + " if tf in deseq2_degs_2[i+1][0]:\n", + " up_enriched_tfs.append(tf)\n", + " print(f\"{comparison} enriched TFs found in {deseq2_time_pt_0_comparisons[i+1]} up genes: {up_enriched_tfs}\")\n", + "\n", + " down_enriched_tfs = []\n", + " for tf in all_enriched_tfs:\n", + " if tf in deseq2_degs_2[i][1]:\n", + " down_enriched_tfs.append(tf)\n", + " print(f\"{comparison} enriched TFs found in {comparison} down genes: {down_enriched_tfs}\")\n", + "\n", + " if i < (len(deseq2_time_pt_0_comparisons) - 1):\n", + " down_enriched_tfs = []\n", + " for tf in all_enriched_tfs:\n", + " if tf in deseq2_degs_2[i+1][1]:\n", + " down_enriched_tfs.append(tf)\n", + " print(f\"{comparison} enriched TFs found in {deseq2_time_pt_0_comparisons[i+1]} down genes: {down_enriched_tfs}\")\n", + "\n", + " run_visualization(deseq2_subnetwork_data_2, deseq2_time_pt_0_comparisons, \"deseq2_compare_w_time_pt_0_visualization\")\n", + " display(Markdown(f\"##### *__Figure 1.2__: Subnetwork of enriched TFs determined from comparing gene expression at each time point to time point 0 (DEGs computed using PyDESeq2). Blue TFs are enriched for up genes while red TFs are enriched for down genes. Activation and inhibition arrows depict the potential regulatory effects of a TF in an earlier time point on a TF in the subsequent time point.*\"))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f2af5a30", + "metadata": {}, + "outputs": [], + "source": [ + "if compute_degs and dge_method == '2':\n", + " fig_nums = ('1.1', '1.2')\n", + "\n", + "if compute_degs and dge_method == '3':\n", + " fig_nums = ('1.3', '1.4')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d2c4abdc", + "metadata": {}, + "outputs": [], + "source": [ + "if compute_degs and (dge_method == '2' or dge_method == '3'):\n", + " for i, comparison in enumerate(cd_adj_time_pt_comparisons):\n", + " all_enriched_tfs = list(cd_tf_time_dict_1[i][0]) + list(cd_tf_time_dict_1[i][1])\n", + " # print(all_enriched_tfs)\n", + "\n", + " up_enriched_tfs = []\n", + " for tf in all_enriched_tfs:\n", + " if tf in cd_degs_1[i][0]:\n", + " up_enriched_tfs.append(tf)\n", + " print(f\"{comparison} enriched TFs found in {comparison} up genes: {up_enriched_tfs}\")\n", + "\n", + " if i < (len(cd_adj_time_pt_comparisons) - 1):\n", + " up_enriched_tfs = []\n", + " for tf in all_enriched_tfs:\n", + " if tf in cd_degs_1[i+1][0]:\n", + " up_enriched_tfs.append(tf)\n", + " print(f\"{comparison} enriched TFs found in {cd_adj_time_pt_comparisons[i+1]} up genes: {up_enriched_tfs}\")\n", + "\n", + " down_enriched_tfs = []\n", + " for tf in all_enriched_tfs:\n", + " if tf in cd_degs_1[i][1]:\n", + " down_enriched_tfs.append(tf)\n", + " print(f\"{comparison} enriched TFs found in {comparison} down genes: {down_enriched_tfs}\")\n", + "\n", + " if i < (len(cd_adj_time_pt_comparisons) - 1):\n", + " down_enriched_tfs = []\n", + " for tf in all_enriched_tfs:\n", + " if tf in cd_degs_1[i+1][1]:\n", + " down_enriched_tfs.append(tf)\n", + " print(f\"{comparison} enriched TFs found in {cd_adj_time_pt_comparisons[i+1]} down genes: {down_enriched_tfs}\")\n", + "\n", + " run_visualization(cd_subnetwork_data_1, cd_adj_time_pt_comparisons, \"cd_adj_time_pt_visualization\")\n", + " display(Markdown(f\"##### *__Figure {fig_nums[0]}__: Subnetwork of enriched TFs determined from comparing gene expression at adjacent time points (DEGs computed using CD). Blue TFs are enriched for up genes while red TFs are enriched for down genes. Activation and inhibition arrows depict the potential regulatory effects of a TF in an earlier time point on a TF in the subsequent time point.*\"))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "375df57a", + "metadata": {}, + "outputs": [], + "source": [ + "if compute_degs and (dge_method == '2' or dge_method == '3'):\n", + " for i, comparison in enumerate(cd_time_pt_0_comparisons):\n", + " all_enriched_tfs = list(cd_tf_time_dict_2[i][0]) + list(cd_tf_time_dict_2[i][1])\n", + " # print(all_enriched_tfs)\n", + "\n", + " up_enriched_tfs = []\n", + " for tf in all_enriched_tfs:\n", + " if tf in cd_degs_2[i][0]:\n", + " up_enriched_tfs.append(tf)\n", + " print(f\"{comparison} enriched TFs found in {comparison} up genes: {up_enriched_tfs}\")\n", + "\n", + " if i < (len(cd_time_pt_0_comparisons) - 1):\n", + " up_enriched_tfs = []\n", + " for tf in all_enriched_tfs:\n", + " if tf in cd_degs_2[i+1][0]:\n", + " up_enriched_tfs.append(tf)\n", + " print(f\"{comparison} enriched TFs found in {cd_time_pt_0_comparisons[i+1]} up genes: {up_enriched_tfs}\")\n", + "\n", + " down_enriched_tfs = []\n", + " for tf in all_enriched_tfs:\n", + " if tf in cd_degs_2[i][1]:\n", + " down_enriched_tfs.append(tf)\n", + " print(f\"{comparison} enriched TFs found in {comparison} down genes: {down_enriched_tfs}\")\n", + "\n", + " if i < (len(cd_time_pt_0_comparisons) - 1):\n", + " down_enriched_tfs = []\n", + " for tf in all_enriched_tfs:\n", + " if tf in cd_degs_2[i+1][1]:\n", + " down_enriched_tfs.append(tf)\n", + " print(f\"{comparison} enriched TFs found in {cd_time_pt_0_comparisons[i+1]} down genes: {down_enriched_tfs}\")\n", + "\n", + " run_visualization(cd_subnetwork_data_2, cd_time_pt_0_comparisons, \"cd_compare_w_time_pt_0_visualization\")\n", + " display(Markdown(f\"##### *__Figure {fig_nums[1]}__: Subnetwork of enriched TFs determined from comparing gene expression at each time point to time point 0 (DEGs computed using CD). Blue TFs are enriched for up genes while red TFs are enriched for down genes. Activation and inhibition arrows depict the potential regulatory effects of a TF in an earlier time point on a TF in the subsequent time point.*\"))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "64243b0a", + "metadata": {}, + "outputs": [], + "source": [ + "if not compute_degs:\n", + " if ds3:\n", + " for i, comparison in enumerate(comparisons_1):\n", + " all_enriched_tfs = list(tf_time_dict_1[i][0]) + list(tf_time_dict_1[i][1])\n", + " # print(all_enriched_tfs)\n", + "\n", + " up_enriched_tfs = []\n", + " for tf in all_enriched_tfs:\n", + " if tf in deseq2_degs_1[i][0]:\n", + " up_enriched_tfs.append(tf)\n", + " print(f\"{comparison} enriched TFs found in {comparison} up genes: {up_enriched_tfs}\")\n", + "\n", + " if i < (len(comparisons_1) - 1):\n", + " up_enriched_tfs = []\n", + " for tf in all_enriched_tfs:\n", + " if tf in deseq2_degs_1[i+1][0]:\n", + " up_enriched_tfs.append(tf)\n", + " print(f\"{comparison} enriched TFs found in {comparisons_1[i+1]} up genes: {up_enriched_tfs}\")\n", + "\n", + " down_enriched_tfs = []\n", + " for tf in all_enriched_tfs:\n", + " if tf in deseq2_degs_1[i][1]:\n", + " down_enriched_tfs.append(tf)\n", + " print(f\"{comparison} enriched TFs found in {comparison} down genes: {down_enriched_tfs}\")\n", + "\n", + " if i < (len(comparisons_1) - 1):\n", + " down_enriched_tfs = []\n", + " for tf in all_enriched_tfs:\n", + " if tf in deseq2_degs_1[i+1][1]:\n", + " down_enriched_tfs.append(tf)\n", + " print(f\"{comparison} enriched TFs found in {comparisons_1[i+1]} down genes: {down_enriched_tfs}\")\n", + "\n", + " run_visualization(subnetwork_data_1, comparisons_1, \"adj_time_pt_visualization\")\n", + " display(Markdown(f\"##### *__Figure 1.1__: Subnetwork of enriched TFs determined from comparing gene expression at adjacent time points. Blue TFs are enriched for up genes while red TFs are enriched for down genes. Activation and inhibition arrows depict the potential regulatory effects of a TF in an earlier time point on a TF in the subsequent time point.*\"))\n", + "\n", + " if ds4:\n", + " for i, comparison in enumerate(comparisons_2):\n", + " all_enriched_tfs = list(tf_time_dict_2[i][0]) + list(tf_time_dict_2[i][1])\n", + " # print(all_enriched_tfs)\n", + "\n", + " up_enriched_tfs = []\n", + " for tf in all_enriched_tfs:\n", + " if tf in deseq2_degs_2[i][0]:\n", + " up_enriched_tfs.append(tf)\n", + " print(f\"{comparison} enriched TFs found in {comparison} up genes: {up_enriched_tfs}\")\n", + "\n", + " if i < (len(comparisons_2) - 1):\n", + " up_enriched_tfs = []\n", + " for tf in all_enriched_tfs:\n", + " if tf in deseq2_degs_2[i+1][0]:\n", + " up_enriched_tfs.append(tf)\n", + " print(f\"{comparison} enriched TFs found in {comparisons_2[i+1]} up genes: {up_enriched_tfs}\")\n", + "\n", + " down_enriched_tfs = []\n", + " for tf in all_enriched_tfs:\n", + " if tf in deseq2_degs_2[i][1]:\n", + " down_enriched_tfs.append(tf)\n", + " print(f\"{comparison} enriched TFs found in {comparison} down genes: {down_enriched_tfs}\")\n", + "\n", + " if i < (len(comparisons_2) - 1):\n", + " down_enriched_tfs = []\n", + " for tf in all_enriched_tfs:\n", + " if tf in deseq2_degs_2[i+1][1]:\n", + " down_enriched_tfs.append(tf)\n", + " print(f\"{comparison} enriched TFs found in {comparisons_2[i+1]} down genes: {down_enriched_tfs}\")\n", + "\n", + " run_visualization(subnetwork_data_2, comparisons_2, \"compare_w_time_pt_0_visualization\")\n", + " display(Markdown(f\"##### *__Figure 1.2__: Subnetwork of enriched TFs determined from comparing gene expression at each time point to time point 0. Blue TFs are enriched for up genes while red TFs are enriched for down genes. Activation and inhibition arrows depict the potential regulatory effects of a TF in an earlier time point on a TF in the subsequent time point.*\"))" + ] + }, + { + "cell_type": "markdown", + "id": "92ffcff8", + "metadata": {}, + "source": [ + "## Step 5. Bar graph representation of enriched TF ranks\n", + "\n", + "The bar graphs below depict the ranks of the top enriched TFs across the TF-target gene set libraries in ChEA3 (Keenan et al., 2019). Bar graphs are shown for the enriched TFs for the \"up\" and \"down\" gene sets at each time point. \n", + "\n", + "Here, a TF's rank within a given library refers to how well the TF's target genes within that library overlap with the input gene set (e.g. up genes at the \"hour 3 vs hour 1\" comparison) compared to other TFs within that library. The top enriched TFs are computed by finding the TFs with the lowest average rank across all six ChEA3 libraries (referred to as the MeanRank method). " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c8a6c577", + "metadata": {}, + "outputs": [], + "source": [ + "def get_chea3_results(gene_set, query_name):\n", + " ADDLIST_URL = 'https://maayanlab.cloud/chea3/api/enrich/'\n", + " payload = {\n", + " 'gene_set': gene_set,\n", + " 'query_name': query_name\n", + " }\n", + " response = requests.post(ADDLIST_URL, data=json.dumps(payload))\n", + " if not response.ok:\n", + " # r.ok (where r is the object) returns whether the call to the url was successful\n", + " raise Exception('Error analyzing gene list')\n", + " time.sleep(1)\n", + " return json.loads(response.text) # .text returns the content of response in\n", + "\n", + "\n", + "def indexfinder(lib_score_list, value):\n", + " index = 1\n", + " for num in lib_score_list:\n", + " if num == value:\n", + " return index\n", + " elif num != 0:\n", + " index += 1" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a531fe3e", + "metadata": {}, + "outputs": [], + "source": [ + "def get_bar_graph(gene_set, query_name, num_tfs, title):\n", + " term_limit = num_tfs\n", + "\n", + " c_lib_palette = {'ARCHS4 Coexpression':'rgb(196, 8, 8)',\n", + " 'ENCODE ChIP-seq':'rgb(244, 109, 67)',\n", + " 'Enrichr Queries':'rgb(242, 172, 68)',\n", + " 'GTEx Coexpression':'rgb(236, 252, 68)',\n", + " 'Literature ChIP-seq':'rgb(165, 242, 162)',\n", + " 'ReMap ChIP-seq':'rgb(92, 217, 78)'}\n", + "\n", + " c_lib_means = {'ARCHS4 Coexpression': [0] * term_limit, 'ENCODE ChIP-seq': [0] * term_limit,\n", + " 'Enrichr Queries': [0] * term_limit, 'GTEx Coexpression': [0] * term_limit,\n", + " 'Literature ChIP-seq': [0] * term_limit, 'ReMap ChIP-seq': [0] * term_limit}\n", + " # creates a dictionary where each library is a key, and the values are empty lists with as\n", + " # many indices/spaces as the user has requested transcription factors (ex: if the user requests\n", + " # 15 TFs to be returned, the lists will have 15 spaces)\n", + "\n", + " libs_sorted = ['ARCHS4 Coexpression','ENCODE ChIP-seq','Enrichr Queries',\n", + " 'GTEx Coexpression','Literature ChIP-seq','ReMap ChIP-seq']\n", + "\n", + " results = get_chea3_results(gene_set, query_name)\n", + " mr_results = results['Integrated--meanRank']\n", + " # for MeanRank, the TFs are already ranked by 'Score' within mr_results\n", + "\n", + " for i in range(len(mr_results)):\n", + " for lib in libs_sorted:\n", + " mr_results[i].update({lib:0})\n", + "\n", + " for i in range(len(mr_results)):\n", + " thing = mr_results[i]['Library'].split(';')\n", + " for a in range(len(thing)):\n", + " library, value = thing[a].split(',')\n", + " mr_results[i].update({library:int(value)})\n", + "\n", + " sortedARCHS4 = sorted(mr_results, key = lambda k: k['ARCHS4 Coexpression'])\n", + " sortedGTEx = sorted(mr_results, key = lambda k: k['GTEx Coexpression'])\n", + " sortedEnrichr = sorted(mr_results, key = lambda k: k['Enrichr Queries'])\n", + " sortedENCODE = sorted(mr_results, key = lambda k: k['ENCODE ChIP-seq'])\n", + " sortedReMap = sorted(mr_results, key = lambda k: k['ReMap ChIP-seq'])\n", + " sortedLit = sorted(mr_results, key = lambda k: k['Literature ChIP-seq'])\n", + "\n", + " rankedARCHS4 = [entry['ARCHS4 Coexpression'] for entry in sortedARCHS4]\n", + " rankedENCODE = [entry['ENCODE ChIP-seq'] for entry in sortedENCODE]\n", + " rankedEnrichr = [entry['Enrichr Queries'] for entry in sortedEnrichr]\n", + " rankedGTEx = [entry['GTEx Coexpression'] for entry in sortedGTEx]\n", + " rankedLit = [entry['Literature ChIP-seq'] for entry in sortedLit]\n", + " rankedReMap = [entry['ReMap ChIP-seq'] for entry in sortedReMap]\n", + "\n", + " ranking_dict = {'ARCHS4 Coexpression':rankedARCHS4,\n", + " 'ENCODE ChIP-seq':rankedENCODE,\n", + " 'Enrichr Queries':rankedEnrichr,\n", + " 'GTEx Coexpression':rankedGTEx,\n", + " 'Literature ChIP-seq':rankedLit,\n", + " 'ReMap ChIP-seq':rankedReMap}\n", + "\n", + " # Computing MeanRank\n", + " for tfentry in mr_results:\n", + " tfentry.update( [('SumRank', 0), ('AvgRank', 0) ])\n", + " library_scores = tfentry['Library'].split(';')\n", + " lib_counter = 0\n", + " for a in library_scores:\n", + " l, v = a.split(',')\n", + " v = int(v)\n", + " #scorerank = ranking_dict[l].index(v) + 1\n", + " scorerank = indexfinder(ranking_dict[l], int(v))\n", + " tfentry['SumRank'] += int(scorerank)\n", + " lib_counter += 1\n", + " tfentry['AvgRank'] = (tfentry['SumRank'] / lib_counter)\n", + " sorted_results = sorted(mr_results, key = lambda k: k['AvgRank']) # rank by AvgRank (aka MeanRank method)\n", + "\n", + " sorted_top_results = [] # only adds num_tfs # of TFs\n", + " threshold = 3\n", + " index = 0\n", + " while (len(sorted_top_results) < term_limit) and (index < len(sorted_results)):\n", + " if len(sorted_results[index]['Library'].split(';')) >= threshold: # makes sure there are enough libraries\n", + " sorted_top_results.append(sorted_results[index])\n", + " index += 1\n", + "\n", + " sorted_top_results = sorted_top_results[::-1]\n", + "\n", + " sorted_tfs = []\n", + " for i in range(0, len(sorted_top_results)):\n", + " sorted_tfs.append(sorted_top_results[i].get('TF'))\n", + "\n", + " # Defining bar length\n", + " for i, tfentry in enumerate(sorted_top_results):\n", + " libscores = tfentry['Library'].split(';')\n", + " for a in libscores:\n", + " lib, value = a.split(',')\n", + " rank = indexfinder(ranking_dict[lib], int(value))\n", + " avg = tfentry['AvgRank']\n", + " tot = tfentry['SumRank']\n", + " bar_length = (rank*avg)/tot\n", + " c_lib_means[lib][i] = float(bar_length)\n", + "\n", + " # Plotting the actual bar chart\n", + " fig = go.Figure(data = [go.Bar(name = c_lib,\n", + " x = c_lib_means[c_lib],\n", + " y = sorted_tfs,\n", + " marker = go.bar.Marker(color = c_lib_palette[c_lib]),\n", + " orientation = 'h')\n", + " for c_lib in libs_sorted])\n", + " h = 400 if term_limit <=10 else 400+10*term_limit\n", + " fig.update_layout(barmode = 'stack')\n", + " '''fig.update_layout(\n", + " title = {\n", + " 'text': 'Stacked Bar Chart of Average Ranks in Different Libraries',\n", + " 'y': 0.67,\n", + " 'x': 0.5,\n", + " 'xanchor': 'center',\n", + " 'yanchor': 'top',\n", + " }\n", + " )'''\n", + " fig.update_layout(\n", + "\n", + " xaxis_title = 'Average of Ranks Across All Libraries',\n", + " yaxis_title = title,\n", + " font = dict(\n", + " size = 12,\n", + " color = 'black'\n", + " ),\n", + " width=900,\n", + " height=h\n", + " )\n", + " # uid = uuid.uuid4().hex[:8]\n", + " # folder = Path(\"chea3_graph_exports\")\n", + " # folder.mkdir(exist_ok=True)\n", + "\n", + " # svg_path = folder / f\"bar_plot_{uid}.svg\"\n", + " # png_path = folder / f\"bar_plot_{uid}.png\"\n", + " # jpg_path = folder / f\"bar_plot_{uid}.jpg\"\n", + "\n", + " # pio.write_image(fig, str(svg_path), format=\"svg\")\n", + " # pio.write_image(fig, str(png_path), format=\"png\")\n", + " # pio.write_image(fig, str(jpg_path), format=\"jpg\")\n", + "\n", + " # html_str = fig.to_html(include_plotlyjs='cdn')\n", + " # escaped_html = html.escape(html_str)\n", + " # iframe = f\"\"\"\n", + " # \n", + " # \"\"\"\n", + "\n", + " # download_html = f\"\"\"\n", + " #
\n", + " # Download plot:
\n", + " # Download as PNG
\n", + " #
\n", + " # \"\"\"\n", + "\n", + " # display(HTML(iframe + download_html))\n", + "\n", + " html_str = fig.to_html(include_plotlyjs='cdn')\n", + " escaped_html = html.escape(html_str)\n", + "\n", + " iframe = f\"\"\"\n", + " \n", + " \"\"\"\n", + "\n", + " display(HTML(iframe))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "361423c6", + "metadata": {}, + "outputs": [], + "source": [ + "if compute_degs and (dge_method == '1' or dge_method == '3'):\n", + " j = 1\n", + " for i, pair in enumerate(deseq2_degs_1):\n", + " up, down = pair\n", + " get_bar_graph(up, deseq2_adj_time_pt_comparisons[i], num_tfs, f\"Enriched TFs at {deseq2_adj_time_pt_comparisons[i]}\")\n", + " display(Markdown(f\"##### *__Figure 2.1.{j}__: Ranks of enriched TFs for UP genes at {deseq2_adj_time_pt_comparisons[i]} (computed using DESeq2) in their respective ChEA3 libraries. Bar length is proportional to rank (a narrower bar means a better rank).*\"))\n", + " get_bar_graph(down, deseq2_adj_time_pt_comparisons[i], num_tfs, f\"Enriched TFs at {deseq2_adj_time_pt_comparisons[i]}\")\n", + " display(Markdown(f\"##### *__Figure 2.1.{j+1}__: Ranks of enriched TFs for DOWN genes at {deseq2_adj_time_pt_comparisons[i]} (computed using DESeq2) in their respective ChEA3 libraries. Bar length is proportional to rank (a narrower bar means a better rank).*\"))\n", + " j += 2" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3e9a0066", + "metadata": {}, + "outputs": [], + "source": [ + "if compute_degs and (dge_method == '1' or dge_method == '3'):\n", + " j = 1\n", + " for i, pair in enumerate(deseq2_degs_2):\n", + " up, down = pair\n", + " get_bar_graph(up, deseq2_time_pt_0_comparisons[i], num_tfs, f\"Enriched TFs at {deseq2_time_pt_0_comparisons[i]}\")\n", + " display(Markdown(f\"##### *__Figure 2.2.{j}__: Ranks of enriched TFs for UP genes at {deseq2_time_pt_0_comparisons[i]} (computed using DESeq2) in their respective ChEA3 libraries. Bar length is proportional to rank (a narrower bar means a better rank).*\"))\n", + " get_bar_graph(down, deseq2_time_pt_0_comparisons[i], num_tfs, f\"Enriched TFs at {deseq2_time_pt_0_comparisons[i]}\")\n", + " display(Markdown(f\"##### *__Figure 2.2.{j+1}__: Ranks of enriched TFs for DOWN genes at {deseq2_time_pt_0_comparisons[i]} (computed using DESeq2) in their respective ChEA3 libraries. Bar length is proportional to rank (a narrower bar means a better rank).*\"))\n", + " j += 2" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f4dd8c65", + "metadata": {}, + "outputs": [], + "source": [ + "if compute_degs and dge_method == '2':\n", + " fig_nums = ('2.1', '2.2')\n", + "\n", + "if compute_degs and dge_method == '3':\n", + " fig_nums = ('2.3', '2.4')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f9da4fad", + "metadata": {}, + "outputs": [], + "source": [ + "if compute_degs and (dge_method == '2' or dge_method == '3'):\n", + " j = 1\n", + " for i, pair in enumerate(cd_degs_1):\n", + " up, down = pair\n", + " get_bar_graph(up, cd_adj_time_pt_comparisons[i], num_tfs, f\"Enriched TFs at {cd_adj_time_pt_comparisons[i]}\")\n", + " display(Markdown(f\"##### *__Figure {fig_nums[0]}.{j}__: Ranks of enriched TFs for UP genes at {cd_adj_time_pt_comparisons[i]} (computed using CD) in their respective ChEA3 libraries. Bar length is proportional to rank (a narrower bar means a better rank).*\"))\n", + " get_bar_graph(down, cd_adj_time_pt_comparisons[i], num_tfs, f\"Enriched TFs at {cd_adj_time_pt_comparisons[i]}\")\n", + " display(Markdown(f\"##### *__Figure {fig_nums[0]}.{j+1}__: Ranks of enriched TFs for DOWN genes at {cd_adj_time_pt_comparisons[i]} (computed using CD) in their respective ChEA3 libraries. Bar length is proportional to rank (a narrower bar means a better rank).*\"))\n", + " j += 2" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "22ed63a6", + "metadata": {}, + "outputs": [], + "source": [ + "if compute_degs and (dge_method == '2' or dge_method == '3'):\n", + " j = 1\n", + " for i, pair in enumerate(cd_degs_2):\n", + " up, down = pair\n", + " get_bar_graph(up, cd_time_pt_0_comparisons[i], num_tfs, f\"Enriched TFs at {cd_time_pt_0_comparisons[i]}\")\n", + " display(Markdown(f\"##### *__Figure {fig_nums[1]}.{j}__: Ranks of enriched TFs for UP genes at {cd_time_pt_0_comparisons[i]} (computed using CD) in their respective ChEA3 libraries. Bar length is proportional to rank (a narrower bar means a better rank).*\"))\n", + " get_bar_graph(down, cd_time_pt_0_comparisons[i], num_tfs, f\"Enriched TFs at {cd_time_pt_0_comparisons[i]}\")\n", + " display(Markdown(f\"##### *__Figure {fig_nums[1]}.{j+1}__: Ranks of enriched TFs for DOWN genes at {cd_time_pt_0_comparisons[i]} (computed using CD) in their respective ChEA3 libraries. Bar length is proportional to rank (a narrower bar means a better rank).*\"))\n", + " j += 2" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2b485ae4", + "metadata": {}, + "outputs": [], + "source": [ + "if not compute_degs:\n", + " if ds3:\n", + " j = 1\n", + " for i, pair in enumerate(deseq2_degs_1):\n", + " up, down = pair\n", + " get_bar_graph(up, comparisons_1[i], num_tfs, f\"Enriched TFs at {comparisons_1[i]}\")\n", + " display(Markdown(f\"##### *__Figure 2.1.{j}__: Ranks of enriched TFs for UP genes at {comparisons_1[i]} in their respective ChEA3 libraries. Bar length is proportional to rank (a narrower bar means a better rank).*\"))\n", + " get_bar_graph(down, comparisons_1[i], num_tfs, f\"Enriched TFs at {comparisons_1[i]}\")\n", + " display(Markdown(f\"##### *__Figure 2.1.{j+1}__: Ranks of enriched TFs for DOWN genes at {comparisons_1[i]} in their respective ChEA3 libraries. Bar length is proportional to rank (a narrower bar means a better rank).*\"))\n", + " j += 2\n", + "\n", + " if ds4:\n", + " j = 1\n", + " for i, pair in enumerate(deseq2_degs_2):\n", + " up, down = pair\n", + " get_bar_graph(up, comparisons_2[i], num_tfs, f\"Enriched TFs at {comparisons_2[i]}\")\n", + " display(Markdown(f\"##### *__Figure 2.2.{j}__: Ranks of enriched TFs for UP genes at {comparisons_2[i]} in their respective ChEA3 libraries. Bar length is proportional to rank (a narrower bar means a better rank).*\"))\n", + " get_bar_graph(down, comparisons_2[i], num_tfs, f\"Enriched TFs at {comparisons_2[i]}\")\n", + " display(Markdown(f\"##### *__Figure 2.2.{j+1}__: Ranks of enriched TFs for DOWN genes at {comparisons_2[i]} in their respective ChEA3 libraries. Bar length is proportional to rank (a narrower bar means a better rank).*\"))\n", + " j += 2" + ] + }, + { + "cell_type": "markdown", + "id": "9c947143", + "metadata": {}, + "source": [ + "## Step 6. Generating a UMAP visualization of the enriched TFs\n", + "\n", + "The enriched transcription factors from each time point are colored on a UMAP plot of 700 TFs identified by ChEA-KG to be \"source TFs\" (i.e. they exert regulatory effects on other TFs). The UMAP algorithm was performed using the TF-IDF scores of the TFs' target genes, meaning that TFs are placed in the same cluster if they generally regulate similar genes. \n", + "\n", + "Hovering over each data point reveals the gene identity of the TF, the cluster the TF belongs to, and if the TF is enriched at that time point. \n", + "\n", + "Use the slider to navigate between time points or click on the corresponding GIF link." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "90965bc8", + "metadata": {}, + "outputs": [], + "source": [ + "def process_tf_data(libdict, nneighbors=30, mindist=0.1, spread=1.0, maxdf=1.0, mindf=1):\n", + " # print(\"\\tTF-IDF vectorizing gene set data...\")\n", + " vec = TfidfVectorizer(max_df=maxdf, min_df=mindf)\n", + " X = vec.fit_transform(libdict.values())\n", + " adata = anndata.AnnData(X)\n", + " adata.obs.index = libdict.keys()\n", + "\n", + " # print(\"\\tPerforming Leiden clustering...\")\n", + " sc.pp.neighbors(adata, n_neighbors=nneighbors) # added use_rep='X'\n", + " sc.tl.leiden(adata, resolution=1.0)\n", + " sc.tl.umap(adata, min_dist=mindist, spread=spread, random_state=42)\n", + "\n", + " new_order = adata.obs.sort_values(by='leiden').index.tolist()\n", + " adata = adata[new_order, :] # added .copy()\n", + " adata.obs['leiden'] = 'Cluster ' + adata.obs['leiden'].astype('object')\n", + "\n", + " df = pd.DataFrame(adata.obsm['X_umap'])\n", + " df.columns = ['x', 'y']\n", + "\n", + " df['cluster'] = adata.obs['leiden'].values\n", + " df['term'] = adata.obs.index\n", + " df['genes'] = [libdict[l] for l in df['term']]\n", + "\n", + " return df\n", + "\n", + "\n", + "def get_scatter_colors(df):\n", + " clusters = pd.unique(df['cluster']).tolist()\n", + " n_clusters = len(clusters)\n", + " gray_shades = [f'#{int(v):02x}{int(v):02x}{int(v):02x}' for v in np.linspace(50, 230, n_clusters)]\n", + " color_mapper = {clusters[i]: gray_shades[i] for i in range(n_clusters)}\n", + " return color_mapper\n", + "\n", + "\n", + "def generate_df_for_comparison(base_df, tf_pair, comparison_label):\n", + " \"\"\"\n", + " Generates a new df for each time point.\n", + " \"\"\"\n", + " up_tfs, down_tfs = tf_pair[0], tf_pair[1]\n", + " df = base_df.copy()\n", + " color_mapper = get_scatter_colors(df)\n", + " df['color'] = df['cluster'].apply(lambda x: color_mapper[x])\n", + " df['size'] = 6\n", + " df['time_point'] = \"Not enriched\"\n", + "\n", + " for idx, term in df['term'].items():\n", + " if (term in up_tfs) and (term not in down_tfs):\n", + " df.at[idx, 'color'] = \"#1595f0\"\n", + " df.at[idx, 'size'] = 12\n", + " df.at[idx, 'time_point'] = comparison_label\n", + " if (term in down_tfs) and (term not in up_tfs):\n", + " df.at[idx, 'color'] = \"#f30a1a\"\n", + " df.at[idx, 'size'] = 12\n", + " df.at[idx, 'time_point'] = comparison_label\n", + " if (term in up_tfs) and (term in down_tfs):\n", + " df.at[idx, 'color'] = \"#26e411\"\n", + " df.at[idx, 'size'] = 12\n", + " df.at[idx, 'time_point'] = comparison_label\n", + " return df\n", + "\n", + "\n", + "def generate_legend_descriptions(df, tf_time_dict, comparisons, user_desc):\n", + " descriptions = []\n", + " for i in range(len(comparisons)):\n", + " up_tfs, down_tfs = tf_time_dict[i]\n", + " up_only = sorted([tf for tf in df['term'].tolist() if (tf in up_tfs and tf not in down_tfs)])\n", + " down_only = sorted([tf for tf in df['term'].tolist() if (tf not in up_tfs and tf in down_tfs)])\n", + " both = sorted([tf for tf in df['term'].tolist() if (tf in up_tfs and tf in down_tfs)])\n", + "\n", + " parts = []\n", + " if up_only:\n", + " parts.append(\"Enriched transcription factors for up genes: \" + \", \".join(up_only))\n", + " if down_only:\n", + " parts.append(\"Enriched transcription factors for down genes: \" + \", \".join(down_only))\n", + " if both:\n", + " parts.append(\"Enriched transcription factors for up AND down genes: \" + \", \".join(both))\n", + "\n", + " description = str(comparisons[i] + \"\\n\")\n", + " description += \"\\n\".join(parts)\n", + " description += \"\\n\\n\" + user_desc.strip()\n", + " descriptions.append(description)\n", + " return descriptions\n", + "\n", + "\n", + "def get_scatterplot(scatterdf, tf_time_dict=None, comparisons=None, image_dir=None, gif_filename=None):\n", + " \"\"\"\n", + " Generates images navigable via a slider, as well as all the images separately.\n", + " \"\"\"\n", + " df = scatterdf.copy()\n", + " df['cluster_number'] = df['cluster'].apply(lambda x: int(x.split(\" \")[-1]))\n", + " df.sort_values(by=['cluster_number'], inplace=True)\n", + " df.drop(columns = ['cluster_number'], inplace=True)\n", + "\n", + " sources = []\n", + " for i, label in enumerate(comparisons):\n", + " df_comp = generate_df_for_comparison(df, tf_time_dict[i], label)\n", + " source = ColumnDataSource(data=dict(x = df_comp['x'], y = df_comp['y'],\n", + " gene_set = df_comp['term'], colors = df_comp['color'],\n", + " label = df_comp['cluster'], size = df_comp['size'],\n", + " time_point = df_comp['time_point']))\n", + " sources.append(source)\n", + "\n", + " # source = sources[0]\n", + " source = ColumnDataSource(data=deepcopy(sources[0].data))\n", + " tooltips = [\n", + " (\"Gene Set\", \"@gene_set\"),\n", + " (\"Cluster\", \"@label\"),\n", + " (\"Time point\", \"@time_point\")\n", + " ]\n", + "\n", + " hover_emb = HoverTool(tooltips=tooltips)\n", + " tools_emb = [hover_emb, 'pan', 'wheel_zoom', 'reset', 'save']\n", + "\n", + " plot_emb = figure(\n", + " width=500*2,\n", + " height=400*2,\n", + " tools=tools_emb,\n", + " output_backend='canvas'\n", + " )\n", + "\n", + " plot_emb.scatter(\n", + " 'x',\n", + " 'y',\n", + " size = 'size',\n", + " source = source,\n", + " marker = 'circle',\n", + " fill_color = 'colors',\n", + " color = 'colors'\n", + " )\n", + "\n", + " color_mapper = get_scatter_colors(df)\n", + " for cluster, gray_color in color_mapper.items():\n", + " dummy_source = ColumnDataSource(data=dict(x=[None], y=[None]))\n", + " plot_emb.scatter(\n", + " 'x',\n", + " 'y',\n", + " source=dummy_source,\n", + " fill_color=gray_color,\n", + " color=gray_color,\n", + " marker='circle',\n", + " size=10,\n", + " legend_label=cluster\n", + " )\n", + "\n", + " # hide axis labels and grid lines\n", + " # plot_title = Title(text=comparisons[0], align='center')\n", + " # plot_title.text_font_size = '20pt'\n", + " # plot_title.text_font_style = 'bold'\n", + " # plot_emb.add_layout(plot_title, 'above')\n", + "\n", + " plot_emb.xaxis.major_tick_line_color = None\n", + " plot_emb.xaxis.minor_tick_line_color = None\n", + " plot_emb.yaxis.major_tick_line_color = None\n", + " plot_emb.yaxis.minor_tick_line_color = None\n", + " plot_emb.grid.grid_line_color = None\n", + " plot_emb.xaxis.major_label_text_font_size = '0pt'\n", + " plot_emb.yaxis.major_label_text_font_size = '0pt'\n", + "\n", + " plot_emb.xaxis.axis_label = \"UMAP-1\"\n", + " plot_emb.yaxis.axis_label = \"UMAP-2\"\n", + " plot_emb.xaxis.axis_label_text_font_size = '20pt'\n", + " plot_emb.yaxis.axis_label_text_font_size = '20pt'\n", + " plot_emb.xaxis.axis_label_text_font_style = \"normal\"\n", + " plot_emb.yaxis.axis_label_text_font_style = \"normal\"\n", + "\n", + " plot_emb.legend.label_text_font_size = '18pt'\n", + " plot_emb.legend.glyph_height = 20\n", + " plot_emb.legend.glyph_width = 20\n", + "\n", + " plot_emb.add_layout(plot_emb.legend[0], 'right')\n", + "\n", + " plot_emb.min_border_bottom = 168\n", + "\n", + " legend_descriptions = generate_legend_descriptions(df, tf_time_dict, comparisons, umap_desc)\n", + " description_source = ColumnDataSource(data=dict(descriptions=legend_descriptions))\n", + " description_label = Label(x=0, y=-7, x_units='screen', y_units='screen',\n", + " text=legend_descriptions[0],\n", + " text_font_size='10pt', text_align='left', name='dynamic_description')\n", + " plot_emb.add_layout(description_label, 'below')\n", + "\n", + " ### adding a slider ###\n", + " slider = Slider(start=0, end=len(sources) - 1, value=0, step=1, title=\"Comparison\")\n", + " comparison_source = ColumnDataSource(data=dict(comparisons=[str(c) for c in comparisons]))\n", + " callback = CustomJS(args=dict(source=source, slider=slider, sources=sources, plot=plot_emb,\n", + " comparison_source=comparison_source, description_source=description_source,\n", + " description_label=description_label), code=\"\"\"\n", + " const i = slider.value;\n", + " const new_data = sources[i].data;\n", + " const copied_data = {};\n", + " for (const key in new_data) {\n", + " copied_data[key] = [...new_data[key]];\n", + " }\n", + " source.data = copied_data;\n", + "\n", + " // Update legend description\n", + " const descriptions = description_source.data['descriptions'];\n", + " description_label.text = descriptions[i];\n", + "\n", + " source.change.emit();\n", + " \"\"\")\n", + " slider.js_on_change('value', callback)\n", + " show(column(slider, plot_emb))\n", + "\n", + " ### can either show or save the plot (cannot do both)\n", + " # output_file(\"top_10_tfs_deseq2_adjacent_time_pts_umap_plot.html\")\n", + " # save(column(slider, plot_emb))\n", + "\n", + " ### for isolated individual time point images ###\n", + " frame_dir = os.path.join(os.getcwd(), image_dir)\n", + " os.makedirs(frame_dir, exist_ok=True)\n", + " for i, label in enumerate(comparisons):\n", + " source.data = dict(sources[i].data)\n", + " description_label.text = legend_descriptions[i]\n", + " # plot_title.text = label\n", + " export_png(plot_emb, filename=os.path.join(frame_dir, f\"frame_{i:02d}_{label}.png\"))\n", + "\n", + " frame_paths = sorted([os.path.join(frame_dir, f) for f in os.listdir(frame_dir) if f.endswith(\".png\")])\n", + " images = [Image.open(frame) for frame in frame_paths]\n", + " images[0].save(gif_filename, save_all=True, append_images=images[1:], duration=1500, loop=0)\n", + " display(FileLink(gif_filename, result_html_prefix=\"Click here to download: \"))\n", + " print(\"GIF of UMAP plot was successfully created.\")\n", + "\n", + " return plot_emb, source" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "04ed8470", + "metadata": {}, + "outputs": [], + "source": [ + "r = requests.get(\"https://minio.dev.maayanlab.cloud/hgrn-chear/network_target_sets.gmt\")\n", + "file = r.text.split(\"\\n\")\n", + "\n", + "lib_dict = OrderedDict()\n", + "for line in file[:-1]:\n", + " tokens = line.split(\"\\t\\t\")\n", + " term = tokens[0]\n", + " genes = [x.split(',')[0].strip() for x in tokens[1].split('\\t')]\n", + " lib_dict[term] = ' '.join(genes)\n", + "\n", + "## defaults: nneighbors=30, mindist=0.1, spread=1.0, maxdf=1.0, mindf=1\n", + "scatter_df = process_tf_data(\n", + " lib_dict,\n", + " nneighbors=20,\n", + " mindist=0.15,\n", + ")\n", + "\n", + "legend_description = (\"Blue dots are TFs enriched for upregulated DEGs.\\n\"\n", + " \"Red dots are TFs enriched for downregulated DEGs.\\n\"\n", + " \"Green dots are TFs enriched for both up- and downregulated DEGs.\\n\")\n", + "legend_description += umap_desc\n", + "\n", + "if compute_degs and (dge_method == '1' or dge_method == '3'):\n", + " deseq2_plot_emb_1, deseq2_source_1 = get_scatterplot(scatter_df, deseq2_tf_time_dict_1, deseq2_adj_time_pt_comparisons, \"umap_png_frames_deseq2_adjacent_time_pts\", f\"top_{num_tfs}_tfs_deseq2_adjacent_time_pts_umap.gif\")\n", + " display(Markdown(f\"##### *__Figure 3.1__: UMAP of the enriched TFs determined from comparing gene expression at adjacent time points (DEGs computed using PyDESeq2). The top {num_tfs} TFs for the up- and downregulated DEGs are shown in blue and red, respectively, on the UMAP plot. Green TFs (if any) are enriched in both the up and down gene sets.*\"))\n", + " deseq2_plot_emb_2, deseq2_source_2 = get_scatterplot(scatter_df, deseq2_tf_time_dict_2, deseq2_time_pt_0_comparisons, \"umap_png_frames_deseq2_compare_w_time_pt_0\", f\"top_{num_tfs}_tfs_deseq2_compare_w_time_pt_0_umap.gif\")\n", + " display(Markdown(f\"##### *__Figure 3.2__: UMAP of the enriched TFs determined from comparing gene expression at each time point to time point 0 (DEGs computed using PyDESeq2). The top {num_tfs} TFs for the up- and downregulated DEGs are shown in blue and red, respectively, on the UMAP plot. Green TFs (if any) are enriched in both the up and down gene sets.*\"))\n", + "\n", + "if compute_degs and dge_method == '2':\n", + " fig_nums = ('3.1', '3.2')\n", + "\n", + "if compute_degs and dge_method == '3':\n", + " fig_nums = ('3.3', '3.4')\n", + "\n", + "if compute_degs and (dge_method == '2' or dge_method == '3'):\n", + " cd_plot_emb_1, cd_source_1 = get_scatterplot(scatter_df, cd_tf_time_dict_1, cd_adj_time_pt_comparisons, \"umap_png_frames_cd_adjacent_time_pts\", f\"top_{num_tfs}_tfs_cd_adjacent_time_pts_umap.gif\")\n", + " display(Markdown(f\"##### *__Figure {fig_nums[0]}__: UMAP of the enriched TFs determined from comparing gene expression at adjacent time points (DEGs computed using CD). The top {num_tfs} TFs for the up- and downregulated DEGs are shown in blue and red, respectively, on the UMAP plot. Green TFs (if any) are enriched in both the up and down gene sets.*\"))\n", + " cd_plot_emb_2, cd_source_2 = get_scatterplot(scatter_df, cd_tf_time_dict_2, cd_time_pt_0_comparisons, \"umap_png_frames_cd_compare_w_time_pt_0\", f\"top_{num_tfs}_tfs_cd_compare_w_time_pt_0_umap.gif\")\n", + " display(Markdown(f\"##### *__Figure {fig_nums[1]}__: UMAP of the enriched TFs determined from comparing gene expression at each time point to time point 0 (DEGs computed using CD). The top {num_tfs} TFs for the up- and downregulated DEGs are shown in blue and red, respectively, on the UMAP plot. Green TFs (if any) are enriched in both the up and down gene sets.*\"))\n", + "\n", + "if not compute_degs:\n", + " if ds3:\n", + " plot_emb_1, source_1 = get_scatterplot(scatter_df, tf_time_dict_1, comparisons_1, \"umap_png_frames_deseq2_adjacent_time_pts\", f\"top_{num_tfs}_tfs_deseq2_adjacent_time_pts_umap.gif\")\n", + " display(Markdown(f\"##### *__Figure 3.1__: UMAP of the enriched TFs determined from comparing gene expression at adjacent time points. The top {num_tfs} TFs for the up- and downregulated DEGs are shown in blue and red, respectively, on the UMAP plot. Green TFs (if any) are enriched in both the up and down gene sets.*\"))\n", + "\n", + " if ds4:\n", + " plot_emb_2, source_2 = get_scatterplot(scatter_df, tf_time_dict_2, comparisons_2, \"umap_png_frames_deseq2_compare_w_time_pt_0\", f\"top_{num_tfs}_tfs_deseq2_compare_w_time_pt_0_umap.gif\")\n", + " display(Markdown(f\"##### *__Figure 3.2__: UMAP ofthe enriched TFs determined from comparing gene expression at each time point to time point 0. The top {num_tfs} TFs for the up- and downregulated DEGs are shown in blue and red, respectively, on the UMAP plot. Green TFs (if any) are enriched in both the up and down gene sets.*\"))" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "appyter_310", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.18" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/appyters/chea_kg_time_series_appyter/requirements.txt b/appyters/chea_kg_time_series_appyter/requirements.txt new file mode 100644 index 00000000..4cd047c8 --- /dev/null +++ b/appyters/chea_kg_time_series_appyter/requirements.txt @@ -0,0 +1,17 @@ +# python dependencies should be collected and kept in this file +# one line for each dependency. this file can be used to install +# dependencies with `pip install -r requirements.txt` +appyter +numpy +pandas +ipython +requests +dash +dash_cytoscape +plotly +scikit-learn +scanpy +anndata +bokeh +Pillow +maayanlab-bioinformatics diff --git a/appyters/chea_kg_time_series_appyter/static/chea_kg_ts_appyter.png b/appyters/chea_kg_time_series_appyter/static/chea_kg_ts_appyter.png new file mode 100644 index 0000000000000000000000000000000000000000..f6dcbcc583ecf3c61b378b242f8287ad80872a8c GIT binary patch literal 123363 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 Date: Fri, 8 Aug 2025 16:39:18 -0400 Subject: [PATCH 2/2] Added folder for the most recent code of the chea_kg_ts Appyter --- .../static/chea_kg_ts_appyter.png | Bin 123363 -> 0 bytes .../README.md | 6 +- .../appyter.json | 8 +- .../chea_kg_ts_appyter.ipynb | 82 ++++++++++++------ .../requirements.txt | 10 ++- 5 files changed, 71 insertions(+), 35 deletions(-) delete mode 100644 appyters/chea_kg_time_series_appyter/static/chea_kg_ts_appyter.png rename appyters/{chea_kg_time_series_appyter => chea_kg_ts}/README.md (87%) rename appyters/{chea_kg_time_series_appyter => chea_kg_ts}/appyter.json (83%) rename appyters/{chea_kg_time_series_appyter => chea_kg_ts}/chea_kg_ts_appyter.ipynb (96%) rename appyters/{chea_kg_time_series_appyter => chea_kg_ts}/requirements.txt (64%) diff --git a/appyters/chea_kg_time_series_appyter/static/chea_kg_ts_appyter.png b/appyters/chea_kg_time_series_appyter/static/chea_kg_ts_appyter.png deleted file mode 100644 index f6dcbcc583ecf3c61b378b242f8287ad80872a8c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 123363 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" - ] - }, { "cell_type": "markdown", "id": "0c671de6", "metadata": {}, "source": [ - "# ChEA-KG-TS: Temporal Transitions of Transcription Factor Regulatory Modules\n", + "# ChEA-KG-TS Appyter Report: Temporal Transitions of Transcription Factor Regulatory Modules\n", "\n", "Given time series RNA-seq data from either humans or mice, this Appyter first determines which transcription factors are enriched for the differentially expressed genes (DEGs) found at each time point. DEGs are computed using [DESeq2](https://genomebiology.biomedcentral.com/articles/10.1186/s13059-014-0550-8) (Love et al., 2014) or [Characteristic Direction](https://bmcbioinformatics.biomedcentral.com/articles/10.1186/1471-2105-15-79) (Clark et al., 2014) by comparing gene expression at adjacent time points (*t0 vs t1, t1 vs t2, t2 vs t3, ... , tn-1 vs tn*) or comparing to the initial time point (*t0 vs t1, t0 vs t2, t0 vs t3, ... , t0 vs tn*). Thus, there are 4 different options for computing DEGs. Next, the enriched transcription factors for each set of DEGs are determined using [ChEA3](https://maayanlab.cloud/chea3/) (Keenan et al., 2019). \n", "\n", - "Afterwards, the Appyter plots a [ChEA-KG](https://chea-kg.maayanlab.cloud/) (project led by Anna Byrd) regulatory subnetwork of the enriched TFs at each time point, enabling users to determine how the enriched TFs at one time point regulate the TFs at the subsequent time point. A UMAP plot of the enriched TFs is also generated, providing users with visualization of enriched TFs that act in modules based on their shared target genes. \n", + "Afterwards, the Appyter plots a regulatory subnetwork using [ChEA-KG](https://chea-kg.maayanlab.cloud/) (project led by Anna Byrd) of the enriched TFs at each time point, enabling users to determine how the enriched TFs at one time point regulate the TFs at the subsequent time point. A UMAP plot of the enriched TFs is also generated, providing users with visualization of enriched TFs that act in modules based on their shared target genes. \n", "\n", "If users have pre-computed the up- and downregulated DEGs at each time point, they can opt to upload a GMT file of those DEGs to *directly* visualize the enriched TFs. " ] @@ -164,17 +168,20 @@ "\n", "{% do SectionField(\n", " name= 'section0',\n", - " title= 'Upload files to this section ONLY if you are uploading raw time series RNA-seq data.'\n", + " title= 'Upload files to this section ONLY if you are uploading raw time series RNA-seq data.',\n", + " img= 'matrix.png'\n", ") %}\n", "\n", "{% do SectionField(\n", " name= 'section1',\n", - " title= '1. Upload raw gene counts matrix.'\n", + " title= '1. Upload raw gene counts matrix as a CSV file.',\n", + " img= 'mRNA.png'\n", ") %}\n", "\n", "{% do SectionField(\n", " name= 'section2',\n", - " title= '2. Upload experiment metadata.'\n", + " title= '2. Upload experiment metadata as a CSV file.',\n", + " img= 'experiment.png'\n", ") %}\n", "\n", "{% do SectionField(\n", @@ -202,19 +209,25 @@ "source": [ "%%appyter code_eval\n", "\n", + "{% do DescriptionField(\n", + " name= 'matrix_description',\n", + " text= 'Ensure that the first column is titled \"gene_name\" or \"gene_id\" and contains the gene names. The example file has {id}_{name}, which is also an acceptable notation.',\n", + " section= 'section1'\n", + ") %}\n", + "\n", "{% set dataset1 = FileField(\n", " name= 'dataset1',\n", " label= 'Raw gene counts matrix',\n", " default= '',\n", - " examples= {'Raw gene counts from TRAIL-treated TNBC cell line': 'https://drive.google.com/uc?export=download&id=1WFtUIXO2b3rbiStJ7Hf8Bx7NrfheEM9L'},\n", + " examples= {'Raw gene counts from TRAIL-treated TNBC cell line': 'https://minio.dev.maayanlab.cloud/chea-kg-timeseries/GSE271120_RawCountFile_rsemgenes.CCBR1062.csv'},\n", " section= 'section1'\n", ") %}\n", "\n", "ds1 = {{dataset1}}\n", "\n", "{% do DescriptionField(\n", - " name= 'description',\n", - " text= 'Ensure that the columns are labeled exactly as \"sample_name\" and \"time_pt_annotation\". See example for how to format experiment metadata file.',\n", + " name= 'metadata_description',\n", + " text= 'Ensure that the columns are labeled exactly as \"sample_name\" and \"time_pt_annotation\". See example for how to format the experiment metadata file.',\n", " section= 'section2'\n", ") %}\n", "\n", @@ -222,7 +235,7 @@ " name= 'dataset2',\n", " label= 'Experiment metadata',\n", " default= '',\n", - " examples= {'Samples taken from TRAIL-treated TNBC cell line': 'https://drive.google.com/uc?export=download&id=1iyGR_LC2MPHQ0LyobzMFULbGIYFSYH2Y'},\n", + " examples= {'Samples taken from TRAIL-treated TNBC cell line': 'https://minio.dev.maayanlab.cloud/chea-kg-timeseries/sample_metadata.csv'},\n", " section= 'section2'\n", ") %}\n", "\n", @@ -299,9 +312,14 @@ " time_pt_dict = {}\n", " for i, time_pt in enumerate(time_pt_list):\n", " samples_at_time_pt = sample_metadata.loc[sample_metadata[\"time_pt_annotation\"] == time_pt, \"sample_name\"].astype(str).tolist()\n", - " subset_counts = raw_counts[[\"gene_id\"] + samples_at_time_pt]\n", - " rev_subset_counts = subset_counts.set_index(\"gene_id\")\n", - " time_pt_dict[i] = (time_pt, rev_subset_counts)" + " if raw_counts.columns[0] == \"gene_id\":\n", + " subset_counts = raw_counts[[\"gene_id\"] + samples_at_time_pt]\n", + " rev_subset_counts = subset_counts.set_index(\"gene_id\")\n", + " time_pt_dict[i] = (time_pt, rev_subset_counts)\n", + " elif raw_counts.columns[0] == \"gene_name\":\n", + " subset_counts = raw_counts[[\"gene_name\"] + samples_at_time_pt]\n", + " rev_subset_counts = subset_counts.set_index(\"gene_name\")\n", + " time_pt_dict[i] = (time_pt, rev_subset_counts)" ] }, { @@ -862,7 +880,8 @@ "\n", "{% do SectionField(\n", " name= 'gmt_section_header',\n", - " title= 'Upload files to this section ONLY if you pre-computed up and down DEGs and saved them in a GMT file.'\n", + " title= 'Upload files to this section ONLY if you pre-computed up and down DEGs and saved them in a GMT file.',\n", + " img= 'gene.png'\n", ")%}\n", "\n", "{% do SectionField(\n", @@ -900,7 +919,7 @@ " name= 'dataset3',\n", " label= 'GMT file containing DEGs from ADJACENT TIME POINT COMPARISONS',\n", " default= '',\n", - " examples= {'First set of DEGs from TRAIL-treated TNBC cell line': 'https://drive.google.com/uc?export=download&id=1Ut7M5GErrTcZD_MDgkA4PD2qCl8Bn4Yj'},\n", + " examples= {'First set of DEGs from TRAIL-treated TNBC cell line': 'https://minio.dev.maayanlab.cloud/chea-kg-timeseries/deseq2_adj_time_pts_degs.gmt'},\n", " section= 'gmt_data'\n", ") %}\n", "\n", @@ -910,7 +929,7 @@ " name= 'dataset4',\n", " label= 'GMT file containing DEGs from COMPARISONS WITH TIME POINT 0',\n", " default= '',\n", - " examples= {'Second set of DEGS from TRAIL-treated TNBC cell line': 'https://drive.google.com/uc?export=download&id=1UNHrktxI5asnvVniUZgnZphFR8qw4VIo'},\n", + " examples= {'Second set of DEGS from TRAIL-treated TNBC cell line': 'https://minio.dev.maayanlab.cloud/chea-kg-timeseries/deseq2_compare_w_time_pt_0_degs.gmt'},\n", " section= 'gmt_data'\n", ") %}\n", "\n", @@ -990,9 +1009,13 @@ "outputs": [], "source": [ "def export_cytoscape_json(data, filename):\n", - " with open(filename, \"w\") as f:\n", + " output_dir = os.environ.get(\"APP_STATIC\", \"/app/static\")\n", + " os.makedirs(output_dir, exist_ok=True)\n", + " json_output_path = os.path.join(output_dir, filename)\n", + "\n", + " with open(json_output_path, \"w\") as f:\n", " json.dump(data, f, indent=2)\n", - " display(FileLink(filename))\n", + " display(FileLink(json_output_path))\n", "\n", "\n", "def visualize_network_2(data, filename):\n", @@ -1902,8 +1925,13 @@ "\n", " frame_paths = sorted([os.path.join(frame_dir, f) for f in os.listdir(frame_dir) if f.endswith(\".png\")])\n", " images = [Image.open(frame) for frame in frame_paths]\n", - " images[0].save(gif_filename, save_all=True, append_images=images[1:], duration=1500, loop=0)\n", - " display(FileLink(gif_filename, result_html_prefix=\"Click here to download: \"))\n", + "\n", + " output_dir = os.environ.get(\"APP_STATIC\", \"/app/static\")\n", + " os.makedirs(output_dir, exist_ok=True)\n", + " new_gif_filename = os.path.join(output_dir, gif_filename)\n", + "\n", + " images[0].save(new_gif_filename, save_all=True, append_images=images[1:], duration=1500, loop=0)\n", + " display(FileLink(new_gif_filename, result_html_prefix=\"Click here to download: \"))\n", " print(\"GIF of UMAP plot was successfully created.\")\n", "\n", " return plot_emb, source" diff --git a/appyters/chea_kg_time_series_appyter/requirements.txt b/appyters/chea_kg_ts/requirements.txt similarity index 64% rename from appyters/chea_kg_time_series_appyter/requirements.txt rename to appyters/chea_kg_ts/requirements.txt index 4cd047c8..d756bfcd 100644 --- a/appyters/chea_kg_time_series_appyter/requirements.txt +++ b/appyters/chea_kg_ts/requirements.txt @@ -2,16 +2,24 @@ # one line for each dependency. this file can be used to install # dependencies with `pip install -r requirements.txt` appyter +python-dotenv +flask +gunicorn numpy pandas ipython requests +ipycytoscape dash dash_cytoscape plotly scikit-learn +igraph +leidenalg scanpy anndata bokeh +selenium Pillow -maayanlab-bioinformatics +maayanlab-bioinformatics @ git+https://github.com/Maayanlab/maayanlab-bioinformatics +pydeseq2