diff --git a/README.md b/README.md
index 3200042..eed75f6 100644
--- a/README.md
+++ b/README.md
@@ -76,6 +76,7 @@ Optional environment variables:
* `GATEWAY_EXPIRE_SECONDS` - time in seconds that a cellxgene process will remain idle before being terminated. Defaults to 3600 (one hour)
* `GATEWAY_EXTRA_SCRIPTS` - JSON array of script paths, will be embedded into each page and forwarded with `--scripts` to cellxgene server
* `GATEWAY_ENABLE_ANNOTATIONS` - Set to `true` or to `1` to enable cellxgene annotations.
+* `GATEWAY_ENABLE_GENE_SETS` - Set to `true` or to `1` to enable cellxgene gene sets. Also enables `GATEWAY_ENABLE_ANNOTATIONS`.
* `GATEWAY_ENABLE_BACKED_MODE` - Set to `true` or to `1` to load AnnData in file-backed mode. This saves memory and speeds up launch time but may reduce overall performance.
* `GATEWAY_LOG_LEVEL` - default is `INFO`. set to `DEBUG` to increase logging and to `WARNING` to decrease logging.
* `S3_ENABLE_LISTINGS_CACHE` - Set to `true` or to `1` to cache listings of S3 folders for performance. If the cache becomes stale, set `filecrawl.html?refresh=true` query parameter to refresh the cache.
diff --git a/cellxgene_gateway/env.py b/cellxgene_gateway/env.py
index 5cf0c1b..4d8c4db 100644
--- a/cellxgene_gateway/env.py
+++ b/cellxgene_gateway/env.py
@@ -26,10 +26,16 @@ extra_scripts = os.environ.get("GATEWAY_EXTRA_SCRIPTS")
expire_seconds = int(
os.environ.get("GATEWAY_EXPIRE_SECONDS", os.environ.get("GATEWAY_TTL", "3600"))
)
+enable_gene_sets = os.environ.get("GATEWAY_ENABLE_GENE_SETS", "").lower() in [
+ "true",
+ "1",
+]
enable_annotations = os.environ.get("GATEWAY_ENABLE_ANNOTATIONS", "").lower() in [
"true",
"1",
]
+# Enable annotations if gene sets are enabled:
+enable_annotations = enable_annotations or enable_gene_sets
enable_backed_mode = os.environ.get("GATEWAY_ENABLE_BACKED_MODE", "").lower() in [
"true",
"1",
@@ -54,6 +60,7 @@ optional_env_vars = {
"GATEWAY_EXTRA_SCRIPTS": extra_scripts,
"GATEWAY_EXPIRE_SECONDS": expire_seconds,
"GATEWAY_ENABLE_ANNOTATIONS": enable_annotations,
+ "GATEWAY_ENABLE_GENE_SETS": enable_gene_sets,
"GATEWAY_ENABLE_BACKED_MODE": enable_backed_mode,
"GATEWAY_LOG_LEVEL": log_level,
"CELLXGENE_ARGS": cellxgene_args,
diff --git a/cellxgene_gateway/filecrawl.py b/cellxgene_gateway/filecrawl.py
index f812091..582afe8 100644
--- a/cellxgene_gateway/filecrawl.py
+++ b/cellxgene_gateway/filecrawl.py
@@ -20,15 +20,23 @@ def render_annotations(item, item_source):
item_source.get_annotations_subpath(item), item_source.name
)
new_annotation = f"new"
+ non_gene_set_files = []
+ if item.annotations is not None:
+ # Do not also display files to store gene_sets. These should be loaded
+ # by clicking on the associated annotations file (i.e. without the
+ # appended "_gene_sets")
+ for a in item.annotations:
+ if (len(a.name) < 10) or (a.name[-10:] != "_gene_sets"):
+ non_gene_set_files.append(a)
annotations = (
", ".join(
[
f"{a.name}"
- for a in item.annotations
+ for a in non_gene_set_files
]
)
+ ", "
- if item.annotations
+ if non_gene_set_files
else ""
)
return " | annotations: " + annotations + new_annotation
diff --git a/cellxgene_gateway/subprocess_backend.py b/cellxgene_gateway/subprocess_backend.py
index 19f8dc9..8825875 100644
--- a/cellxgene_gateway/subprocess_backend.py
+++ b/cellxgene_gateway/subprocess_backend.py
@@ -14,7 +14,12 @@ from flask_api import status
from cellxgene_gateway.cache_entry import CacheEntryStatus
from cellxgene_gateway.dir_util import make_annotations
-from cellxgene_gateway.env import cellxgene_args, enable_annotations, enable_backed_mode
+from cellxgene_gateway.env import (
+ cellxgene_args,
+ enable_annotations,
+ enable_backed_mode,
+ enable_gene_sets,
+)
from cellxgene_gateway.process_exception import ProcessException
logger = logging.getLogger(__name__)
@@ -32,6 +37,16 @@ class SubprocessBackend:
extra_args = f" --annotations-file {annotation_file_path}"
else:
extra_args = " --disable-annotations"
+ if enable_gene_sets and not annotation_file_path is None:
+ if annotation_file_path == "":
+ raise Exception(
+ "GATEWAY_ENABLE_GENE_SETS is true but --annotation_file_path not set"
+ )
+ else:
+ gene_sets_file_path = annotation_file_path[:-4] + "_gene_sets.csv"
+ extra_args += f" --gene-sets-file {gene_sets_file_path}"
+ else:
+ extra_args += " --disable-gene-sets-save"
if enable_backed_mode:
extra_args += " --backed"
if not cellxgene_args is None:
diff --git a/tests/test_subprocess_backend.py b/tests/test_subprocess_backend.py
index 5c22dbf..62652bf 100644
--- a/tests/test_subprocess_backend.py
+++ b/tests/test_subprocess_backend.py
@@ -33,7 +33,7 @@ class TestSubprocessBackend(unittest.TestCase):
backend.launch(cellxgene_loc, scripts, entry)
popen.assert_called_once_with(
[
- "yes | /some/cellxgene launch /tmp/czi/pbmc3k.h5ad --port 8000 --host 127.0.0.1 --disable-annotations --scripts http://example.com/script.js --scripts http://example.com/script2.js"
+ "yes | /some/cellxgene launch /tmp/czi/pbmc3k.h5ad --port 8000 --host 127.0.0.1 --disable-annotations --disable-gene-sets-save --scripts http://example.com/script.js --scripts http://example.com/script2.js"
],
shell=True,
stderr=-1,