Spaces:
Runtime error
Runtime error
Update app.py
Browse files
app.py
CHANGED
|
@@ -2,6 +2,7 @@ import os
|
|
| 2 |
import urllib.request
|
| 3 |
import tarfile
|
| 4 |
import shutil
|
|
|
|
| 5 |
from flask import Flask, render_template, request, jsonify, url_for
|
| 6 |
from werkzeug.utils import secure_filename
|
| 7 |
|
|
@@ -20,7 +21,8 @@ import scAnalysis.differential as diff
|
|
| 20 |
import scAnalysis.enrichment as enrich
|
| 21 |
import scAnalysis.visualization as vis
|
| 22 |
import scAnalysis.interactive_viz as iviz
|
| 23 |
-
import scAnalysis.imputation as imp
|
|
|
|
| 24 |
|
| 25 |
app = Flask(__name__)
|
| 26 |
app.config['UPLOAD_FOLDER'] = './static/uploads'
|
|
@@ -106,12 +108,19 @@ def run_pipeline():
|
|
| 106 |
elif norm_method == 'sctransform':
|
| 107 |
pp.normalize_sctransform(data)
|
| 108 |
|
| 109 |
-
# <--
|
| 110 |
if request.form.get('run_imputation') == 'true':
|
| 111 |
-
|
| 112 |
-
imp_thresh = float(request.form.get('imp_thresh', 0.72))
|
| 113 |
imp_pcs = int(request.form.get('imp_pcs', 30))
|
| 114 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 115 |
|
| 116 |
organism = request.form.get('organism', 'human')
|
| 117 |
cc.score_cell_cycle(data, organism=organism)
|
|
@@ -134,6 +143,7 @@ def run_pipeline():
|
|
| 134 |
dim.run_pca(data, n_components=n_pcs)
|
| 135 |
dim.neighbors(data, n_neighbors=n_neighbors, n_pcs=min(40, n_pcs))
|
| 136 |
|
|
|
|
| 137 |
batch_key = request.form.get('batch_key', '')
|
| 138 |
if request.form.get('run_batch') == 'true' and batch_key in data.obs.columns:
|
| 139 |
b_algo = request.form.get('batch_algo', 'harmony')
|
|
@@ -142,11 +152,24 @@ def run_pipeline():
|
|
| 142 |
elif b_algo == 'combat':
|
| 143 |
bc.combat(data, batch_key=batch_key)
|
| 144 |
elif b_algo == 'mnn':
|
| 145 |
-
# MNN expects a list of SingleCellDatasets split by batch
|
| 146 |
batches = data.obs[batch_key].unique()
|
| 147 |
-
dataset_list = [data[data.obs[batch_key] == b] for b in batches]
|
| 148 |
data = bc.mnn_correct(dataset_list, batch_key=batch_key)
|
| 149 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 150 |
if request.form.get('run_umap') == 'true':
|
| 151 |
dim.run_umap(data, min_dist=float(request.form.get('umap_min_dist', 0.5)))
|
| 152 |
if request.form.get('run_tsne') == 'true':
|
|
@@ -155,6 +178,7 @@ def run_pipeline():
|
|
| 155 |
try: dim.run_phate(data)
|
| 156 |
except: pass
|
| 157 |
|
|
|
|
| 158 |
clust_algo = request.form.get('clustering', 'leiden')
|
| 159 |
res_k = float(request.form.get('resolution', 1.0))
|
| 160 |
|
|
@@ -173,6 +197,7 @@ def run_pipeline():
|
|
| 173 |
diff_method = request.form.get('diff_method', 't-test')
|
| 174 |
diff.rank_genes_groups(data, groupby='cluster', method=diff_method, use_raw=True)
|
| 175 |
|
|
|
|
| 176 |
if 'X_umap' in data.obsm:
|
| 177 |
umap_path = os.path.join(res_dir, 'umap_clusters.png')
|
| 178 |
vis.plot_umap(data, color="cluster", title="UMAP (Clusters)", save=umap_path)
|
|
|
|
| 2 |
import urllib.request
|
| 3 |
import tarfile
|
| 4 |
import shutil
|
| 5 |
+
import pandas as pd
|
| 6 |
from flask import Flask, render_template, request, jsonify, url_for
|
| 7 |
from werkzeug.utils import secure_filename
|
| 8 |
|
|
|
|
| 21 |
import scAnalysis.enrichment as enrich
|
| 22 |
import scAnalysis.visualization as vis
|
| 23 |
import scAnalysis.interactive_viz as iviz
|
| 24 |
+
import scAnalysis.imputation as imp
|
| 25 |
+
import scAnalysis.grn_inference as grn
|
| 26 |
|
| 27 |
app = Flask(__name__)
|
| 28 |
app.config['UPLOAD_FOLDER'] = './static/uploads'
|
|
|
|
| 108 |
elif norm_method == 'sctransform':
|
| 109 |
pp.normalize_sctransform(data)
|
| 110 |
|
| 111 |
+
# <-- EXPANDED IMPUTATION EXECUTION BLOCK -->
|
| 112 |
if request.form.get('run_imputation') == 'true':
|
| 113 |
+
imp_method = request.form.get('imp_method', 'wnid')
|
|
|
|
| 114 |
imp_pcs = int(request.form.get('imp_pcs', 30))
|
| 115 |
+
imp_k = int(request.form.get('imp_k', 7))
|
| 116 |
+
|
| 117 |
+
if imp_method == 'wnid':
|
| 118 |
+
imp_thresh = float(request.form.get('imp_thresh', 0.72))
|
| 119 |
+
imp.impute_wnid(data, k=imp_k, dropout_thresh=imp_thresh, n_pcs=imp_pcs)
|
| 120 |
+
elif imp_method == 'knn':
|
| 121 |
+
imp.impute_knn_smooth(data, k=imp_k, n_pcs=imp_pcs)
|
| 122 |
+
elif imp_method == 'diffusion':
|
| 123 |
+
imp.impute_diffusion(data, t=3, n_pcs=imp_pcs, use_prebuilt_graph=False)
|
| 124 |
|
| 125 |
organism = request.form.get('organism', 'human')
|
| 126 |
cc.score_cell_cycle(data, organism=organism)
|
|
|
|
| 143 |
dim.run_pca(data, n_components=n_pcs)
|
| 144 |
dim.neighbors(data, n_neighbors=n_neighbors, n_pcs=min(40, n_pcs))
|
| 145 |
|
| 146 |
+
# <-- BATCH CORRECTION -->
|
| 147 |
batch_key = request.form.get('batch_key', '')
|
| 148 |
if request.form.get('run_batch') == 'true' and batch_key in data.obs.columns:
|
| 149 |
b_algo = request.form.get('batch_algo', 'harmony')
|
|
|
|
| 152 |
elif b_algo == 'combat':
|
| 153 |
bc.combat(data, batch_key=batch_key)
|
| 154 |
elif b_algo == 'mnn':
|
|
|
|
| 155 |
batches = data.obs[batch_key].unique()
|
| 156 |
+
dataset_list = [data[data.obs[batch_key] == b].copy() for b in batches]
|
| 157 |
data = bc.mnn_correct(dataset_list, batch_key=batch_key)
|
| 158 |
|
| 159 |
+
# <-- GRN INFERENCE -->
|
| 160 |
+
if request.form.get('run_grn') == 'true':
|
| 161 |
+
tf_input = request.form.get('tf_list', '')
|
| 162 |
+
tf_list = [tf.strip() for tf in tf_input.split(',') if tf.strip()]
|
| 163 |
+
if tf_list:
|
| 164 |
+
try:
|
| 165 |
+
df_grn = grn.infer_grn_ridge(data, tf_list=tf_list, top_n_edges=5000)
|
| 166 |
+
grn_path = os.path.join(res_dir, 'grn_edges.csv')
|
| 167 |
+
df_grn.to_csv(grn_path, index=False)
|
| 168 |
+
outputs.append({'type': 'file', 'url': url_for('static', filename='results/grn_edges.csv'), 'title': 'Download GRN Edges', 'icon': 'fa-project-diagram'})
|
| 169 |
+
except Exception as e:
|
| 170 |
+
print("GRN Inference failed:", e)
|
| 171 |
+
|
| 172 |
+
# <-- DIMENSIONALITY REDUCTION -->
|
| 173 |
if request.form.get('run_umap') == 'true':
|
| 174 |
dim.run_umap(data, min_dist=float(request.form.get('umap_min_dist', 0.5)))
|
| 175 |
if request.form.get('run_tsne') == 'true':
|
|
|
|
| 178 |
try: dim.run_phate(data)
|
| 179 |
except: pass
|
| 180 |
|
| 181 |
+
# <-- CLUSTERING & TRAJECTORY -->
|
| 182 |
clust_algo = request.form.get('clustering', 'leiden')
|
| 183 |
res_k = float(request.form.get('resolution', 1.0))
|
| 184 |
|
|
|
|
| 197 |
diff_method = request.form.get('diff_method', 't-test')
|
| 198 |
diff.rank_genes_groups(data, groupby='cluster', method=diff_method, use_raw=True)
|
| 199 |
|
| 200 |
+
# <-- VISUALIZATION -->
|
| 201 |
if 'X_umap' in data.obsm:
|
| 202 |
umap_path = os.path.join(res_dir, 'umap_clusters.png')
|
| 203 |
vis.plot_umap(data, color="cluster", title="UMAP (Clusters)", save=umap_path)
|