Umair Khan
commited on
Commit
·
591e14d
1
Parent(s):
39dda52
add previews to obs columns too
Browse files
app.py
CHANGED
|
@@ -60,11 +60,11 @@ def _pick_layer(adata, layer_name):
|
|
| 60 |
X = X.toarray()
|
| 61 |
return X
|
| 62 |
|
| 63 |
-
# helper to summarize
|
| 64 |
-
def
|
| 65 |
choices = []
|
| 66 |
-
for col in
|
| 67 |
-
s =
|
| 68 |
dtype = str(s.dtype)
|
| 69 |
ex = pd.Series(s.astype(object)).dropna().astype(str).head(preview_max).tolist()
|
| 70 |
preview = ", ".join(ex) if ex else "—"
|
|
@@ -121,7 +121,7 @@ def ensure_dropdowns(fileobj):
|
|
| 121 |
adata = sc.read_h5ad(fileobj.name, backed="r")
|
| 122 |
adata.var = adata.var.reset_index(drop=False, names="index")
|
| 123 |
layers = list(adata.layers.keys())
|
| 124 |
-
var_choices =
|
| 125 |
del adata
|
| 126 |
gc.collect()
|
| 127 |
default_var = var_choices[0][1] if var_choices else None
|
|
@@ -445,8 +445,8 @@ def _embed(adata_bytes, layer_name, feature_col, use_symbols, progress):
|
|
| 445 |
|
| 446 |
# hand back small metadata for UI refresh
|
| 447 |
layers = list(adata.layers.keys())
|
| 448 |
-
|
| 449 |
-
|
| 450 |
|
| 451 |
# serialize AnnData back to bytes for CPU side
|
| 452 |
with tempfile.TemporaryDirectory() as td2:
|
|
@@ -461,7 +461,7 @@ def _embed(adata_bytes, layer_name, feature_col, use_symbols, progress):
|
|
| 461 |
gc.collect()
|
| 462 |
|
| 463 |
# return embeddings and metadata
|
| 464 |
-
return cell_array, layers,
|
| 465 |
|
| 466 |
# processing pipeline given user inputs
|
| 467 |
def run_pipeline(fileobj, layer_choice, var_choice, use_symbols, progress=gr.Progress(track_tqdm=False)):
|
|
@@ -478,7 +478,7 @@ def run_pipeline(fileobj, layer_choice, var_choice, use_symbols, progress=gr.Pro
|
|
| 478 |
adata_bytes = f.read()
|
| 479 |
|
| 480 |
# compute embeddings on GPU
|
| 481 |
-
E, layers,
|
| 482 |
adata_bytes=adata_bytes,
|
| 483 |
layer_name=(None if layer_choice in [None, "", "<use .X>"] else layer_choice),
|
| 484 |
feature_col=(None if var_choice in [None, ""] else var_choice),
|
|
@@ -512,13 +512,13 @@ def run_pipeline(fileobj, layer_choice, var_choice, use_symbols, progress=gr.Pro
|
|
| 512 |
plt.close(fig)
|
| 513 |
|
| 514 |
# enable coloring dropdown
|
| 515 |
-
update_obs_dd = gr.Dropdown(choices=[OBS_NONE_OPTION] +
|
| 516 |
|
| 517 |
# save other outputs and return paths
|
| 518 |
progress(0.95, desc="saving outputs")
|
| 519 |
parquet_path, h5ad_path = _save_outputs(adata, E)
|
| 520 |
progress(1.00, desc="finished!")
|
| 521 |
-
return str(umap_png.resolve()), str(parquet_path.resolve()), str(h5ad_path.resolve()), ["<use .X>"] + layers,
|
| 522 |
|
| 523 |
# specify app layout
|
| 524 |
css = """
|
|
|
|
| 60 |
X = X.toarray()
|
| 61 |
return X
|
| 62 |
|
| 63 |
+
# helper to summarize DataFrame column choices
|
| 64 |
+
def _summarize_columns(df, preview_max=VAR_PREVIEW_MAX):
|
| 65 |
choices = []
|
| 66 |
+
for col in df.columns:
|
| 67 |
+
s = df[col]
|
| 68 |
dtype = str(s.dtype)
|
| 69 |
ex = pd.Series(s.astype(object)).dropna().astype(str).head(preview_max).tolist()
|
| 70 |
preview = ", ".join(ex) if ex else "—"
|
|
|
|
| 121 |
adata = sc.read_h5ad(fileobj.name, backed="r")
|
| 122 |
adata.var = adata.var.reset_index(drop=False, names="index")
|
| 123 |
layers = list(adata.layers.keys())
|
| 124 |
+
var_choices = _summarize_columns(adata.var)
|
| 125 |
del adata
|
| 126 |
gc.collect()
|
| 127 |
default_var = var_choices[0][1] if var_choices else None
|
|
|
|
| 445 |
|
| 446 |
# hand back small metadata for UI refresh
|
| 447 |
layers = list(adata.layers.keys())
|
| 448 |
+
var_choices = _summarize_columns(adata.var)
|
| 449 |
+
obs_choices = _summarize_columns(adata.obs)
|
| 450 |
|
| 451 |
# serialize AnnData back to bytes for CPU side
|
| 452 |
with tempfile.TemporaryDirectory() as td2:
|
|
|
|
| 461 |
gc.collect()
|
| 462 |
|
| 463 |
# return embeddings and metadata
|
| 464 |
+
return cell_array, layers, var_choices, obs_choices, adata_persisted
|
| 465 |
|
| 466 |
# processing pipeline given user inputs
|
| 467 |
def run_pipeline(fileobj, layer_choice, var_choice, use_symbols, progress=gr.Progress(track_tqdm=False)):
|
|
|
|
| 478 |
adata_bytes = f.read()
|
| 479 |
|
| 480 |
# compute embeddings on GPU
|
| 481 |
+
E, layers, var_choices, obs_choices, adata_with_emb_bytes = _embed(
|
| 482 |
adata_bytes=adata_bytes,
|
| 483 |
layer_name=(None if layer_choice in [None, "", "<use .X>"] else layer_choice),
|
| 484 |
feature_col=(None if var_choice in [None, ""] else var_choice),
|
|
|
|
| 512 |
plt.close(fig)
|
| 513 |
|
| 514 |
# enable coloring dropdown
|
| 515 |
+
update_obs_dd = gr.Dropdown(choices=[OBS_NONE_OPTION] + obs_choices, value=OBS_NONE_OPTION, interactive=True)
|
| 516 |
|
| 517 |
# save other outputs and return paths
|
| 518 |
progress(0.95, desc="saving outputs")
|
| 519 |
parquet_path, h5ad_path = _save_outputs(adata, E)
|
| 520 |
progress(1.00, desc="finished!")
|
| 521 |
+
return str(umap_png.resolve()), str(parquet_path.resolve()), str(h5ad_path.resolve()), ["<use .X>"] + layers, var_choices, update_obs_dd, coords, str(h5ad_path.resolve())
|
| 522 |
|
| 523 |
# specify app layout
|
| 524 |
css = """
|