diff --git a/README.md b/README.md index 52d84fe3..366b8307 100644 --- a/README.md +++ b/README.md @@ -25,6 +25,8 @@ the read in progress and so direct sequencing capacity towards reads of interest **This implementation of readfish requires Guppy version >= 6.0.0 and MinKNOW version core >= 5.0.0 . It will not work on earlier versions.** +**Since MinKNOW version core >=5.9.0 and Dorado server version >=7.3.9, Dorado requires an alternate library, `ont-pybasecall-client-lib`. We have introduced a new`dorado` module to handle this.** + The code here has been tested with Guppy in GPU mode using GridION Mk1 and NVIDIA RTX2080 on live sequencing runs and an NVIDIA GTX1080 using playback @@ -121,9 +123,9 @@ conda env create -f development.yml conda activate readfish_dev ``` -|

‼️ Important!

| -|:---------------------------| -| The listed `ont-pyguppy-client-lib` version will probably not match the version installed on your system. To fix this, Please see this [issue](https://github.com/LooseLab/readfish/issues/221#issuecomment-1381529409) | +|

‼️ Important !!

| +|:------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| MinKNOW is transitioning from Guppy to Dorado. Until MinKNOW version 5.9 both Guppy and Dorado used ont-pyguppy-client-lib.
As of MinKNOW version 5.9 and Dorado server version 7.3.9 and greater Dorado requires an alternate library, `ont-pybasecall-client-lib`.
The listed `ont-pyguppy-client-lib` or `ont-pybasecaller-client-lib` version may not match the version installed on your system. To fix this, Please see this [issue](https://github.com/LooseLab/readfish/issues/221#issuecomment-1381529409), using the appropriate library. | [ONT's Guppy GPU](https://community.nanoporetech.com/downloads) should be installed and running as a server. @@ -333,8 +335,8 @@ Note: The plots here are generated from running readfish unblock-all on an Apple

Testing base-calling and mapping

-To test selective sequencing you must have access to a -[guppy basecall server](https://community.nanoporetech.com/downloads/guppy/release_notes) (>=6.0.0) +To test selective sequencing you must have access to either a +[guppy basecall server](https://community.nanoporetech.com/downloads/guppy/release_notes) (>=6.0.0) or a [dorado basecall server](https://community.nanoporetech.com/downloads/dorado/release_notes). and a readfish TOML configuration file. @@ -348,6 +350,10 @@ NOTE: guppy and dorado are used here interchangeably as the basecall server. Dor ```toml [mapper_settings.mappy-rs] ``` +1. If on MinKNOW core>=5.9.0 and Dorado server version >=7.3.9, edit the `basecaller` section to read: + ```toml + [caller_settings.dorado] + ``` 1. Modify the `fn_idx_in` field in the file to be the full path to a [minimap2](https://github.com/lh3/minimap2) index of the human genome. 1. Modify the `targets` fields for each condition to reflect the naming convention used in your index. This is the sequence name only, up to but not including any whitespace. @@ -553,13 +559,19 @@ And for our Awesome Logo please checkout out [@tim_bassford](https://twitter.com # Changelog +## 2024.2.0 +1. Add a dorado base-caller which addressed issue [#347](https://github.com/LooseLab/readfish/issues/347) - chiefly in Dorado 7.3.9 ONT have moved to `ont-pybasecall-client-lib`, + and connections from `ont_pyguppy_client_lib` raise `Connection error. ... LOAD_CONFIG. Reply: INVALID_PROTOCOL` [(#344)](https://github.com/LooseLab/readfish/pull/344) +1. Adds version checking for MinKNOW and Guppy/Dorado, logs if not compatibile [(#351)](https://github.com/LooseLab/readfish/pull/351) + ## 2024.1.0 1. bug fix type for `--wait-on-ready` type and actual function [(#327)](https://github.com/LooseLab/readfish/pull/327), [(#323)](https://github.com/LooseLab/readfish/pull/323) 1. mutiple suffix `.mmi` support [(#330)](https://github.com/LooseLab/readfish/pull/330) 1. Change the default `unblock_duration` on the `Analysis` class to use `DEFAULT_UNBLOCK` value defined in `_cli_args.py`. Change type on the Argparser for `--unblock-duration` to float. [(#313)](https://github.com/LooseLab/readfish/pull/313) 1. Big dog Duplex feature - adds ability to select duplex reads that cover a target region. See pull request for details [(#324)](https://github.com/LooseLab/readfish/pull/324) + ## 2023.1.1 1. Fix Readme Logo link 🥳 (#296) -1. Fix bug where we had accidentally started requiring barcoded TOMLs to specify a region. Thanks to @jamesemery for catching this. (#299) -1. Correctly handle overriding a decision in internal statistics tracking. (#299) +2. Fix bug where we had accidentally started requiring barcoded TOMLs to specify a region. Thanks to @jamesemery for catching this. (#299) +3. Correctly handle overriding a decision in internal statistics tracking. (#299) diff --git a/docs/_static/example_tomls/barcoded_human.toml b/docs/_static/example_tomls/barcoded_human.toml index 014baee0..20c5d568 100644 --- a/docs/_static/example_tomls/barcoded_human.toml +++ b/docs/_static/example_tomls/barcoded_human.toml @@ -22,9 +22,11 @@ # Basecaller configuration [caller_settings.guppy] # ^^^^^^ - ".guppy" specifies our chosen basecaller -# Guppy base-calling configuration file name +# If using dorado >7.3.9, this should be ".dorado". +# All other parameters are shared between the two basecallers. +# Guppy/Dorado base-calling configuration file name config = "dna_r10.4.1_e8.2_400bps_5khz_fast" -# Address of the guppy basecaller - The default address for guppy is ipc:///tmp/.guppy/5555. +# Address of the guppy/dorado basecaller - The default address for guppy is ipc:///tmp/.guppy/5555. address = "ipc:///tmp/.guppy/5555" # Fastq output for individual reads. This is OPTIONAL - as these files can become quite large. # Remove line to disable. diff --git a/docs/_static/example_tomls/human_bed_file_selection.toml b/docs/_static/example_tomls/human_bed_file_selection.toml index 282af9ad..ebeb3263 100644 --- a/docs/_static/example_tomls/human_bed_file_selection.toml +++ b/docs/_static/example_tomls/human_bed_file_selection.toml @@ -14,9 +14,11 @@ # Basecaller configuration [caller_settings.guppy] # ^^^^^^ - ".guppy" specifies our chosen basecaller -# Guppy base-calling configuration file name +# If using dorado >7.3.9, this should be ".dorado". +# All other parameters are shared between the two basecallers. +# Guppy/Dorado base-calling configuration file name config = "dna_r9.4.1_450bps_fast" -# Address of the guppy basecaller - The default address for guppy is ipc:///tmp/.guppy/5555. +# Address of the guppy/dorado basecaller - The default address for guppy is ipc:///tmp/.guppy/5555. address = "ipc:///tmp/.guppy/5555" # Fastq output for individual reads. This is OPTIONAL - as these files can become quite large. # Remove line to disable. diff --git a/docs/_static/example_tomls/human_chr_depletion.toml b/docs/_static/example_tomls/human_chr_depletion.toml index a241e827..48d78342 100644 --- a/docs/_static/example_tomls/human_chr_depletion.toml +++ b/docs/_static/example_tomls/human_chr_depletion.toml @@ -23,9 +23,11 @@ # Basecaller configuration [caller_settings.guppy] # ^^^^^^ - ".guppy" specifies our chosen basecaller -# Guppy base-calling configuration file name +# If using dorado >7.3.9, this should be ".dorado". +# All other parameters are shared between the two basecallers. +# Guppy/Dorado base-calling configuration file name config = "dna_r9.4.1_450bps_fast" -# Address of the guppy basecaller - The default address for guppy is ipc:///tmp/.guppy/5555. +# Address of the guppy/dorado basecaller - The default address for guppy is ipc:///tmp/.guppy/5555. address = "ipc:///tmp/.guppy/5555" # Fastq output for individual reads. This is OPTIONAL - as these files can become quite large. # Remove line to disable. diff --git a/docs/_static/example_tomls/human_chr_selection.toml b/docs/_static/example_tomls/human_chr_selection.toml index f522b57d..96bc2dab 100644 --- a/docs/_static/example_tomls/human_chr_selection.toml +++ b/docs/_static/example_tomls/human_chr_selection.toml @@ -18,9 +18,11 @@ # Basecaller configuration [caller_settings.guppy] # ^^^^^^ - ".guppy" specifies our chosen basecaller -# Guppy base-calling configuration file name +# If using dorado >7.3.9, this should be ".dorado". +# All other parameters are shared between the two basecallers. +# Guppy/Dorado base-calling configuration file name config = "dna_r9.4.1_450bps_fast" -# Address of the guppy basecaller - The default address for guppy is ipc:///tmp/.guppy/5555. +# Address of the guppy/dorado basecaller - The default address for guppy is ipc:///tmp/.guppy/5555. address = "ipc:///tmp/.guppy/5555" # Fastq output for individual reads. This is OPTIONAL - as these files can become quite large. # Remove line to disable. diff --git a/docs/_static/example_tomls/human_chr_selection_two_regions.toml b/docs/_static/example_tomls/human_chr_selection_two_regions.toml index 09ebd6b9..78a6c1cb 100644 --- a/docs/_static/example_tomls/human_chr_selection_two_regions.toml +++ b/docs/_static/example_tomls/human_chr_selection_two_regions.toml @@ -19,9 +19,11 @@ # Basecaller configuration [caller_settings.guppy] # ^^^^^^ - ".guppy" specifies our chosen basecaller -# Guppy base-calling configuration file name +# If using dorado >7.3.9, this should be ".dorado". +# All other parameters are shared between the two basecallers. +# Guppy/Dorado base-calling configuration file name config = "dna_r9.4.1_450bps_fast" -# Address of the guppy basecaller - The default address for guppy is ipc:///tmp/.guppy/5555. +# Address of the guppy/dorado basecaller - The default address for guppy is ipc:///tmp/.guppy/5555. address = "ipc:///tmp/.guppy/5555" # Fastq output for individual reads. This is OPTIONAL - as these files can become quite large. # Remove line to disable. diff --git a/docs/_static/example_tomls/human_chr_selection_with_control.toml b/docs/_static/example_tomls/human_chr_selection_with_control.toml index ad797fcd..40fd8353 100644 --- a/docs/_static/example_tomls/human_chr_selection_with_control.toml +++ b/docs/_static/example_tomls/human_chr_selection_with_control.toml @@ -21,9 +21,11 @@ # Basecaller configuration [caller_settings.guppy] # ^^^^^^ - ".guppy" specifies our chosen basecaller -# Guppy base-calling configuration file name +# If using dorado >7.3.9, this should be ".dorado". +# All other parameters are shared between the two basecallers. +# Guppy/Dorado base-calling configuration file name config = "dna_r9.4.1_450bps_fast" -# Address of the guppy basecaller - The default address for guppy is ipc:///tmp/.guppy/5555. +# Address of the guppy/dorado basecaller - The default address for guppy is ipc:///tmp/.guppy/5555. address = "ipc:///tmp/.guppy/5555" # Fastq output for individual reads. This is OPTIONAL - as these files can become quite large. # Remove line to disable. diff --git a/docs/_static/example_tomls/human_csv_file_selection.toml b/docs/_static/example_tomls/human_csv_file_selection.toml index 2484d407..11da24fb 100644 --- a/docs/_static/example_tomls/human_csv_file_selection.toml +++ b/docs/_static/example_tomls/human_csv_file_selection.toml @@ -17,9 +17,13 @@ # - https://looselab.github.io/readfish/toml.html. [caller_settings.guppy] -# Caller Configuration for Guppy Basecaller -config = "dna_r9.4.1_450bps_fast" # Specify the basecaller configuration -address = "ipc:///tmp/.guppy/5555" # Address of the guppy basecaller - The default address for guppy is ipc:///tmp/.guppy/5555. +# ^^^^^^ - ".guppy" specifies our chosen basecaller +# If using dorado >7.3.9, this should be ".dorado". +# All other parameters are shared between the two basecallers. +# Guppy/Dorado base-calling configuration file name +config = "dna_r9.4.1_450bps_fast" +# Address of the guppy/dorado basecaller - The default address for guppy is ipc:///tmp/.guppy/5555. +address = "ipc:///tmp/.guppy/5555" debug_log = "live_reads.fq" # Fastq output for individual reads (Optional, delete line to disable) [mapper_settings.mappy] diff --git a/docs/_static/example_tomls/human_minimap2_extra_params.toml b/docs/_static/example_tomls/human_minimap2_extra_params.toml index b495cbef..83ab44bc 100644 --- a/docs/_static/example_tomls/human_minimap2_extra_params.toml +++ b/docs/_static/example_tomls/human_minimap2_extra_params.toml @@ -23,9 +23,11 @@ # Basecaller configuration [caller_settings.guppy] # ^^^^^^ - ".guppy" specifies our chosen basecaller -# Guppy base-calling configuration file name +# If using dorado >7.3.9, this should be ".dorado". +# All other parameters are shared between the two basecallers. +# Guppy/Dorado base-calling configuration file name config = "dna_r10.4.1_e8.2_400bps_5khz_fast" -# Address of the guppy basecaller - The default address for guppy is ipc:///tmp/.guppy/5555. +# Address of the guppy/dorado basecaller - The default address for guppy is ipc:///tmp/.guppy/5555. address = "ipc:///tmp/.guppy/5555" # Fastq output for individual reads. This is OPTIONAL - as these files can become quite large. # Remove line to disable. diff --git a/docs/_static/example_tomls/human_regions_barcoded.toml b/docs/_static/example_tomls/human_regions_barcoded.toml index 7a0e7556..11d65b43 100644 --- a/docs/_static/example_tomls/human_regions_barcoded.toml +++ b/docs/_static/example_tomls/human_regions_barcoded.toml @@ -22,9 +22,11 @@ # Basecaller configuration [caller_settings.guppy] # ^^^^^^ - ".guppy" specifies our chosen basecaller -# Guppy base-calling configuration file name +# If using dorado >7.3.9, this should be ".dorado". +# All other parameters are shared between the two basecallers. +# Guppy/Dorado base-calling configuration file name config = "dna_r10.4.1_e8.2_400bps_5khz_fast" -# Address of the guppy basecaller - The default address for guppy is ipc:///tmp/.guppy/5555. +# Address of the guppy/dorado basecaller - The default address for guppy is ipc:///tmp/.guppy/5555. address = "ipc:///tmp/.guppy/5555" # Fastq output for individual reads. This is OPTIONAL - as these files can become quite large. # Remove line to disable. diff --git a/docs/developers-guide.md b/docs/developers-guide.md index 22c9f43f..a32c64ad 100644 --- a/docs/developers-guide.md +++ b/docs/developers-guide.md @@ -67,7 +67,7 @@ conda env create -f docs/development.yml ## Readfish versioning Readfish uses [calver](https://calver.org/) for versioning. Specifically the format should be -`YYYY.MINOR.MICRO.Modifier`, where `MINOR` is the feature addiiton, `MICRO` is any hotfix/bugfix, and `Modifier` is the modifier (e.g. `rc` for release candidate, `dev` for development, empty for stable). +`YYYY.MINOR.MICRO.Modifier`, where `MINOR` is the feature addition, `MICRO` is any hotfix/bugfix, and `Modifier` is the modifier (e.g. `rc` for release candidate, `dev` for development, empty for stable). ## Changelog diff --git a/pyproject.toml b/pyproject.toml index 6ce56149..cfa247fa 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -54,7 +54,8 @@ dev = ["readfish[all,docs,tests]", "pre-commit"] mappy = ["mappy"] mappy-rs = ["mappy-rs >= 0.0.6"] guppy = ["ont_pyguppy_client_lib"] -all = ["readfish[mappy,mappy-rs,guppy]"] +dorado = ["ont-pybasecall-client-lib"] +all = ["readfish[mappy,mappy-rs,guppy,dorado]"] [project.urls] Documentation = "https://looselab.github.io/readfish" @@ -83,3 +84,10 @@ markers = [ "alignment: marks tests which rely on loading or using Mappy or Mappy-rs aligners, used to test with both. (deselect with '-m \"not slow\", select with '-k alignment')", ] addopts = ["-ra", "--doctest-modules", "--ignore=src/readfish/read_until/base.py"] + +[tool.coverage.report] +omit = [ + "src/readfish/plugins/dorado.py", + "src/readfish/_read_until_client.py", + "src/readfish/plugins/guppy.py", +] diff --git a/src/readfish/__about__.py b/src/readfish/__about__.py index ed4e6b85..a1763d2b 100644 --- a/src/readfish/__about__.py +++ b/src/readfish/__about__.py @@ -1,4 +1,4 @@ """__about__.py Version of the read until software """ -__version__ = "2024.1.0" +__version__ = "2024.2.0" diff --git a/src/readfish/_compatibility.py b/src/readfish/_compatibility.py new file mode 100644 index 00000000..8a44a47f --- /dev/null +++ b/src/readfish/_compatibility.py @@ -0,0 +1,103 @@ +"""_compatibility.py + +Contains utilities for checking readfish compatibility with various versions of MinKNOW. + +Checks ranges of `readfish` against the `MinKNOW` version + +Attributes: + LATEST_TESTED (str): The latest tested version of MinKNOW. + MINKNOW_COMPATIBILITY_RANGE (tuple): The compatibility range of MinKNOW versions for this version of readfish. + DIRECTION (Enum): An enumeration representing upgrade, downgrade, or no change directions. + +""" + +from __future__ import annotations + +from enum import Enum + +from minknow_api.manager import Manager +from packaging.version import parse as parse_version +from packaging.version import Version + +LATEST_TESTED = "5.9.7" + +# The versions of MinKNOW which this version of readfish can connect to +# Format - (lowest minknow version, highest version of minknow supported as an upper bound) +MINKNOW_COMPATIBILITY_RANGE = ( + Version("5.0.0"), + Version(LATEST_TESTED), +) + + +class DIRECTION(Enum): + """ + Represents the direction in which the version of the readfish software should be changed + to be compatible with the tested version of an external tool (likely MinKNOW). + + Attributes: + UPGRADE: Indicates that the readfish software version should be upgraded. + DOWNGRADE: Indicates that the readfish software version should be downgraded. + JUST_RIGHT: Indicates that the readfish software version is already compatible + with the tested version of the external tool. + """ + + UPGRADE = "upgrade" + DOWNGRADE = "downgrade" + JUST_RIGHT = "do nothing" + + +def _get_minknow_version(host: str = "127.0.0.1", port: int = None) -> Version: + """ + Get the version of MinKNOW + + :param host: The host the RPC is listening on, defaults to "127.0.0.1" + :param port: The port the RPC is listening on, defaults to None + + :return: The version of MinKNOW readfish is connected to + """ + manager = Manager(host=host, port=port) + minknow_version = parse_version(manager.core_version) + return minknow_version + + +def check_compatibility( + comparator: Version, + version_range: tuple[Version, Version] = MINKNOW_COMPATIBILITY_RANGE, +) -> DIRECTION: + """ + Check the compatibility of a given software version, between a given range, + inclusive of the right edge. + + :param comparator: Version of the provided software, for example MinKNOW 5.9.7 + :param version_ranges: A tuple of lowest supported version, highest supported version + + :return: A direction variant indicating if this version of readfish needs to be changed. + + Examples: + >>> from packaging.version import Version + >>> check_compatibility(Version("5.9.5"), (Version("5.0.0"), Version("5.9.7"))) + + >>> check_compatibility(Version("5.9.7"), (Version("5.0.0"), Version("5.9.7"))) + + >>> check_compatibility(Version("5.9.8"), (Version("5.0.0"), Version("5.9.7"))) + + >>> check_compatibility(Version("4.9.0"), (Version("5.0.0"), Version("5.9.7"))) + + >>> if (action := check_compatibility(Version("6.0.0"), MINKNOW_COMPATIBILITY_RANGE)) in ( + ... DIRECTION.UPGRADE, + ... DIRECTION.DOWNGRADE, + ... ): + ... action + + """ + ( + lowest_supported_version, + highest_supported_version, + ) = version_range + if comparator < lowest_supported_version: + return DIRECTION.DOWNGRADE + return ( + DIRECTION.JUST_RIGHT + if comparator <= highest_supported_version + else DIRECTION.UPGRADE + ) diff --git a/src/readfish/_config.py b/src/readfish/_config.py index 343eaf56..227daeec 100644 --- a/src/readfish/_config.py +++ b/src/readfish/_config.py @@ -171,6 +171,7 @@ def load_module(self, override=False): """ builtins = { "guppy": "guppy", + "dorado": "dorado", "mappy": "mappy", "mappy_rs": "mappy_rs", "no_op": "_no_op", diff --git a/src/readfish/_utils.py b/src/readfish/_utils.py index 991ac160..458584e9 100644 --- a/src/readfish/_utils.py +++ b/src/readfish/_utils.py @@ -18,6 +18,7 @@ from minknow_api.manager import Manager, FlowCellPosition from minknow_api import Connection + if sys.version_info < (3, 11): from exceptiongroup import BaseExceptionGroup diff --git a/src/readfish/entry_points/stats.py b/src/readfish/entry_points/stats.py index f670c65a..bdbd26df 100644 --- a/src/readfish/entry_points/stats.py +++ b/src/readfish/entry_points/stats.py @@ -73,6 +73,7 @@ readfish stats --toml tests/static/stats_test/yeast_summary_test.toml --fastq-directory tests/static/stats_test/ --html summary_adaptive """ + from __future__ import annotations import argparse from pathlib import Path diff --git a/src/readfish/entry_points/targets.py b/src/readfish/entry_points/targets.py index a8ba1ea8..418ace6e 100644 --- a/src/readfish/entry_points/targets.py +++ b/src/readfish/entry_points/targets.py @@ -99,6 +99,13 @@ from readfish._read_until_client import RUClient from readfish._config import Action, Conf, make_decision, _Condition from readfish._statistics import ReadfishStatistics +from readfish.__about__ import __version__ +from readfish._compatibility import ( + _get_minknow_version, + check_compatibility, + MINKNOW_COMPATIBILITY_RANGE, + DIRECTION, +) from readfish._utils import ( get_device, send_message, @@ -197,16 +204,18 @@ def __init__( self.break_reads_after_seconds = ( self.client.connection.analysis_configuration.get_analysis_configuration().read_detection.break_reads_after_seconds.value ) + self.sample_rate = self.client.connection.device.get_sample_rate().sample_rate self.logger.info("Run Configuration Received") self.logger.info(f"run_id={self.run_information.run_id}") self.logger.info(f"break_reads_after_seconds={self.break_reads_after_seconds}") + self.logger.info(f"sample_rate={self.sample_rate}") # Create our statistics tracker self.loop_statistics = ReadfishStatistics( read_log_name, self.break_reads_after_seconds ) logger.info("Initialising Caller") self.caller: CallerABC = self.conf.caller_settings.load_object( - "Caller", run_information=self.run_information + "Caller", run_information=self.run_information, sample_rate=self.sample_rate ) logger.info("Caller initialised") caller_description = self.caller.describe() @@ -573,6 +582,24 @@ def run( # Setup logger used in this entry point, this one should be passed through logger = logging.getLogger(f"readfish.{args.command}") + # Check MinKNOW version + + minknow_version = _get_minknow_version(host=args.host, port=args.port) + if ( + action := check_compatibility(minknow_version, MINKNOW_COMPATIBILITY_RANGE) + ) in ( + DIRECTION.UPGRADE, + DIRECTION.DOWNGRADE, + ): + lower_bound, upper_bound = MINKNOW_COMPATIBILITY_RANGE + logger.warning( + f"""This readfish version ({__version__}) is tested for compatibility with MinKNOW v{lower_bound} to v{upper_bound}. +This version of minknow is {minknow_version}. +If readfish fails please try to {action.value} readfish. +If there isn't a newer version of readfish and readfish is failing, please open an issue: + https://github.com/LooseLab/readfish/issues""" + ) + # Fetch sequencing device position = get_device(args.device, host=args.host, port=args.port) @@ -604,9 +631,6 @@ def run( # start the client running read_until_client.run( - # TODO: Set correct channel range - # first_channel=186, - # last_channel=187, first_channel=1, last_channel=read_until_client.channel_count, max_unblock_read_length_seconds=args.max_unblock_read_length_seconds, diff --git a/src/readfish/entry_points/unblock_all.py b/src/readfish/entry_points/unblock_all.py index 8fe1eb74..e40e6292 100644 --- a/src/readfish/entry_points/unblock_all.py +++ b/src/readfish/entry_points/unblock_all.py @@ -12,6 +12,7 @@ readfish unblock-all --device X3 --experiment-name "test unblock all" """ + from tempfile import NamedTemporaryFile from readfish._cli_args import DEVICE_BASE_ARGS diff --git a/src/readfish/entry_points/validate.py b/src/readfish/entry_points/validate.py index f187703e..f98cc0ea 100644 --- a/src/readfish/entry_points/validate.py +++ b/src/readfish/entry_points/validate.py @@ -81,7 +81,14 @@ def run(parser, args, extras) -> int: try: _ = conf.caller_settings.load_object("Caller") except Exception as exc: - logger.error("Caller could not be initialised, see below for details") + logger.error("Caller could not be initialised.") + logger.error( + "Possible reasons for this include a mismatch between the ont basecaller client and the versions of guppy or dorado you are connecting to." + ) + logger.error( + "Additional information is available here: https://looselab.github.io/readfish/FAQ.html#connection-error-bad-reply-could-not-interpret-message-from-server-for-request-load-config-reply-invalid-protocol" + ) + logger.error("See below for further details on this specific error.") logger.error(str(exc)) errors += 1 else: diff --git a/src/readfish/plugins/dorado.py b/src/readfish/plugins/dorado.py new file mode 100644 index 00000000..b07e0f3f --- /dev/null +++ b/src/readfish/plugins/dorado.py @@ -0,0 +1,313 @@ +"""Dorado plugin module + +Extension of pyBaseCaller that maintains a connection to the basecaller +""" + +from __future__ import annotations +import logging +import os +import time +from collections import namedtuple +from pathlib import Path +from typing import Iterable, TYPE_CHECKING +from packaging.version import parse as parse_version + +import numpy as np +import numpy.typing as npt +from minknow_api.protocol_pb2 import ProtocolRunInfo +from minknow_api.device_pb2 import GetSampleRateResponse + +try: + from pybasecall_client_lib.helper_functions import package_read + from pybasecall_client_lib.pyclient import PyBasecallClient +except ImportError: + pass + +from readfish._loggers import setup_logger +from readfish.plugins.abc import CallerABC +from readfish.plugins.utils import Result +from readfish._utils import nice_join + + +if TYPE_CHECKING: + import minknow_api + +__all__ = ["Caller"] + +logger = logging.getLogger("RU_basecaller") +CALIBRATION = namedtuple("calibration", "scaling offset") + + +class DefaultDAQValues: + """Provides default calibration values + + Mimics the read_until_api calibration dict value from + https://github.com/nanoporetech/read_until_api/blob/2319bbe/read_until/base.py#L34 + all keys return scaling=1.0 and offset=0.0 + """ + + calibration = CALIBRATION(1.0, 0.0) + + def __getitem__(self, _): + return self.calibration + + +_DefaultDAQValues = DefaultDAQValues() + + +class Caller(CallerABC): + def __init__( + self, + run_information: ProtocolRunInfo = None, + sample_rate: GetSampleRateResponse = None, + debug_log=None, + **kwargs, + ): + self.logger = setup_logger("readfish_dorado_logger", log_file=debug_log) + self.supported_barcode_kits = None + self.supported_basecall_models = None + self.run_information = run_information + if self.run_information: + self.guppy_version = ( + self.run_information.software_versions.guppy_connected_version + ) + + if parse_version(self.guppy_version) >= parse_version("7.3.9"): + logging.info(f"Connected to caller version {self.guppy_version}.") + else: + logging.info( + f"Trying to use minKNOW with a caller version {self.guppy_version}. If this is causing readfish to crash, try using a version of Dorado >= 7.3.9. You should also check for any updates available to readfish." + ) + + # Set our own priority + self.dorado_params = kwargs + self.dorado_params["priority"] = PyBasecallClient.high_priority + # Set our own client name to appear in the dorado server logs + self.dorado_params["client_name"] = "Readfish_connection" + + if sample_rate: + self.sample_rate = float(sample_rate) + else: + self.sample_rate = float(5000) + + self.validate() + self.caller = PyBasecallClient(**self.dorado_params) + self.caller.connect() + + def validate(self) -> None: + """Validate the parameters passed to Dorado to ensure they will initialise py Basecall Client correctly + + Currently checks: + 1. That the socket file exists + 2. That the Socket file has the correct permissions + 3. That the version of py basecall client lib installed matches the system version + + :return: None, if the parameters pass all the checks + + """ + for key in ("address", "config"): + if key not in self.dorado_params: + raise KeyError( + f"Required `caller_settings.dorado` {key} was not found in provided TOML. Please add." + ) + if self.dorado_params["address"].startswith("ipc://"): + # User is attempting to connect to an IPC socket + socket_path = Path(self.dorado_params["address"][6:]) + if not socket_path.exists(): + raise FileNotFoundError( + f"The provided dorado base-caller socket address doesn't appear to exist. Please check your dorado Settings. {self.dorado_params['address']}" + ) + + # check user permissions: + if not os.access(socket_path, os.R_OK): + raise RuntimeError( + f"The user account running readfish doesn't appear to have permissions to read the dorado base-caller socket. Please check permissions on {self.dorado_params['address']}. See https://github.com/LooseLab/readfish/issues/221#issuecomment-1375673490 for more information." + ) + if not os.access(socket_path, os.W_OK): + raise RuntimeError( + f"The user account running readfish doesn't appear to have permissions to write to the dorado base-caller socket. Please check permissions on {self.dorado_params['address']}. See https://github.com/LooseLab/readfish/issues/221#issuecomment-1375673490 for more information." + ) + # If we are connected to a live run, test if the base-caller model is acceptable. + # Connected to a live run via the minknow_api - get supported basecall and barcoding kits from the run info. + # Check them against provided values + if self.run_information is not None: + tags = self.run_information.meta_info.tags + + self.supported_basecall_models = tags[ + "available basecall models" + ].array_value + # Make a CSV str a list of strings, removing quotes and square brackets + if self.supported_basecall_models and isinstance( + self.supported_basecall_models, str + ): + self.supported_basecall_models = ( + tags["available basecall models"] + .array_value[1:-1] + .replace('"', "") + .split(",") + ) + # Faff on with sorting out available barcoding kits + # See https://github.com/nanoporetech/minknow_api/blob/829dbe8ac8e49efdf268d385b50440c52473188b/python/minknow_api/tools/protocols.py#L97C1-L97C7 + self.supported_barcode_kits = tags["barcoding kits"].array_value + # workaround for the set of barcoding kits being returned as a string rather + # that array of strings + if self.supported_barcode_kits and isinstance( + self.supported_barcode_kits, str + ): + self.supported_barcode_kits = ( + tags["barcoding kits"].array_value[1:-1].replace('"', "").split(",") + ) + + if tags["barcoding"].bool_value: + self.supported_barcode_kits.append(tags["kit"].string_value) + # If we are connected to a live run, and have suitable base calling models check the base-caller model is suitable for the flowcell and kit + if ( + self.supported_basecall_models + and f"{self.dorado_params['config'].replace('.cfg', '')}.cfg" + not in self.supported_basecall_models + ): + raise RuntimeError( + """The {} base-calling config listed in the readfish config TOML is not suitable for this flowcell and kit combination. + Please check the dorado value in the caller_settings.dorado section of your TOML file. + The following models are are given by ONT as suitable for this flow cell/kit combo:\n\t{}""".format( + self.dorado_params["config"], + nice_join( + self.supported_basecall_models, + sep="\n\t", + conjunction="and", + ), + ) + ) + + # If we are barcoding and have connected to a live run - try checking the listed barcode kit works with the flowcell and kit + if ( + barcoding_kits := self.dorado_params.get("barcode_kits", None) + ) is not None: + barcoding_kits = barcoding_kits.split() + if barcoding_kits and not set(barcoding_kits).issubset( + self.supported_barcode_kits + ): + raise RuntimeError( + "Barcoding kits specified in TOML {} not amongst those supported by the selected kit and protocol.\nSupported kits are:\n\t{}".format( + nice_join(barcoding_kits, conjunction="and"), + nice_join( + self.supported_barcode_kits, sep="\n\t", conjunction="and" + ), + ), + ) + return None + + def disconnect(self) -> None: + """Call the disconnect method on the PyBasecallClient""" + return self.caller.disconnect() + + def basecall( + self, + reads: Iterable[tuple[int, minknow_api.data_pb2.GetLiveReadsResponse.ReadData]], + signal_dtype: npt.DTypeLike, + daq_values: dict[int, namedtuple] = None, + ): + """Basecall live data from minknow RPC + + :param reads: List or generator of tuples containing (channel, MinKNOW.rpc.Read) + :param signal_dtype: Numpy dtype of the raw data + :param daq_values: Dictionary mapping channel to offset and scaling values. + If not provided default values of 1.0 and 0.0 are used. + :yield: + :rtype: readfish.plugins.utils.Result + """ + # FIXME: Occasionally dorado can report a read as not sent when it is + # successfully sent. Therefore we capture not sent reads + cache, skipped = {}, {} + reads_received, reads_sent = 0, 0 + daq_values = _DefaultDAQValues if daq_values is None else daq_values + for channel, read in reads: + # Attach the "RF-" prefix + read_id = f"RF-{read.id}" + t0 = time.time() + cache[read_id] = (channel, read.number, t0) + success = self.caller.pass_read( + package_read( + read_id=read_id, + raw_data=np.frombuffer(read.raw_data, signal_dtype), + daq_offset=daq_values[channel].offset, + daq_scaling=daq_values[channel].scaling, + sampling_rate=self.sample_rate, + start_time=int(read.start_sample), + ) + ) + if not success: + logging.warning(f"Could not send read {read_id!r} to Dorado") + # FIXME: This is resolved in later versions of dorado. + skipped[read_id] = cache.pop(read_id) + continue + else: + reads_sent += 1 + + sleep_time = self.caller.throttle - t0 + if sleep_time > 0: + time.sleep(sleep_time) + + while reads_received < reads_sent: + results = self.caller.get_completed_reads() + # TODO: incorporate time_received into logging? + # time_received = time.time() + + if not results: + time.sleep(self.caller.throttle) + continue + + for res_batch in results: + for res in res_batch: + read_id = res["metadata"]["read_id"] + ''' + Dorado sometimes returns two sub_tags for a read. + + An example result: + RF-17774e44-8d3c-4bdd-8730-aaf8addd3e6c + {'read_tag': 3605, 'sub_tag': 0, 'priority': , 'metadata': {'adapter_front_begin_index': -1, 'adapter_front_foundseq': 'NA', 'adapter_front_foundseq_length': 2, 'adapter_front_id': 'NA', 'adapter_front_refseq': 'NA', 'adapter_front_score': 0.0, 'adapter_mid_end_index': -1, 'adapter_mid_id': 'NA', 'adapter_mid_score': 0.0, 'adapter_rear_end_index': -1, 'adapter_rear_foundseq': 'NA', 'adapter_rear_foundseq_length': 2, 'adapter_rear_id': 'NA', 'adapter_rear_refseq': 'NA', 'adapter_rear_score': 0.0, 'barcode_arrangement': '', 'barcode_front_begin_index': 0, 'barcode_front_foundseq': 'NA', 'barcode_front_foundseq_length': 2, 'barcode_front_id': 'NA', 'barcode_front_id_inner': 'NA', 'barcode_front_refseq': 'NA', 'barcode_front_score': 0.0, 'barcode_front_score_inner': 0.0, 'barcode_full_arrangement': '', 'barcode_kit': '', 'barcode_mid_front_end_index': 0, 'barcode_mid_front_id': 'NA', 'barcode_mid_front_score': 0.0, 'barcode_mid_rear_end_index': 0, 'barcode_mid_rear_id': 'NA', 'barcode_mid_rear_score': 0.0, 'barcode_rear_end_index': 0, 'barcode_rear_foundseq': 'NA', 'barcode_rear_foundseq_length': 2, 'barcode_rear_id': 'NA', 'barcode_rear_id_inner': 'NA', 'barcode_rear_refseq': 'NA', 'barcode_rear_score': 0.0, 'barcode_rear_score_inner': 0.0, 'barcode_score': 0.0, 'barcode_variant': '', 'basecall_type': 'beam search', 'daq_offset': 0.0, 'daq_scaling': 0.25, 'duration': 8592, 'lamp_barcode_id': 'NA', 'lamp_barcode_score': 0.0, 'lamp_target_id': 'NA', 'lamp_target_score': 0.0, 'mean_qscore': 10.297822952270508, 'med_abs_dev': 0.01067463681101799, 'median': -373.5199890136719, 'model_stride': 6, 'model_version_id': 'dna_r10.4.1_e8.2_400bps_fast@v4.3.0', 'num_events': 1432, 'num_minknow_events': 0, 'primer_front_begin_index': -1, 'primer_front_foundseq': 'NA', 'primer_front_foundseq_length': 2, 'primer_front_id': 'NA', 'primer_front_refseq': 'NA', 'primer_front_score': 0.0, 'primer_rear_end_index': -1, 'primer_rear_foundseq': 'NA', 'primer_rear_foundseq_length': 2, 'primer_rear_id': 'NA', 'primer_rear_refseq': 'NA', 'primer_rear_score': 0.0, 'read_id': 'RF-17774e44-8d3c-4bdd-8730-aaf8addd3e6c', 'sampling_rate': 5000.0, 'scaling_med_abs_dev': 0.01067463681101799, 'scaling_median': -373.5199890136719, 'scaling_version': '', 'sequence_length': 340, 'start_time': 12462912, 'state_size': 0, 'strand_id': '441174ae-e18f-4612-bc46-0c86d301cb4d', 'trim_front': 0, 'trim_rear': 0, 'trimmed_duration': 8592, 'trimmed_events': 1432, 'trimmed_samples': 0}, 'datasets': {'raw_data': array([306, 289, 300, ..., 526, 537, 540], dtype=int16), 'sequence': 'CTACAGTGGTCGTCAATACTATTGCAACTCCAGCCTGGGCAACAGAGTGAGACCCTGTCTCAAAAAAAAACAGAAGGAAGCCAAAGCCCACAAAGACGCTGAGTATTTTACATTCCTTTTTTGTACGAATGCTTCAAAATCTGGTGTGTATCTTACAGTTATAAAATCTCTCAATTTAGCCACCAAATTTTCACCAGAAATGCATGAACTGTGTTCAGATTTCATAAACTTTCAGTTGATAAAGTAGATTCACATACTGAAGGTGTTCCAAACGTACTGGAAGACTTTCTAAAATGGATTTGAACACCAGTTTCCAGGTTTACATTTAAGTTAATTCAAA', 'qstring': '#(&&%(\'\'%&(#"""$\'%%$%$%*,)+()\'(\'\'*+AEHHH.-0410)200BGC4HKJJGGB77H(\'(+,1-(,//:3640==6504C><357>4448FAFCIGI64-/9660=12HISOBGKLA@?1/59EGM>:::DEJSOM1D?>=GI11775:930,;;>H9/7122)*0:**-===>B55878&#+"#&\',,?@EIJBCLSM964\'(376528:5/-*)21\'##+-&$"#%+&#&%\'-./49?B=A960@7;ABB@6CIEFDD>H7)&45:DC5158B'}} + RF-17774e44-8d3c-4bdd-8730-aaf8addd3e6c + {'read_tag': 3605, 'sub_tag': 1, 'priority': , 'metadata': {'adapter_front_begin_index': -1, 'adapter_front_foundseq': 'NA', 'adapter_front_foundseq_length': 2, 'adapter_front_id': 'NA', 'adapter_front_refseq': 'NA', 'adapter_front_score': 0.0, 'adapter_mid_end_index': -1, 'adapter_mid_id': 'NA', 'adapter_mid_score': 0.0, 'adapter_rear_end_index': -1, 'adapter_rear_foundseq': 'NA', 'adapter_rear_foundseq_length': 2, 'adapter_rear_id': 'NA', 'adapter_rear_refseq': 'NA', 'adapter_rear_score': 0.0, 'barcode_arrangement': '', 'barcode_front_begin_index': 0, 'barcode_front_foundseq': 'NA', 'barcode_front_foundseq_length': 2, 'barcode_front_id': 'NA', 'barcode_front_id_inner': 'NA', 'barcode_front_refseq': 'NA', 'barcode_front_score': 0.0, 'barcode_front_score_inner': 0.0, 'barcode_full_arrangement': '', 'barcode_kit': '', 'barcode_mid_front_end_index': 0, 'barcode_mid_front_id': 'NA', 'barcode_mid_front_score': 0.0, 'barcode_mid_rear_end_index': 0, 'barcode_mid_rear_id': 'NA', 'barcode_mid_rear_score': 0.0, 'barcode_rear_end_index': 0, 'barcode_rear_foundseq': 'NA', 'barcode_rear_foundseq_length': 2, 'barcode_rear_id': 'NA', 'barcode_rear_id_inner': 'NA', 'barcode_rear_refseq': 'NA', 'barcode_rear_score': 0.0, 'barcode_rear_score_inner': 0.0, 'barcode_score': 0.0, 'barcode_variant': '', 'basecall_type': 'beam search', 'daq_offset': 0.0, 'daq_scaling': 0.25, 'duration': 321, 'lamp_barcode_id': 'NA', 'lamp_barcode_score': 0.0, 'lamp_target_id': 'NA', 'lamp_target_score': 0.0, 'mean_qscore': 12.145367622375488, 'med_abs_dev': 0.01067463681101799, 'median': -373.5199890136719, 'model_stride': 6, 'model_version_id': 'dna_r10.4.1_e8.2_400bps_fast@v4.3.0', 'num_events': 53, 'num_minknow_events': 0, 'primer_front_begin_index': -1, 'primer_front_foundseq': 'NA', 'primer_front_foundseq_length': 2, 'primer_front_id': 'NA', 'primer_front_refseq': 'NA', 'primer_front_score': 0.0, 'primer_rear_end_index': -1, 'primer_rear_foundseq': 'NA', 'primer_rear_foundseq_length': 2, 'primer_rear_id': 'NA', 'primer_rear_refseq': 'NA', 'primer_rear_score': 0.0, 'read_id': 'RF-17774e44-8d3c-4bdd-8730-aaf8addd3e6c', 'sampling_rate': 5000.0, 'scaling_med_abs_dev': 0.01067463681101799, 'scaling_median': -373.5199890136719, 'scaling_version': '', 'sequence_length': 16, 'start_time': 12477610, 'state_size': 0, 'strand_id': '3b536c09-3f73-4c59-a332-2a0f6cad4ed9', 'trim_front': 0, 'trim_rear': 0, 'trimmed_duration': 321, 'trimmed_events': 53, 'trimmed_samples': 0}, 'datasets': {'raw_data': array([306, 289, 300, ..., 526, 537, 540], dtype=int16), 'sequence': 'TTTTTGTGGGCTTTTA', 'qstring': "21;;B98'-213,*2&"}} + + The second sub_tag will cause the code to gail as it is not expected. + + Therefore we need to check for the sub_tag and if it is not 0, we need to skip the read. + ''' + if res["sub_tag"] > 0: + continue + + try: + channel, read_number, time_sent = cache.pop(read_id) + except KeyError: + channel, read_number, time_sent = skipped.pop(read_id) + reads_sent += 1 + res["metadata"]["read_id"] = read_id[3:] + self.logger.debug( + "@%s ch=%s\n%s\n+\n%s", + res["metadata"]["read_id"], + channel, + res["datasets"]["sequence"], + res["datasets"]["qstring"], + ) + barcode = res["metadata"].get("barcode_arrangement", None) + # TODO: Add Filter here + yield Result( + channel=channel, + read_number=read_number, + read_id=res["metadata"]["read_id"], + seq=res["datasets"]["sequence"], + barcode=barcode if barcode else None, + basecall_data=res, + ) + reads_received += 1 + + def describe(self) -> str: + """ + Describe the Dorado Caller + + :return: Description of parameters passed to this Dorado Caller plugin + """ + description = ["Utilising the Dorado base-caller plugin:"] + for param in self.dorado_params.keys(): + description.append(f"\t- {param}: {self.dorado_params[param]}") + return "\n".join(description) diff --git a/src/readfish/plugins/guppy.py b/src/readfish/plugins/guppy.py index a2b7d9ec..4432cc0d 100644 --- a/src/readfish/plugins/guppy.py +++ b/src/readfish/plugins/guppy.py @@ -2,6 +2,7 @@ Extension of pyguppy Caller that maintains a connection to the basecaller """ + from __future__ import annotations import logging import os @@ -9,12 +10,17 @@ from collections import namedtuple from pathlib import Path from typing import Iterable, TYPE_CHECKING +from packaging.version import parse as parse_version import numpy as np import numpy.typing as npt from minknow_api.protocol_pb2 import ProtocolRunInfo -from pyguppy_client_lib.helper_functions import package_read -from pyguppy_client_lib.pyclient import PyGuppyClient + +try: + from pyguppy_client_lib.helper_functions import package_read + from pyguppy_client_lib.pyclient import PyGuppyClient +except ImportError: + pass from readfish._loggers import setup_logger from readfish.plugins.abc import CallerABC @@ -56,9 +62,26 @@ def __init__( self.supported_barcode_kits = None self.supported_basecall_models = None self.run_information = run_information + logging.warn( + "Deprecation warning - As ONT has moved fully to dorado, this plugin is no longer maintained, and will be deprecated in a future release of readfish." + ) + if self.run_information: + self.guppy_version = ( + self.run_information.software_versions.guppy_connected_version + ) + + if parse_version(self.guppy_version) < parse_version("7.3.9"): + logging.info(f"Connected to caller version {self.guppy_version}.") + else: + logging.info( + f"Trying to connect to minKNOW with caller version {self.guppy_version}. This plugin requires a version of Dorado or Guppy < 7.3.9. If this is stopping readfish from running try changing [caller_settings.guppy] to [caller_settings.dorado]. You should also check for any updates available to readfish." + ) # Set our own priority self.guppy_params = kwargs + + # Remove the sample rate from the guppy params as it isn't required for the PyGuppyClient + self.guppy_params.pop("sample_rate", None) self.guppy_params["priority"] = PyGuppyClient.high_priority # Set our own client name to appear in the guppy server logs self.guppy_params["client_name"] = "Readfish_connection" diff --git a/tests/static/guppy_validation_test/fail/001_no_write_socket.toml b/tests/static/guppy_validation_test/fail/001_no_write_socket.toml index b33b165c..4cf888dd 100644 --- a/tests/static/guppy_validation_test/fail/001_no_write_socket.toml +++ b/tests/static/guppy_validation_test/fail/001_no_write_socket.toml @@ -1,4 +1,4 @@ -[caller_settings.guppy] +[caller_settings.dorado] address = "ipc://tests/static/guppy_validation_test/fail/5555_fail_nw" config = "dna_r10.4.1_e8.2_400bps_hac" diff --git a/tests/static/guppy_validation_test/fail/001_no_write_socket.txt b/tests/static/guppy_validation_test/fail/001_no_write_socket.txt index 2f5da30b..64365174 100644 --- a/tests/static/guppy_validation_test/fail/001_no_write_socket.txt +++ b/tests/static/guppy_validation_test/fail/001_no_write_socket.txt @@ -1 +1 @@ -The user account running readfish doesn't appear to have permissions to write to the guppy base-caller socket. Please check permissions on ipc://tests/static/guppy_validation_test/fail/5555_fail_nw. See https://github.com/LooseLab/readfish/issues/221#issuecomment-1375673490 for more information. +The user account running readfish doesn't appear to have permissions to write to the dorado base-caller socket. Please check permissions on ipc://tests/static/guppy_validation_test/fail/5555_fail_nw. See https://github.com/LooseLab/readfish/issues/221#issuecomment-1375673490 for more information. diff --git a/tests/static/guppy_validation_test/fail/002_missing_socket.toml b/tests/static/guppy_validation_test/fail/002_missing_socket.toml index 82dedf57..e21c05f1 100644 --- a/tests/static/guppy_validation_test/fail/002_missing_socket.toml +++ b/tests/static/guppy_validation_test/fail/002_missing_socket.toml @@ -1,4 +1,4 @@ -[caller_settings.guppy] +[caller_settings.dorado] address = "ipc://tests/static/guppy_validation_test/fail/5555_not_there" config = "dna_r10.4.1_e8.2_400bps_hac" diff --git a/tests/static/guppy_validation_test/fail/002_missing_socket.txt b/tests/static/guppy_validation_test/fail/002_missing_socket.txt index 96da59b3..81f5fd7c 100644 --- a/tests/static/guppy_validation_test/fail/002_missing_socket.txt +++ b/tests/static/guppy_validation_test/fail/002_missing_socket.txt @@ -1 +1 @@ -The provided guppy base-caller socket address doesn't appear to exist. Please check your Guppy Settings. ipc://tests/static/guppy_validation_test/fail/5555_not_there +The provided dorado base-caller socket address doesn't appear to exist. Please check your dorado Settings. ipc://tests/static/guppy_validation_test/fail/5555_not_there diff --git a/tests/static/guppy_validation_test/fail/003_no_read_socket.toml b/tests/static/guppy_validation_test/fail/003_no_read_socket.toml index 8670a5cd..c7eaf018 100644 --- a/tests/static/guppy_validation_test/fail/003_no_read_socket.toml +++ b/tests/static/guppy_validation_test/fail/003_no_read_socket.toml @@ -1,4 +1,4 @@ -[caller_settings.guppy] +[caller_settings.dorado] address = "ipc://tests/static/guppy_validation_test/fail/5555_fail_nr" config = "dna_r10.4.1_e8.2_400bps_hac" diff --git a/tests/static/guppy_validation_test/fail/003_no_read_socket.txt b/tests/static/guppy_validation_test/fail/003_no_read_socket.txt index 46973458..5456737d 100644 --- a/tests/static/guppy_validation_test/fail/003_no_read_socket.txt +++ b/tests/static/guppy_validation_test/fail/003_no_read_socket.txt @@ -1 +1 @@ -The user account running readfish doesn't appear to have permissions to read the guppy base-caller socket. Please check permissions on ipc://tests/static/guppy_validation_test/fail/5555_fail_nr. See https://github.com/LooseLab/readfish/issues/221#issuecomment-1375673490 for more information. +The user account running readfish doesn't appear to have permissions to read the dorado base-caller socket. Please check permissions on ipc://tests/static/guppy_validation_test/fail/5555_fail_nr. See https://github.com/LooseLab/readfish/issues/221#issuecomment-1375673490 for more information. diff --git a/tests/static/toml_validation_test/fail/001_missing_keys.toml b/tests/static/toml_validation_test/fail/001_missing_keys.toml index 7e17a32e..8a5bde1f 100644 --- a/tests/static/toml_validation_test/fail/001_missing_keys.toml +++ b/tests/static/toml_validation_test/fail/001_missing_keys.toml @@ -1,4 +1,4 @@ -[caller_settings.guppy] +[caller_settings.dorado] host = "127.0.0.1" [mapper_settings.mappy]