Umair Khan commited on
Commit
591e14d
·
1 Parent(s): 39dda52

add previews to obs columns too

Browse files
Files changed (1) hide show
  1. app.py +11 -11
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 .var columns
64
- def _summarize_var_columns(adata_var_df, preview_max=VAR_PREVIEW_MAX):
65
  choices = []
66
- for col in adata_var_df.columns:
67
- s = adata_var_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,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 = _summarize_var_columns(adata.var)
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
- var_cols = list(adata.var.columns)
449
- obs_cols = list(adata.obs.columns)
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, var_cols, obs_cols, 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,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, var_cols, obs_cols, 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,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] + obs_cols, 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_cols, update_obs_dd, coords, str(h5ad_path.resolve())
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 = """