template updates

This commit is contained in:
Sarah Griffiths 2023-05-09 10:09:33 +00:00
parent 85e85409ef
commit 5df7e3c2cd
4 changed files with 123 additions and 158 deletions

View File

@ -4,27 +4,31 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [unreleased]
### Changed
- LICENSE to Oxford Nanopore Technologies PLC. Public License Version 1.0.
## [v0.1.10] ## [v0.1.10]
### Updated ### Changed
- Condition sheet parameter description fixed to CSV - Condition sheet parameter description fixed to CSV
- Update fastqingress - Update fastqingress
## [v0.1.9] ## [v0.1.9]
### Updated ### Changed
- Simplify JAFFAL docs - Simplify JAFFAL docs
## [v0.1.8] ## [v0.1.8]
### Changed ### Changed
- Updated description in manifest - Description in manifest
## [v0.1.7] ## [v0.1.7]
### Updated ### Changed
- `-profile conda` is no longer supported, users should use `-profile standard` (Docker) or `-profile singularity` instead - `-profile conda` is no longer supported, users should use `-profile standard` (Docker) or `-profile singularity` instead
- `nextflow run epi2me-labs/wf-transcriptomes --version` will now print the workflow version number and exit - `nextflow run epi2me-labs/wf-transcriptomes --version` will now print the workflow version number and exit
- Use parameter `--transcriptome-source` to define precalculated, reference-based or denovo - Use parameter `--transcriptome-source` to define precalculated, reference-based or denovo
## [v0.1.6] ## [v0.1.6]
### Updated ### Changed
- Removed sanitize option - Removed sanitize option
- Reduce size of differential expression data. - Reduce size of differential expression data.
### Added ### Added

198
LICENSE
View File

