Source code for readfish._cli_args

"""Store for command line arguments and defaults, these are used by readfish entry points.

These are held here in an agnostic format and the actual CLI is generated by ``readfish._cli_base``.
The two primary items that are exported are ``BASE_ARGS`` and ``DEVICE_BASE_ARGS`` which define different sets of command line arguments for different purposes.
``BASE_ARGS`` are the minimal required arguments for _all_ entry points as they used for initialising loggers.
``DEVICE_BASE_ARGS`` are the set of arguments that are used for connecting to a sequencer (device) and some other related settings for selective sequencing scripts.
"""

from enum import Enum, unique
from readfish._utils import nice_join


[docs] @unique class Chemistry(Enum): #: For the "smarter" version of duplex - does this read map to the previous reads opposite strand on the same contig. Won't work for no map based decisions DUPLEX = "duplex" #: Normal simplex chemistry - no duplex override shenanigans SIMPLEX = "simplex" #: Simple duplex - if we are going to unblock a read given the previous read on the same channel was stop receiving, sequence the current read instead. DUPLEX_SIMPLE = "duplex_simple"
DEFAULT_SERVER_HOST = "127.0.0.1" DEFAULT_SERVER_PORT = None DEFAULT_LOG_FORMAT = "%(asctime)s %(name)s %(message)s" DEFAULT_LOG_LEVEL = "info" DEFAULT_UNBLOCK = 0.1 DEFAULT_THROTTLE = 0.4 DEFAULT_MIN_CHUNK = 2000 LOG_LEVELS = ("debug", "info", "warning", "error", "critical") DEFAULT_MAX_UNBLOCK_READ_LENGTH_SECONDS = 5 BASE_ARGS = ( ( "--log-level", dict( metavar="LOG-LEVEL", action="store", default=DEFAULT_LOG_LEVEL, choices=LOG_LEVELS, help=f"One of: {nice_join(LOG_LEVELS)}", ), ), ( "--log-format", dict( metavar="LOG-FORMAT", action="store", default=DEFAULT_LOG_FORMAT, help="A standard Python logging format string (default: {!r})".format( DEFAULT_LOG_FORMAT.replace("%", "%%") ), ), ), ( "--log-file", dict( metavar="LOG-FILE", action="store", default=None, help="A filename to write logs to, or None to write to the standard stream (default: None)", ), ), ) DEVICE_BASE_ARGS = ( ( "--host", dict( metavar="HOST", help=f"MinKNOW server host (default: {DEFAULT_SERVER_HOST})", default=DEFAULT_SERVER_HOST, ), ), ( "--port", dict( metavar="PORT", help="MinKNOW server port, if not specified automatically chosen by the MinKNOW API", default=DEFAULT_SERVER_PORT, ), ), ( "--device", dict( metavar="DEVICE", type=str, help="Name of the sequencing position e.g. MS29042 or X1 etc.", required=True, ), ), ( "--experiment-name", dict( metavar="EXPERIMENT-NAME", type=str, help="Describe the experiment being run, enclose in quotes", required=True, ), ), ( "--unblock-duration", dict( metavar="UNBLOCK-DURATION", type=float, help="Time, in seconds, to apply unblock voltage (default: {})".format( DEFAULT_UNBLOCK ), default=DEFAULT_UNBLOCK, ), ), ( # TODO: Determine if we need a minimum value for throttle which shouldn't be overridden. "--throttle", dict( metavar="THROTTLE", type=float, help="Time interval, in seconds, between requests to the ReadUntilClient (default: {})".format( DEFAULT_THROTTLE ), default=DEFAULT_THROTTLE, ), ), ( "--max-unblock-read-length-seconds", dict( metavar="SECONDS", type=float, help=f"Maximum read length, in seconds, that MinKNOW will attempt to unblock (default: {DEFAULT_MAX_UNBLOCK_READ_LENGTH_SECONDS}).", default=DEFAULT_MAX_UNBLOCK_READ_LENGTH_SECONDS, ), ), ( "--dry-run", dict( action="store_true", help="Run the readfish Until experiment without sending unblock commands", ), ), ( "--wait-for-ready", dict( help="Timeout for the MinKNOW data folder to appear, and the device to report it is ready to start sequencing in seconds. (default: 120s).", required=False, default=120, type=int, ), ), ( "--chemistry", dict( help="**EXPERIMENTAL** Choose between duplex and simplex chemistry mode. duplex_simple accepts a read if the previous channels read was stop receiving," "duplex checks that the previous reads alignment was on the same contig and opposite strand. default: SIMPLEX", required=False, type=str, default=Chemistry.SIMPLEX, choices=[chemistry.value for chemistry in Chemistry], ), ), ) + BASE_ARGS