ayyuce commited on
Commit
aa88038
·
verified ·
1 Parent(s): 05207bd

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +32 -7
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 # <-- ADDED IMPUTATION MODULE
 
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
- # <-- ADDED IMPUTATION EXECUTION BLOCK -->
110
  if request.form.get('run_imputation') == 'true':
111
- imp_k = int(request.form.get('imp_k', 7))
112
- imp_thresh = float(request.form.get('imp_thresh', 0.72))
113
  imp_pcs = int(request.form.get('imp_pcs', 30))
114
- imp.impute_wnid(data, k=imp_k, dropout_thresh=imp_thresh, n_pcs=imp_pcs)
 
 
 
 
 
 
 
 
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)