@ -1,12 +1,5 @@
This Source Code Form is subject to the terms of the Mozilla Public Oxford Nanopore Technologies PLC. Public License Version 1.0
License, v. 2.0. If a copy of the MPL was not distributed with this =============================================================
file, You can obtain one at http://mozilla.org/MPL/2.0/.
(c) 2021- Oxford Nanopore Technologies Ltd.
Mozilla Public License Version 2.0
==================================
1. Definitions 1. Definitions
-------------- --------------
@ -17,7 +10,7 @@ Mozilla Public License Version 2.0
1.2. "Contributor Version" 1.2. "Contributor Version"
means the combination of the Contributions of others (if any) used means the combination of the Contributions of others (if any) used
by a Contributor and that particular Contributor's Contribution. by a Contributor and that particular Contributors Contribution.
1.3. "Contribution" 1.3. "Contribution"
means Covered Software of a particular Contributor. means Covered Software of a particular Contributor.
@ -28,59 +21,46 @@ Mozilla Public License Version 2.0
Form, and Modifications of such Source Code Form, in each case Form, and Modifications of such Source Code Form, in each case
including portions thereof. including portions thereof.
1.5. "Incompatible With Secondary Licenses" 1.5. "Executable Form"
means
(a) that the initial Contributor has attached the notice described
in Exhibit B to the Covered Software; or
(b) that the Covered Software was made available under the terms of
version 1.1 or earlier of the License, but not also under the
terms of a Secondary License.
1.6. "Executable Form"
means any form of the work other than Source Code Form. means any form of the work other than Source Code Form.
1.7. "Larger Work" 1.6. "Larger Work"
means a work that combines Covered Software with other material, in means a work that combines Covered Software with other material, in
a separate file or files, that is not Covered Software. a separate file or files, that is not Covered Software.
1.8. "License" 1.7. "License"
means this document. means this document.
1.9. "Licensable" 1.8. "Licensable"
means having the right to grant, to the maximum extent possible, means having the right to grant, to the maximum extent possible,
whether at the time of the initial grant or subsequently, any and whether at the time of the initial grant or subsequently, any and
all of the rights conveyed by this License. all of the rights conveyed by this License.
1.10. "Modifications" 1.9. "Modifications"
means any of the following: means any of the following:
(a) any file in Source Code Form that results from an addition to, (a) any file in Source Code Form that results from an addition to,
deletion from, or modification of the contents of Covered deletion from, or modification of the contents of Covered
Software; or Software; or
(b) any new file in Source Code Form that contains any Covered
Software.
(b) any new file in Source Code Form that contains any Covered 1.10. "Research Purposes"
Software. means use for internal research and not intended for or directed
towards commercial advantages or monetary compensation; provided,
however, that monetary compensation does not include sponsored
research of research funded by grants.
1.11. "Patent Claims" of a Contributor 1.11 "Secondary License"
means any patent claim(s), including without limitation, method,
process, and apparatus claims, in any patent Licensable by such
Contributor that would be infringed, but for the grant of the
License, by the making, using, selling, offering for sale, having
made, import, or transfer of either its Contributions or its
Contributor Version.
1.12. "Secondary License"
means either the GNU General Public License, Version 2.0, the GNU means either the GNU General Public License, Version 2.0, the GNU
Lesser General Public License, Version 2.1, the GNU Affero General Lesser General Public License, Version 2.1, the GNU Affero General
Public License, Version 3.0, or any later versions of those Public License, Version 3.0, or any later versions of those
licenses. licenses.
1.13. "Source Code Form" 1.12. "Source Code Form"
means the form of the work preferred for making modifications. means the form of the work preferred for making modifications.
1.14. "You" (or "Your") 1.13. "You" (or "Your")
means an individual or a legal entity exercising rights under this means an individual or a legal entity exercising rights under this
License. For legal entities, "You" includes any entity that License. For legal entities, "You" includes any entity that
controls, is controlled by, or is under common control with You. For controls, is controlled by, or is under common control with You. For
@ -96,53 +76,47 @@ Mozilla Public License Version 2.0
2.1. Grants 2.1. Grants
Each Contributor hereby grants You a world-wide, royalty-free, Each Contributor hereby grants You a world-wide, royalty-free,
non-exclusive license: non-exclusive license under Contributor copyrights Licensable by such
Contributor to use, reproduce, make available, modify, display,
(a) under intellectual property rights (other than patent or trademark) perform, distribute, and otherwise exploit solely for Research Purposes
Licensable by such Contributor to use, reproduce, make available, its Contributions, either on an unmodified basis, with Modifications,
modify, display, perform, distribute, and otherwise exploit its or as part of a Larger Work.
Contributions, either on an unmodified basis, with Modifications, or
as part of a Larger Work; and
(b) under Patent Claims of such Contributor to make, use, sell, offer
for sale, have made, import, and otherwise transfer either its
Contributions or its Contributor Version.
2.2. Effective Date 2.2. Effective Date
The licenses granted in Section 2.1 with respect to any Contribution The licenses granted in Section 2.1 with respect to any Contribution
become effective for each Contribution on the date the Contributor first become effective for each Contribution on the date the Contributor
distributes such Contribution. first distributes such Contribution.
2.3. Limitations on Grant Scope 2.3. Limitations on Grant Scope
The licenses granted in this Section 2 are the only rights granted under The licenses granted in this Section 2 are the only rights granted under
this License. No additional rights or licenses will be implied from the this License. No additional rights or licenses will be implied from the
distribution or licensing of Covered Software under this License. distribution or licensing of Covered Software under this License. The
Notwithstanding Section 2.1(b) above, no patent license is granted by a License is incompatible with Secondary Licenses. Notwithstanding
Contributor: Section 2.1 above, no copyright license is granted:
(a) for any code that a Contributor has removed from Covered Software; (a) for any code that a Contributor has removed from Covered Software;
or or
(b) for infringements caused by: (i) Your and any other third party's (b) use of the Contributions or its Contributor Version other than for
modifications of Covered Software, or (ii) the combination of its Research Purposes only; or
Contributions with other software (except as part of its Contributor
Version); or
(c) under Patent Claims infringed by Covered Software in the absence of (c) for infringements caused by: (i) Your and any other third partys
its Contributions. modifications of Covered Software, or (ii) the combination of its
Contributions with other software (except as part of its Contributor
Version).
This License does not grant any rights in the trademarks, service marks, This License does not grant any rights in the patents, trademarks,
or logos of any Contributor (except as may be necessary to comply with service marks, or logos of any Contributor (except as may be necessary
the notice requirements in Section 3.4). to comply with the notice requirements in Section 3.4).
2.4. Subsequent Licenses 2.4. Subsequent Licenses
No Contributor makes additional grants as a result of Your choice to No Contributor makes additional grants as a result of Your choice to
distribute the Covered Software under a subsequent version of this distribute the Covered Software under a subsequent version of this
License (see Section 10.2) or under the terms of a Secondary License (if License (see Section 10.2) or under the terms of a Secondary License
permitted under the terms of Section 3.3). (if permitted under the terms of Section 3.3).
2.5. Representation 2.5. Representation
@ -171,8 +145,7 @@ Modifications that You create or to which You contribute, must be under
the terms of this License. You must inform recipients that the Source the terms of this License. You must inform recipients that the Source
Code Form of the Covered Software is governed by the terms of this Code Form of the Covered Software is governed by the terms of this
License, and how they can obtain a copy of this License. You may not License, and how they can obtain a copy of this License. You may not
attempt to alter or restrict the recipients' rights in the Source Code attempt to alter or restrict the recipients rights in the Source Code Form.
Form.
3.2. Distribution of Executable Form 3.2. Distribution of Executable Form
@ -185,22 +158,14 @@ If You distribute Covered Software in Executable Form then:
than the cost of distribution to the recipient; and than the cost of distribution to the recipient; and
(b) You may distribute such Executable Form under the terms of this (b) You may distribute such Executable Form under the terms of this
License, or sublicense it under different terms, provided that the License.
license for the Executable Form does not attempt to limit or alter
the recipients' rights in the Source Code Form under this License.
3.3. Distribution of a Larger Work 3.3. Distribution of a Larger Work
You may create and distribute a Larger Work under terms of Your choice, You may create and distribute a Larger Work under terms of Your choice,
provided that You also comply with the requirements of this License for provided that You also comply with the requirements of this License for
the Covered Software. If the Larger Work is a combination of Covered the Covered Software. The Larger Work may not be a combination of Covered
Software with a work governed by one or more Secondary Licenses, and the Software with a work governed by one or more Secondary Licenses.
Covered Software is not Incompatible With Secondary Licenses, this
License permits You to additionally distribute such Covered Software
under the terms of such Secondary License(s), so that the recipient of
the Larger Work may, at their option, further distribute the Covered
Software under the terms of either this License or such Secondary
License(s).
3.4. Notices 3.4. Notices
@ -212,16 +177,15 @@ the extent required to remedy known factual inaccuracies.
3.5. Application of Additional Terms 3.5. Application of Additional Terms
You may choose to offer, and to charge a fee for, warranty, support, You may not choose to offer, or charge a fee for use of the Covered
indemnity or liability obligations to one or more recipients of Covered Software or a fee for, warranty, support, indemnity or liability
Software. However, You may do so only on Your own behalf, and not on obligations to one or more recipients of Covered Software. You must
behalf of any Contributor. You must make it absolutely clear that any make it absolutely clear that any such warranty, support, indemnity, or
such warranty, support, indemnity, or liability obligation is offered by liability obligation is offered by You alone, and You hereby agree to
You alone, and You hereby agree to indemnify every Contributor for any indemnify every Contributor for any liability incurred by such
liability incurred by such Contributor as a result of warranty, support, Contributor as a result of warranty, support, indemnity or liability
indemnity or liability terms You offer. You may include additional terms You offer. You may include additional disclaimers of warranty and
disclaimers of warranty and limitations of liability specific to any limitations of liability specific to any jurisdiction.
jurisdiction.
4. Inability to Comply Due to Statute or Regulation 4. Inability to Comply Due to Statute or Regulation
--------------------------------------------------- ---------------------------------------------------
@ -240,23 +204,12 @@ recipient of ordinary skill to be able to understand it.
-------------- --------------
5.1. The rights granted under this License will terminate automatically 5.1. The rights granted under this License will terminate automatically
if You fail to comply with any of its terms. However, if You become if You fail to comply with any of its terms.
compliant, then the rights granted under this License from a particular
Contributor are reinstated (a) provisionally, unless and until such
Contributor explicitly and finally terminates Your grants, and (b) on an
ongoing basis, if such Contributor fails to notify You of the
non-compliance by some reasonable means prior to 60 days after You have
come back into compliance. Moreover, Your grants from a particular
Contributor are reinstated on an ongoing basis if such Contributor
notifies You of the non-compliance by some reasonable means, this is the
first time You have received notice of non-compliance with this License
from such Contributor, and You become compliant prior to 30 days after
Your receipt of the notice.
5.2. If You initiate litigation against any entity by asserting a patent 5.2. If You initiate litigation against any entity by asserting an
infringement claim (excluding declaratory judgment actions, infringement claim (excluding declaratory judgment actions,
counter-claims, and cross-claims) alleging that a Contributor Version counter-claims, and cross-claims) alleging that a Contributor Version
directly or indirectly infringes any patent, then the rights granted to directly or indirectly infringes, then the rights granted to
You by any and all Contributors for the Covered Software under Section You by any and all Contributors for the Covered Software under Section
2.1 of this License shall terminate. 2.1 of this License shall terminate.
@ -299,8 +252,10 @@ prior to termination shall survive termination.
* and all other commercial damages or losses, even if such party * * and all other commercial damages or losses, even if such party *
* shall have been informed of the possibility of such damages. This * * shall have been informed of the possibility of such damages. This *
* limitation of liability shall not apply to liability for death or * * limitation of liability shall not apply to liability for death or *
* personal injury resulting from such party's negligence to the * * personal injury resulting from such partys negligence to the *
* extent applicable law prohibits such limitation. Some * * extent applicable law prohibits such limitation, but in such event, *
* and to the greatest extent permissible, damages will be limited to *
* direct damages not to exceed one hundred dollars. Some *
* jurisdictions do not allow the exclusion or limitation of * * jurisdictions do not allow the exclusion or limitation of *
* incidental or consequential damages, so this exclusion and * * incidental or consequential damages, so this exclusion and *
* limitation may not apply to You. * * limitation may not apply to You. *
@ -314,7 +269,7 @@ Any litigation relating to this License may be brought only in the
courts of a jurisdiction where the defendant maintains its principal courts of a jurisdiction where the defendant maintains its principal
place of business and such litigation shall be governed by laws of that place of business and such litigation shall be governed by laws of that
jurisdiction, without reference to its conflict-of-law provisions. jurisdiction, without reference to its conflict-of-law provisions.
Nothing in this Section shall prevent a party's ability to bring Nothing in this Section shall prevent a partys ability to bring
cross-claims or counter-claims. cross-claims or counter-claims.
9. Miscellaneous 9. Miscellaneous
@ -332,10 +287,10 @@ shall not be used to construe this License against a Contributor.
10.1. New Versions 10.1. New Versions
Mozilla Foundation is the license steward. Except as provided in Section Oxford Nanopore Technologies PLC. is the license steward. Except as
10.3, no one other than the license steward has the right to modify or provided in Section 10.3, no one other than the license steward has the
publish new versions of this License. Each version will be given a right to modify or publish new versions of this License. Each version
distinguishing version number. will be given a distinguishing version number.
10.2. Effect of New Versions 10.2. Effect of New Versions
@ -352,19 +307,12 @@ modified version of this License if you rename the license and remove
any references to the name of the license steward (except to note that any references to the name of the license steward (except to note that
such modified license differs from this License). such modified license differs from this License).
10.4. Distributing Source Code Form that is Incompatible With Secondary
Licenses
If You choose to distribute Source Code Form that is Incompatible With
Secondary Licenses under the terms of this version of the License, the
notice described in Exhibit B of this License must be attached.
Exhibit A - Source Code Form License Notice Exhibit A - Source Code Form License Notice
------------------------------------------- -------------------------------------------
This Source Code Form is subject to the terms of the Mozilla Public This Source Code Form is subject to the terms of the Oxford Nanopore
License, v. 2.0. If a copy of the MPL was not distributed with this Technologies PLC. Public License, v. 1.0. Full licence can be found
file, You can obtain one at http://mozilla.org/MPL/2.0/. obtained from support@nanoporetech.com
If it is not possible or desirable to put the notice in a particular If it is not possible or desirable to put the notice in a particular
file, then You may include the notice in a location (such as a LICENSE file, then You may include the notice in a location (such as a LICENSE
@ -372,9 +320,3 @@ file in a relevant directory) where a recipient would be likely to look
for such a notice. for such a notice.
You may add additional accurate notices of copyright ownership. You may add additional accurate notices of copyright ownership.
Exhibit B - "Incompatible With Secondary Licenses" Notice
---------------------------------------------------------
This Source Code Form is "Incompatible With Secondary Licenses", as
defined by the Mozilla Public License, v. 2.0.

View File

@ -11,7 +11,10 @@ def main(args):
barcodes = [] barcodes = []
aliases = [] aliases = []
types = [] sample_types = []
allowed_sample_types = [
"test_sample", "positive_control", "negative_control", "no_template_control"
]
try: try:
with open(args.sample_sheet, "r") as f: with open(args.sample_sheet, "r") as f:
@ -31,45 +34,48 @@ def main(args):
barcodes.append(row["barcode"]) barcodes.append(row["barcode"])
except KeyError: except KeyError:
sys.stdout.write("'barcode' column missing") sys.stdout.write("'barcode' column missing")
exit() sys.exit()
try: try:
aliases.append(row["alias"]) aliases.append(row["alias"])
except KeyError: except KeyError:
sys.stdout.write("'alias' column missing") sys.stdout.write("'alias' column missing")
exit() sys.exit()
try: try:
types.append(row["type"]) sample_types.append(row["type"])
except KeyError: except KeyError:
pass pass
except Exception as e: except Exception as e:
sys.stdout.write(f"Parsing error: {e}") sys.stdout.write(f"Parsing error: {e}")
exit() sys.exit()
# check barcode and alias values are unique # check barcode and alias values are unique
if len(barcodes) > len(set(barcodes)): if len(barcodes) > len(set(barcodes)):
sys.stdout.write("values in 'barcode' column not unique") sys.stdout.write("values in 'barcode' column not unique")
exit() sys.exit()
if len(aliases) > len(set(aliases)): if len(aliases) > len(set(aliases)):
sys.stdout.write("values in 'alias' column not unique") sys.stdout.write("values in 'alias' column not unique")
exit() sys.exit()
if types: if sample_types:
# check if "type" column has unexpected values # check if "type" column has unexpected values
unexp_type_vals = set(types) - set( unexp_type_vals = set(sample_types) - set(allowed_sample_types)
[
"test_sample",
"positive_control",
"negative_control",
"no_template_control",
]
)
if unexp_type_vals: if unexp_type_vals:
sys.stdout.write( sys.stdout.write(
f"found unexpected values in 'type' column: {unexp_type_vals}. " f"found unexpected values in 'type' column: {unexp_type_vals}. "
"allowed values are: `['test_sample', 'positive_control', " f"Allowed values are: {allowed_sample_types}"
"'negative_control', 'no_template_control']`"
) )
exit() sys.exit()
if args.required_sample_types:
for required_type in args.required_sample_types:
if required_type not in allowed_sample_types:
sys.stdout.write(f"Not an allowed sample type: {required_type}")
sys.exit()
if sample_types.count(required_type) < 1:
sys.stdout.write(
f"Sample sheet requires at least 1 of {required_type}")
sys.exit()
logger.info(f"Checked sample sheet {args.sample_sheet}.") logger.info(f"Checked sample sheet {args.sample_sheet}.")
@ -78,4 +84,10 @@ def argparser():
"""Argument parser for entrypoint.""" """Argument parser for entrypoint."""
parser = wf_parser("check_sample_sheet") parser = wf_parser("check_sample_sheet")
parser.add_argument("sample_sheet", help="Sample sheet to check") parser.add_argument("sample_sheet", help="Sample sheet to check")
parser.add_argument(
"--required_sample_types",
help="List of required sample types. Each sample type provided must "
"appear at least once in the sample sheet",
nargs="*"
)
return parser return parser

View File

@ -149,7 +149,7 @@ def watch_path(Map margs) {
// add metadata from sample sheet (we can't use join here since it does not work // add metadata from sample sheet (we can't use join here since it does not work
// with repeated keys; we therefore need to transform the sample sheet data into // with repeated keys; we therefore need to transform the sample sheet data into
// a map with the barcodes as keys) // a map with the barcodes as keys)
def ch_sample_sheet = get_sample_sheet(file(margs.sample_sheet)) def ch_sample_sheet = get_sample_sheet(file(margs.sample_sheet), margs.required_sample_types)
| collect | collect
| map { it.collectEntries { [(it["barcode"]): it] } } | map { it.collectEntries { [(it["barcode"]): it] } }
// now we can use this channel to annotate all files with the corresponding info // now we can use this channel to annotate all files with the corresponding info
@ -247,6 +247,7 @@ Map parse_arguments(Map arguments) {
"analyse_unclassified": false, "analyse_unclassified": false,
"fastcat_stats": false, "fastcat_stats": false,
"fastcat_extra_args": "", "fastcat_extra_args": "",
"required_sample_types": [],
"watch_path": false], "watch_path": false],
name: "fastq_ingress") name: "fastq_ingress")
return parser.parse_args(arguments) return parser.parse_args(arguments)
@ -319,7 +320,7 @@ def get_valid_inputs(Map margs){
// filter based on sample sheet in case one was provided // filter based on sample sheet in case one was provided
if (margs.sample_sheet) { if (margs.sample_sheet) {
// get channel of entries in the sample sheet // get channel of entries in the sample sheet
def ch_sample_sheet = get_sample_sheet(file(margs.sample_sheet)) def ch_sample_sheet = get_sample_sheet(file(margs.sample_sheet), margs.required_sample_types)
// get the union of both channels (missing values will be replaced with // get the union of both channels (missing values will be replaced with
// `null`) // `null`)
def ch_union = Channel.fromPath(sub_dirs_with_fastq_files).map { def ch_union = Channel.fromPath(sub_dirs_with_fastq_files).map {
@ -396,7 +397,7 @@ ArrayList get_fq_files_in_dir(Path dir) {
* @param sample_sheet: path to the sample sheet CSV * @param sample_sheet: path to the sample sheet CSV
* @return: channel of maps (with values in sample sheet header as keys) * @return: channel of maps (with values in sample sheet header as keys)
*/ */
def get_sample_sheet(Path sample_sheet) { def get_sample_sheet(Path sample_sheet, ArrayList required_sample_types) {
// If `validate_sample_sheet` does not return an error message, we can assume that // If `validate_sample_sheet` does not return an error message, we can assume that
// the sample sheet is valid and parse it. However, because of Nextflow's // the sample sheet is valid and parse it. However, because of Nextflow's
// asynchronous magic, we might emit values from `.splitCSV()` before the // asynchronous magic, we might emit values from `.splitCSV()` before the
@ -405,7 +406,7 @@ def get_sample_sheet(Path sample_sheet) {
// in STDOUT. Thus, we use the somewhat clunky construct with `concat` and `last` // in STDOUT. Thus, we use the somewhat clunky construct with `concat` and `last`
// below. This lets the CSV channel only start to emit once the error checking is // below. This lets the CSV channel only start to emit once the error checking is
// done. // done.
ch_err = validate_sample_sheet(sample_sheet).map { ch_err = validate_sample_sheet(sample_sheet, required_sample_types).map {
// check if there was an error message // check if there was an error message
if (it) error "Invalid sample sheet: ${it}." if (it) error "Invalid sample sheet: ${it}."
it it
@ -425,13 +426,19 @@ def get_sample_sheet(Path sample_sheet) {
* message is emitted. * message is emitted.
* *
* @param: path to sample sheet CSV * @param: path to sample sheet CSV
* @param: list of required sample types (optional)
* @return: string (optional) * @return: string (optional)
*/ */
process validate_sample_sheet { process validate_sample_sheet {
label params.process_label label params.process_label
input: path csv input:
path csv
val required_sample_types
output: stdout output: stdout
script:
String req_types_arg = required_sample_types ? "--required_sample_types "+required_sample_types.join(" ") : ""
""" """
workflow-glue check_sample_sheet $csv workflow-glue check_sample_sheet $csv $req_types_arg
""" """
} }