mirror of
https://github.com/chanzuckerberg/cellxgene.git
synced 2026-09-23 21:28:11 +08:00
Apply yapf to python files
This commit is contained in:
+4
-5
@@ -10,11 +10,10 @@ from .prepare import prepare
|
||||
context_settings=dict(max_content_width=85,
|
||||
help_option_names=['-h', '--help']))
|
||||
@click.help_option("--help", "-h", help="Show this message and exit.")
|
||||
@click.version_option(
|
||||
version="0.13.0",
|
||||
prog_name="cellxgene",
|
||||
message="[%(prog)s] Version %(version)s",
|
||||
help="Show the software version and exit.")
|
||||
@click.version_option(version="0.13.0",
|
||||
prog_name="cellxgene",
|
||||
message="[%(prog)s] Version %(version)s",
|
||||
help="Show the software version and exit.")
|
||||
def cli():
|
||||
pass
|
||||
|
||||
|
||||
+124
-90
@@ -17,7 +17,7 @@ from server.utils.utils import find_available_port, is_port_available, sort_opti
|
||||
from server.app.util.data_locator import DataLocator
|
||||
|
||||
# anything bigger than this will generate a special message
|
||||
BIG_FILE_SIZE_THRESHOLD = 100 * 2 ** 20 # 100MB
|
||||
BIG_FILE_SIZE_THRESHOLD = 100 * 2**20 # 100MB
|
||||
|
||||
|
||||
def common_args(func):
|
||||
@@ -25,16 +25,14 @@ def common_args(func):
|
||||
Decorator to contain CLI args that will be common to both CLI and GUI: title and engine args.
|
||||
"""
|
||||
|
||||
@click.option(
|
||||
"--title",
|
||||
"-t",
|
||||
metavar="<text>",
|
||||
help="Title to display. If omitted will use file name.")
|
||||
@click.option(
|
||||
"--about",
|
||||
metavar="<URL>",
|
||||
help="URL providing more information about the dataset "
|
||||
"(hint: must be a fully specified absolute URL).")
|
||||
@click.option("--title",
|
||||
"-t",
|
||||
metavar="<text>",
|
||||
help="Title to display. If omitted will use file name.")
|
||||
@click.option("--about",
|
||||
metavar="<URL>",
|
||||
help="URL providing more information about the dataset "
|
||||
"(hint: must be a fully specified absolute URL).")
|
||||
@click.option(
|
||||
"--embedding",
|
||||
"-e",
|
||||
@@ -42,69 +40,80 @@ def common_args(func):
|
||||
multiple=True,
|
||||
show_default=False,
|
||||
metavar="<text>",
|
||||
help="Embedding name, eg, 'umap'. Repeat option for multiple embeddings. Defaults to all."
|
||||
help=
|
||||
"Embedding name, eg, 'umap'. Repeat option for multiple embeddings. Defaults to all."
|
||||
)
|
||||
@click.option(
|
||||
"--obs-names",
|
||||
"-obs",
|
||||
default=None,
|
||||
metavar="<text>",
|
||||
help="Name of annotation field to use for observations. If not specified cellxgene will use the the obs index.")
|
||||
help=
|
||||
"Name of annotation field to use for observations. If not specified cellxgene will use the the obs index."
|
||||
)
|
||||
@click.option(
|
||||
"--var-names",
|
||||
"-var",
|
||||
default=None,
|
||||
metavar="<text>",
|
||||
help="Name of annotation to use for variables. If not specified cellxgene will use the the var index.")
|
||||
help=
|
||||
"Name of annotation to use for variables. If not specified cellxgene will use the the var index."
|
||||
)
|
||||
@click.option(
|
||||
"--max-category-items",
|
||||
default=1000,
|
||||
metavar="<integer>",
|
||||
show_default=True,
|
||||
help="Will not display categories with more distinct values than specified.",)
|
||||
help=
|
||||
"Will not display categories with more distinct values than specified.",
|
||||
)
|
||||
@click.option(
|
||||
"--diffexp-lfc-cutoff",
|
||||
"-de",
|
||||
default=0.01,
|
||||
show_default=True,
|
||||
metavar="<float>",
|
||||
help="Minimum log fold change threshold for differential expression.",)
|
||||
@click.option(
|
||||
"--experimental-annotations",
|
||||
is_flag=True,
|
||||
default=False,
|
||||
show_default=True,
|
||||
help="Enable user annotation of data."
|
||||
help="Minimum log fold change threshold for differential expression.",
|
||||
)
|
||||
@click.option("--experimental-annotations",
|
||||
is_flag=True,
|
||||
default=False,
|
||||
show_default=True,
|
||||
help="Enable user annotation of data.")
|
||||
@click.option(
|
||||
"--experimental-annotations-file",
|
||||
default=None,
|
||||
show_default=True,
|
||||
multiple=False,
|
||||
metavar="<path>",
|
||||
help="CSV file to initialize editing of existing annotations; will be altered in-place. "
|
||||
"Incompatible with --annotations-output-dir.",)
|
||||
help=
|
||||
"CSV file to initialize editing of existing annotations; will be altered in-place. "
|
||||
"Incompatible with --annotations-output-dir.",
|
||||
)
|
||||
@click.option(
|
||||
"--experimental-annotations-output-dir",
|
||||
default=None,
|
||||
show_default=False,
|
||||
multiple=False,
|
||||
metavar="<directory path>",
|
||||
help="Directory of where to save output annotations; filename will be specified in the application. "
|
||||
"Incompatible with --annotations-input-file.",)
|
||||
help=
|
||||
"Directory of where to save output annotations; filename will be specified in the application. "
|
||||
"Incompatible with --annotations-input-file.",
|
||||
)
|
||||
@click.option(
|
||||
"--backed",
|
||||
"-b",
|
||||
is_flag=True,
|
||||
default=False,
|
||||
show_default=False,
|
||||
help="Load data in file-backed mode. This may save memory, but may result in slower overall performance.")
|
||||
@click.option(
|
||||
"--disable-diffexp",
|
||||
is_flag=True,
|
||||
default=False,
|
||||
show_default=False,
|
||||
help="Disable on-demand differential expression.")
|
||||
help=
|
||||
"Load data in file-backed mode. This may save memory, but may result in slower overall performance."
|
||||
)
|
||||
@click.option("--disable-diffexp",
|
||||
is_flag=True,
|
||||
default=False,
|
||||
show_default=False,
|
||||
help="Disable on-demand differential expression.")
|
||||
@functools.wraps(func)
|
||||
def wrapper(*args, **kwargs):
|
||||
return func(*args, **kwargs)
|
||||
@@ -112,9 +121,11 @@ def common_args(func):
|
||||
return wrapper
|
||||
|
||||
|
||||
def parse_engine_args(embedding, obs_names, var_names, max_category_items, diffexp_lfc_cutoff,
|
||||
experimental_annotations, experimental_annotations_file,
|
||||
experimental_annotations_output_dir, backed, disable_diffexp):
|
||||
def parse_engine_args(embedding, obs_names, var_names, max_category_items,
|
||||
diffexp_lfc_cutoff, experimental_annotations,
|
||||
experimental_annotations_file,
|
||||
experimental_annotations_output_dir, backed,
|
||||
disable_diffexp):
|
||||
annotations_file = experimental_annotations_file if experimental_annotations else None
|
||||
annotations_output_dir = experimental_annotations_output_dir if experimental_annotations else None
|
||||
return {
|
||||
@@ -132,9 +143,11 @@ def parse_engine_args(embedding, obs_names, var_names, max_category_items, diffe
|
||||
|
||||
|
||||
@sort_options
|
||||
@click.command(short_help="Launch the cellxgene data viewer. "
|
||||
"Run `cellxgene launch --help` for more information.",
|
||||
options_metavar="<options>",)
|
||||
@click.command(
|
||||
short_help="Launch the cellxgene data viewer. "
|
||||
"Run `cellxgene launch --help` for more information.",
|
||||
options_metavar="<options>",
|
||||
)
|
||||
@click.argument("data", nargs=1, metavar="<path to data file>", required=True)
|
||||
@click.option(
|
||||
"--verbose",
|
||||
@@ -142,7 +155,8 @@ def parse_engine_args(embedding, obs_names, var_names, max_category_items, diffe
|
||||
is_flag=True,
|
||||
default=False,
|
||||
show_default=True,
|
||||
help="Provide verbose output, including warnings and all server requests.",)
|
||||
help="Provide verbose output, including warnings and all server requests.",
|
||||
)
|
||||
@click.option(
|
||||
"--debug",
|
||||
"-d",
|
||||
@@ -150,7 +164,8 @@ def parse_engine_args(embedding, obs_names, var_names, max_category_items, diffe
|
||||
default=False,
|
||||
show_default=True,
|
||||
help="Run in debug mode. This is helpful for cellxgene developers, "
|
||||
"or when you want more information about an error condition.",)
|
||||
"or when you want more information about an error condition.",
|
||||
)
|
||||
@click.option(
|
||||
"--open",
|
||||
"-o",
|
||||
@@ -158,19 +173,24 @@ def parse_engine_args(embedding, obs_names, var_names, max_category_items, diffe
|
||||
is_flag=True,
|
||||
default=False,
|
||||
show_default=True,
|
||||
help="Open web browser after launch.",)
|
||||
help="Open web browser after launch.",
|
||||
)
|
||||
@click.option(
|
||||
"--port",
|
||||
"-p",
|
||||
metavar="<port>",
|
||||
show_default=True,
|
||||
help="Port to run server on. If not specified cellxgene will find an available port.",)
|
||||
help=
|
||||
"Port to run server on. If not specified cellxgene will find an available port.",
|
||||
)
|
||||
@click.option(
|
||||
"--host",
|
||||
metavar="<IP address>",
|
||||
default="127.0.0.1",
|
||||
show_default=False,
|
||||
help="Host IP address. By default cellxgene will use localhost (e.g. 127.0.0.1).")
|
||||
help=
|
||||
"Host IP address. By default cellxgene will use localhost (e.g. 127.0.0.1)."
|
||||
)
|
||||
@click.option(
|
||||
"--scripts",
|
||||
"-s",
|
||||
@@ -178,31 +198,15 @@ def parse_engine_args(embedding, obs_names, var_names, max_category_items, diffe
|
||||
multiple=True,
|
||||
metavar="<text>",
|
||||
help="Additional script files to include in HTML page. If not specified, "
|
||||
"no additional script files will be included.",
|
||||
show_default=False,)
|
||||
"no additional script files will be included.",
|
||||
show_default=False,
|
||||
)
|
||||
@click.help_option("--help", "-h", help="Show this message and exit.")
|
||||
@common_args
|
||||
def launch(
|
||||
data,
|
||||
verbose,
|
||||
debug,
|
||||
open_browser,
|
||||
port,
|
||||
host,
|
||||
embedding,
|
||||
obs_names,
|
||||
var_names,
|
||||
max_category_items,
|
||||
diffexp_lfc_cutoff,
|
||||
title,
|
||||
scripts,
|
||||
about,
|
||||
experimental_annotations,
|
||||
experimental_annotations_file,
|
||||
experimental_annotations_output_dir,
|
||||
backed,
|
||||
disable_diffexp
|
||||
):
|
||||
def launch(data, verbose, debug, open_browser, port, host, embedding, obs_names,
|
||||
var_names, max_category_items, diffexp_lfc_cutoff, title, scripts,
|
||||
about, experimental_annotations, experimental_annotations_file,
|
||||
experimental_annotations_output_dir, backed, disable_diffexp):
|
||||
"""Launch the cellxgene data viewer.
|
||||
This web app lets you explore single-cell expression data.
|
||||
Data must be in a format that cellxgene expects.
|
||||
@@ -217,17 +221,17 @@ def launch(
|
||||
|
||||
> cellxgene launch <url>"""
|
||||
|
||||
e_args = parse_engine_args(embedding, obs_names, var_names, max_category_items,
|
||||
diffexp_lfc_cutoff,
|
||||
e_args = parse_engine_args(embedding, obs_names, var_names,
|
||||
max_category_items, diffexp_lfc_cutoff,
|
||||
experimental_annotations,
|
||||
experimental_annotations_file,
|
||||
experimental_annotations_output_dir,
|
||||
backed,
|
||||
experimental_annotations_output_dir, backed,
|
||||
disable_diffexp)
|
||||
try:
|
||||
data_locator = DataLocator(data)
|
||||
except RuntimeError as re:
|
||||
raise click.ClickException(f"Unable to access data at {data}. {str(re)}")
|
||||
raise click.ClickException(
|
||||
f"Unable to access data at {data}. {str(re)}")
|
||||
|
||||
# Startup message
|
||||
click.echo("[cellxgene] Starting the CLI...")
|
||||
@@ -244,7 +248,8 @@ def launch(
|
||||
raise click.FileError(data, hint="data is not a file")
|
||||
name, extension = splitext(data)
|
||||
if extension != ".h5ad":
|
||||
raise click.FileError(basename(data), hint="file type must be .h5ad")
|
||||
raise click.FileError(basename(data),
|
||||
hint="file type must be .h5ad")
|
||||
|
||||
if debug:
|
||||
verbose = True
|
||||
@@ -266,7 +271,9 @@ def launch(
|
||||
security risk by including the --scripts flag. Make sure you trust the scripts that you are including.
|
||||
""")
|
||||
scripts_pretty = ", ".join(scripts)
|
||||
click.confirm(f"Are you sure you want to inject these scripts: {scripts_pretty}?", abort=True)
|
||||
click.confirm(
|
||||
f"Are you sure you want to inject these scripts: {scripts_pretty}?",
|
||||
abort=True)
|
||||
|
||||
if not title:
|
||||
file_parts = splitext(basename(data))
|
||||
@@ -274,7 +281,9 @@ def launch(
|
||||
|
||||
if port:
|
||||
if debug:
|
||||
raise click.ClickException("--port and --debug may not be used together (try --verbose for error logging).")
|
||||
raise click.ClickException(
|
||||
"--port and --debug may not be used together (try --verbose for error logging)."
|
||||
)
|
||||
if not is_port_available(host, int(port)):
|
||||
raise click.ClickException(
|
||||
f"The port selected {port} is in use, please specify an open port using the --port flag."
|
||||
@@ -284,27 +293,36 @@ def launch(
|
||||
|
||||
if not experimental_annotations:
|
||||
if experimental_annotations_file is not None:
|
||||
click.echo("Warning: --experimental-annotations-file ignored as --annotations not enabled.")
|
||||
click.echo(
|
||||
"Warning: --experimental-annotations-file ignored as --annotations not enabled."
|
||||
)
|
||||
if experimental_annotations_output_dir is not None:
|
||||
click.echo("Warning: --experimental-annotations-output-dir ignored as --annotations not enabled.")
|
||||
click.echo(
|
||||
"Warning: --experimental-annotations-output-dir ignored as --annotations not enabled."
|
||||
)
|
||||
else:
|
||||
if experimental_annotations_file is not None and experimental_annotations_output_dir is not None:
|
||||
raise click.ClickException("--experimental-annotations-file and --experimental-annotations-output-dir "
|
||||
"may not be used together.")
|
||||
raise click.ClickException(
|
||||
"--experimental-annotations-file and --experimental-annotations-output-dir "
|
||||
"may not be used together.")
|
||||
|
||||
if experimental_annotations_file is not None:
|
||||
lf_name, lf_ext = splitext(experimental_annotations_file)
|
||||
if lf_ext and lf_ext != ".csv":
|
||||
raise click.FileError(basename(experimental_annotations_file), hint="annotation file type must be .csv")
|
||||
raise click.FileError(basename(experimental_annotations_file),
|
||||
hint="annotation file type must be .csv")
|
||||
|
||||
if experimental_annotations_output_dir is not None and not isdir(experimental_annotations_output_dir):
|
||||
if experimental_annotations_output_dir is not None and not isdir(
|
||||
experimental_annotations_output_dir):
|
||||
try:
|
||||
mkdir(experimental_annotations_output_dir)
|
||||
except OSError:
|
||||
raise click.ClickException("Unable to create directory specified by "
|
||||
"--experimental-annotations-output-dir")
|
||||
raise click.ClickException(
|
||||
"Unable to create directory specified by "
|
||||
"--experimental-annotations-output-dir")
|
||||
|
||||
if about:
|
||||
|
||||
def url_check(url):
|
||||
try:
|
||||
result = urlparse(url)
|
||||
@@ -316,7 +334,9 @@ def launch(
|
||||
return False
|
||||
|
||||
if not url_check(about):
|
||||
raise click.ClickException("Must provide an absolute URL for --about. (Example format: http://example.com)")
|
||||
raise click.ClickException(
|
||||
"Must provide an absolute URL for --about. (Example format: http://example.com)"
|
||||
)
|
||||
|
||||
# Setup app
|
||||
cellxgene_url = f"http://{host}:{port}"
|
||||
@@ -335,14 +355,18 @@ def launch(
|
||||
|
||||
# if a big file, let the user know it may take a while to load.
|
||||
if file_size > BIG_FILE_SIZE_THRESHOLD:
|
||||
click.echo(f"[cellxgene] Loading data from {basename(data)}, this may take a while...")
|
||||
click.echo(
|
||||
f"[cellxgene] Loading data from {basename(data)}, this may take a while..."
|
||||
)
|
||||
else:
|
||||
click.echo(f"[cellxgene] Loading data from {basename(data)}.")
|
||||
|
||||
from server.app.scanpy_engine.scanpy_engine import ScanpyEngine
|
||||
|
||||
try:
|
||||
server.attach_data(ScanpyEngine(data_locator, e_args), title=title, about=about)
|
||||
server.attach_data(ScanpyEngine(data_locator, e_args),
|
||||
title=title,
|
||||
about=about)
|
||||
except ScanpyFileError as e:
|
||||
raise click.ClickException(f"{e}")
|
||||
|
||||
@@ -351,10 +375,14 @@ def launch(
|
||||
f"running differential expression may take longer or fail.")
|
||||
|
||||
if open_browser:
|
||||
click.echo(f"[cellxgene] Launching! Opening your browser to {cellxgene_url} now.")
|
||||
click.echo(
|
||||
f"[cellxgene] Launching! Opening your browser to {cellxgene_url} now."
|
||||
)
|
||||
webbrowser.open(cellxgene_url)
|
||||
else:
|
||||
click.echo(f"[cellxgene] Launching! Please go to {cellxgene_url} in your browser.")
|
||||
click.echo(
|
||||
f"[cellxgene] Launching! Please go to {cellxgene_url} in your browser."
|
||||
)
|
||||
|
||||
click.echo("[cellxgene] Type CTRL-C at any time to exit.")
|
||||
|
||||
@@ -363,8 +391,14 @@ def launch(
|
||||
sys.stdout = f
|
||||
|
||||
try:
|
||||
server.app.run(host=host, debug=debug, port=port, threaded=False if debug else True, use_debugger=False)
|
||||
server.app.run(host=host,
|
||||
debug=debug,
|
||||
port=port,
|
||||
threaded=False if debug else True,
|
||||
use_debugger=False)
|
||||
except OSError as e:
|
||||
if e.errno == errno.EADDRINUSE:
|
||||
raise click.ClickException("Port is in use, please specify an open port using the --port flag.") from e
|
||||
raise click.ClickException(
|
||||
"Port is in use, please specify an open port using the --port flag."
|
||||
) from e
|
||||
raise
|
||||
|
||||
+90
-47
@@ -8,9 +8,11 @@ from server.utils.utils import sort_options
|
||||
|
||||
|
||||
@sort_options
|
||||
@click.command(short_help="Preprocess data for use with cellxgene. "
|
||||
"Run `cellxgene prepare --help` for more information.",
|
||||
options_metavar="<options>",)
|
||||
@click.command(
|
||||
short_help="Preprocess data for use with cellxgene. "
|
||||
"Run `cellxgene prepare --help` for more information.",
|
||||
options_metavar="<options>",
|
||||
)
|
||||
@click.argument("data", nargs=1, metavar="<path to data file>", required=True)
|
||||
@click.option(
|
||||
"--embedding",
|
||||
@@ -29,43 +31,66 @@ from server.utils.utils import sort_options
|
||||
help="Preprocessing to run.",
|
||||
show_default=True,
|
||||
)
|
||||
@click.option("--output", "-o", default="", help="Save a new file to filename.", metavar="<filename>")
|
||||
@click.option("--plotting", "-p", default=False, is_flag=True, help="Generate plots.", show_default=True)
|
||||
@click.option("--sparse", default=False, is_flag=True, help="Force sparsity.", show_default=True)
|
||||
@click.option("--overwrite", default=False, is_flag=True, help="Allow file overwriting.", show_default=True)
|
||||
@click.option("--set-obs-names", default="", help="Named field to set as index for obs.", metavar="<name>")
|
||||
@click.option("--set-var-names", default="", help="Named field to set as index for var.", metavar="<name>")
|
||||
@click.option("--skip-qc", default=False, is_flag=True,
|
||||
help="Do not run quality control metrics. By default cellxgene runs them "
|
||||
"(saved to adata.obs and adata.var; see scanpy.pp.calculate_qc_metrics for details).")
|
||||
@click.option("--output",
|
||||
"-o",
|
||||
default="",
|
||||
help="Save a new file to filename.",
|
||||
metavar="<filename>")
|
||||
@click.option("--plotting",
|
||||
"-p",
|
||||
default=False,
|
||||
is_flag=True,
|
||||
help="Generate plots.",
|
||||
show_default=True)
|
||||
@click.option("--sparse",
|
||||
default=False,
|
||||
is_flag=True,
|
||||
help="Force sparsity.",
|
||||
show_default=True)
|
||||
@click.option("--overwrite",
|
||||
default=False,
|
||||
is_flag=True,
|
||||
help="Allow file overwriting.",
|
||||
show_default=True)
|
||||
@click.option("--set-obs-names",
|
||||
default="",
|
||||
help="Named field to set as index for obs.",
|
||||
metavar="<name>")
|
||||
@click.option("--set-var-names",
|
||||
default="",
|
||||
help="Named field to set as index for var.",
|
||||
metavar="<name>")
|
||||
@click.option(
|
||||
"--make-obs-names-unique",
|
||||
default=True,
|
||||
"--skip-qc",
|
||||
default=False,
|
||||
is_flag=True,
|
||||
help="Ensure obs index is unique.",
|
||||
show_default=True
|
||||
)
|
||||
@click.option(
|
||||
"--make-var-names-unique",
|
||||
default=True,
|
||||
is_flag=True,
|
||||
help="Ensure var index is unique.",
|
||||
show_default=True
|
||||
help="Do not run quality control metrics. By default cellxgene runs them "
|
||||
"(saved to adata.obs and adata.var; see scanpy.pp.calculate_qc_metrics for details)."
|
||||
)
|
||||
@click.option("--make-obs-names-unique",
|
||||
default=True,
|
||||
is_flag=True,
|
||||
help="Ensure obs index is unique.",
|
||||
show_default=True)
|
||||
@click.option("--make-var-names-unique",
|
||||
default=True,
|
||||
is_flag=True,
|
||||
help="Ensure var index is unique.",
|
||||
show_default=True)
|
||||
@click.help_option("--help", "-h", help="Show this message and exit.")
|
||||
def prepare(
|
||||
data,
|
||||
embedding,
|
||||
recipe,
|
||||
output,
|
||||
plotting,
|
||||
sparse,
|
||||
overwrite,
|
||||
set_obs_names,
|
||||
set_var_names,
|
||||
skip_qc,
|
||||
make_obs_names_unique,
|
||||
make_var_names_unique,
|
||||
data,
|
||||
embedding,
|
||||
recipe,
|
||||
output,
|
||||
plotting,
|
||||
sparse,
|
||||
overwrite,
|
||||
set_obs_names,
|
||||
set_var_names,
|
||||
skip_qc,
|
||||
make_obs_names_unique,
|
||||
make_var_names_unique,
|
||||
):
|
||||
"""
|
||||
Preprocess data for use with cellxgene.
|
||||
@@ -86,8 +111,7 @@ def prepare(
|
||||
except ImportError:
|
||||
raise click.ClickException(
|
||||
"[cellxgene] cellxgene prepare has not been installed. Please run `pip install cellxgene[prepare]` "
|
||||
"to install the necessary requirements."
|
||||
)
|
||||
"to install the necessary requirements.")
|
||||
|
||||
# scanpy settings
|
||||
sc.settings.verbosity = 0
|
||||
@@ -102,10 +126,11 @@ def prepare(
|
||||
if not output:
|
||||
click.echo(
|
||||
"Warning: No file will be saved, to save the results of cellxgene prepare include "
|
||||
"--output <filename> to save output to a new file"
|
||||
)
|
||||
"--output <filename> to save output to a new file")
|
||||
if isfile(output) and not overwrite:
|
||||
raise click.UsageError(f"Cannot overwrite existing file {output}, try using the flag --overwrite")
|
||||
raise click.UsageError(
|
||||
f"Cannot overwrite existing file {output}, try using the flag --overwrite"
|
||||
)
|
||||
|
||||
def load_data(data):
|
||||
if isfile(data):
|
||||
@@ -115,7 +140,9 @@ def prepare(
|
||||
elif extension == ".loom":
|
||||
adata = sc.read_loom(data)
|
||||
else:
|
||||
raise click.FileError(data, hint="does not have a valid extension [.h5ad | .loom]")
|
||||
raise click.FileError(
|
||||
data,
|
||||
hint="does not have a valid extension [.h5ad | .loom]")
|
||||
elif isdir(data):
|
||||
if not data.endswith(sep):
|
||||
data += sep
|
||||
@@ -125,11 +152,15 @@ def prepare(
|
||||
|
||||
if not set_obs_names == "":
|
||||
if set_obs_names not in adata.obs_keys():
|
||||
raise click.UsageError(f"obs {set_obs_names} not found, options are: {adata.obs_keys()}")
|
||||
raise click.UsageError(
|
||||
f"obs {set_obs_names} not found, options are: {adata.obs_keys()}"
|
||||
)
|
||||
adata.obs_names = adata.obs[set_obs_names]
|
||||
if not set_var_names == "":
|
||||
if set_var_names not in adata.var_keys():
|
||||
raise click.UsageError(f"var {set_var_names} not found, options are: {adata.var_keys()}")
|
||||
raise click.UsageError(
|
||||
f"var {set_var_names} not found, options are: {adata.var_keys()}"
|
||||
)
|
||||
adata.var_names = adata.var[set_var_names]
|
||||
if make_obs_names_unique:
|
||||
adata.obs_names_make_unique()
|
||||
@@ -184,12 +215,18 @@ def prepare(
|
||||
if "umap" in embedding:
|
||||
sc.tl.umap(adata)
|
||||
if plotting:
|
||||
sc.pl.umap(adata, color="louvain", palette=palette, save="_louvain")
|
||||
sc.pl.umap(adata,
|
||||
color="louvain",
|
||||
palette=palette,
|
||||
save="_louvain")
|
||||
|
||||
if "tsne" in embedding:
|
||||
sc.tl.tsne(adata)
|
||||
if plotting:
|
||||
sc.pl.tsne(adata, color="louvain", palette=palette, save="_louvain")
|
||||
sc.pl.tsne(adata,
|
||||
color="louvain",
|
||||
palette=palette,
|
||||
save="_louvain")
|
||||
|
||||
def show_step(item):
|
||||
if not skip_qc:
|
||||
@@ -208,13 +245,19 @@ def prepare(
|
||||
if item is not None:
|
||||
return names[item.__name__]
|
||||
|
||||
steps = [calculate_qc_metrics, make_sparse, run_recipe, run_pca, run_neighbors, run_louvain, run_embedding]
|
||||
steps = [
|
||||
calculate_qc_metrics, make_sparse, run_recipe, run_pca, run_neighbors,
|
||||
run_louvain, run_embedding
|
||||
]
|
||||
|
||||
click.echo(f"[cellxgene] Loading data from {data}, please wait...")
|
||||
adata = load_data(data)
|
||||
|
||||
click.echo("[cellxgene] Beginning preprocessing...")
|
||||
with click.progressbar(steps, label="[cellxgene] Progress", show_eta=False, item_show_func=show_step) as bar:
|
||||
with click.progressbar(steps,
|
||||
label="[cellxgene] Progress",
|
||||
show_eta=False,
|
||||
item_show_func=show_step) as bar:
|
||||
for step in bar:
|
||||
step(adata)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user