-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathapp.py
More file actions
235 lines (184 loc) · 8.34 KB
/
Copy pathapp.py
File metadata and controls
235 lines (184 loc) · 8.34 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
from pathlib import Path
import streamlit as st
import pandas as pd
import numpy as np
from plots import (
plot_graph,
plot_molecular_similarity_heatmap,
plot_proteomics_barplots,
plot_genomics_barplots,
radar_plot,
)
# Constants
D_NAME = "DRUG_NAME"
G_DRIVER = "Driver_Gene"
G_NAME = "GENE"
D_ACT = "ACT_VALUE"
# Set page title and layout
st.set_page_config(page_title="Drug-Gene Interaction Explorer", layout="wide")
st.title("Drug-Gene Interaction Explorer")
# Load data
@st.cache_data
def load_data():
PROCESSED_DATA_PATH = Path("data/DrugCentral/processed_data/")
df_cancer_gene = pd.read_csv(PROCESSED_DATA_PATH / "gene.id.csv")
df_gene_drug = pd.read_table(
PROCESSED_DATA_PATH / "drug.target.interaction.fda.cosmic.cancer.type.tsv"
)
df_genomics = pd.read_csv(
"data/LINCS/processed_data/lincs.drugcentral.csv"
)
df_proteomics = pd.read_csv(
"data/DeepCoverageMOA/processed_data/deepcoveragemoa.lincs.csv"
)
# Load SMILES data for molecular similarity
df_drug_to_smiles = pd.read_table(
"data/DrugCentral/raw_data/structures.smiles.tsv"
)[["INN", "SMILES"]]
drug_name_to_smiles = {t.INN: t.SMILES for t in df_drug_to_smiles.itertuples()}
return df_cancer_gene, df_gene_drug, df_genomics, df_proteomics, drug_name_to_smiles
# Load the data with caching
df_cancer_gene, df_gene_drug, df_genomics, df_proteomics, drug_name_to_smiles = load_data()
# Filter the gene-drug data to include only Kd and IC50 activity types
df_gene_drug = df_gene_drug.query("ACT_TYPE in ['Kd', 'IC50']")
# Sidebar for cancer selection
st.sidebar.header("Data Selection")
cancers_options = df_cancer_gene["CANCER"].unique()
cancer = st.sidebar.selectbox("Select cancer type:", cancers_options)
# Filter genes associated with the selected cancer
genes_in_cancer = df_cancer_gene.query(f"CANCER=='{cancer}'")["GENE"]
df_gene_drug_filtered = df_gene_drug.query("GENE in @genes_in_cancer")
# Show data overview
st.header(f"Cancer Type: {cancer}")
st.write(f"Number of genes associated with {cancer}: {genes_in_cancer.nunique()}")
# Display dataframe with custom styling
with st.expander("View Gene-Drug Interaction Data"):
st.dataframe(
df_gene_drug_filtered.style.highlight_max(axis=0, subset=[D_ACT]),
use_container_width=True,
)
# Visualizations
st.header("Visualizations")
# Create tabs for different visualizations
tab1, tab2 = st.tabs(["Drug Activity Radar", "Drug-Gene Network"])
with tab1:
st.subheader("Drug Activity Radar Plot")
st.write("This plot shows drug activity values grouped by activity type.")
fig_radar = radar_plot(df_gene_drug_filtered)
st.pyplot(fig_radar)
with tab2:
st.subheader("Drug-Gene Network")
st.write("This network visualization shows relationships between drugs and genes.")
fig_network = plot_graph(df_gene_drug_filtered)
st.pyplot(fig_network)
# Drug selection for similarity analysis
st.header("Drug Similarity Analysis")
# Filter to drugs that have genomics data available
drugs_with_genomics = set(df_genomics["DRUG_NAME_1"].unique()) & set(
df_gene_drug_filtered[D_NAME].unique()
)
# Display number of drugs with genomics data
st.write(f"Number of drugs with genomics data: {len(drugs_with_genomics)}")
# Filter to drugs that have proteomics data available
drugs_with_proteomics = set(df_proteomics["DRUG_NAME_1"].unique()) & set(
df_gene_drug_filtered[D_NAME].unique()
)
# Display number of drugs with proteomics data
st.write(f"Number of drugs with proteomics data: {len(drugs_with_proteomics)}")
# Filter to drugs that have genomics and proteomics data available
drugs_with_genomics_proteomics = set(list(drugs_with_genomics) + list(drugs_with_proteomics))
# Create a multi-select widget to select drugs with genomics data
selected_genomics_drugs = st.multiselect(
"Select drugs to analyze genomic profile similarities:", sorted(drugs_with_genomics)
)
# If drugs are selected, show genomics and structural similarities
if selected_genomics_drugs:
st.subheader("Genomics Similarity")
st.write("These plots show the most similar drugs based on genomic profiles.")
# Get Genomics similarity data and plots
genomics_figs, similar_genomics_drugs = plot_genomics_barplots(df_genomics, selected_genomics_drugs)
# Display genomics similarity plots
for genomic_fig in genomics_figs:
# st.pyplot(genomic_fig)
st.plotly_chart(genomic_fig, use_container_width=True)
# Display structural similarity if drugs have SMILES data
st.subheader("Molecular Structure Similarity")
st.write(
"This heatmap shows Tanimoto similarity between drug molecular structures."
)
# Check if the selected drugs have SMILES data
drugs_with_smiles = [d for d in selected_genomics_drugs if d in drug_name_to_smiles]
similar_drugs_with_smiles = [d for d in similar_genomics_drugs if d in drug_name_to_smiles]
if drugs_with_smiles and similar_drugs_with_smiles:
fig = plot_molecular_similarity_heatmap(
drugs_with_smiles, similar_drugs_with_smiles, drug_name_to_smiles
)
st.pyplot(fig)
else:
st.warning("No molecular structure data available for the selected drugs.")
# Display raw similarity data in expander
with st.expander("View similarity data"):
# Create a dataframe of all pairwise similarities
similarity_data = []
for drug in selected_genomics_drugs:
# Get similar drugs for this drug
drug_data = df_genomics[df_genomics["DRUG_NAME_1"] == drug]
if not drug_data.empty:
# Sort by similarity score
drug_data = drug_data.sort_values(
by="LINCS Pearson (r)", ascending=False
)
# Add to our collection
similarity_data.append(drug_data)
if similarity_data:
combined_data = pd.concat(similarity_data)
st.dataframe(combined_data, use_container_width=True)
else:
st.write("No similarity data available for the selected drugs.")
# Create a multi-select widget to select drugs with proteomics data
selected_proteomics_drugs = st.multiselect(
"Select drugs to analyze proteomic profile similarities:", sorted(drugs_with_proteomics)
)
# If drugs are selected, show proteomics and structural similarities
if selected_proteomics_drugs:
st.subheader("Proteomics Similarity")
st.write("These plots show the most similar drugs based on proteomics profiles.")
# Get proteomics similarity data and plots
proteomics_figs, similar_proteomics_drugs = plot_proteomics_barplots(df_proteomics, selected_proteomics_drugs)
# Display proteomics similarity plots
for pro_fig in proteomics_figs:
st.pyplot(pro_fig)
# Display structural similarity if drugs have SMILES data
st.subheader("Molecular Structure Similarity")
st.write(
"This heatmap shows Tanimoto similarity between drug molecular structures."
)
# Check if the selected drugs have SMILES data
drugs_with_smiles = [d for d in selected_proteomics_drugs if d in drug_name_to_smiles]
similar_drugs_with_smiles = [d for d in similar_proteomics_drugs if d in drug_name_to_smiles]
if drugs_with_smiles and similar_drugs_with_smiles:
fig = plot_molecular_similarity_heatmap(
drugs_with_smiles, similar_drugs_with_smiles, drug_name_to_smiles
)
st.pyplot(fig)
else:
st.warning("No molecular structure data available for the selected drugs.")
# Display raw similarity data in expander
with st.expander("View similarity data"):
# Create a dataframe of all pairwise similarities
similarity_data = []
for drug in selected_proteomics_drugs:
# Get similar drugs for this drug
drug_data = df_proteomics[df_proteomics["DRUG_NAME_1"] == drug]
if not drug_data.empty:
# Sort by similarity score
drug_data = drug_data.sort_values(
by="DCMOA Pearson (r)", ascending=False
)
# Add to our collection
similarity_data.append(drug_data)
if similarity_data:
combined_data = pd.concat(similarity_data)
st.dataframe(combined_data, use_container_width=True)
else:
st.write("No similarity data available for the selected drugs.")