diff --git a/CHANGELOG.md b/CHANGELOG.md index 61e336b..aed31d1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -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/), 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] -### Updated +### Changed - Condition sheet parameter description fixed to CSV - Update fastqingress ## [v0.1.9] -### Updated +### Changed - Simplify JAFFAL docs ## [v0.1.8] ### Changed -- Updated description in manifest +- Description in manifest ## [v0.1.7] -### Updated +### Changed - `-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 - Use parameter `--transcriptome-source` to define precalculated, reference-based or denovo ## [v0.1.6] -### Updated +### Changed - Removed sanitize option - Reduce size of differential expression data. ### Added diff --git a/LICENSE b/LICENSE index 3ee2c24..bd5e2de 100644 --- a/LICENSE +++ b/LICENSE @@ -1,12 +1,5 @@ -This Source Code Form is subject to the terms of the Mozilla Public -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 -================================== +Oxford Nanopore Technologies PLC. Public License Version 1.0 +============================================================= 1. Definitions -------------- @@ -17,7 +10,7 @@ Mozilla Public License Version 2.0 1.2. "Contributor Version" 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 Contributor’s Contribution. 1.3. "Contribution" 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 including portions thereof. -1.5. "Incompatible With Secondary Licenses" - 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" +1.5. "Executable 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 a separate file or files, that is not Covered Software. -1.8. "License" +1.7. "License" means this document. -1.9. "Licensable" +1.8. "Licensable" means having the right to grant, to the maximum extent possible, whether at the time of the initial grant or subsequently, any and all of the rights conveyed by this License. -1.10. "Modifications" +1.9. "Modifications" means any of the following: - (a) any file in Source Code Form that results from an addition to, - deletion from, or modification of the contents of Covered - Software; or + (a) any file in Source Code Form that results from an addition to, + deletion from, or modification of the contents of Covered + 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 - Software. +1.10. "Research Purposes" + 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 - 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" +1.11 "Secondary License" means either the GNU General Public License, Version 2.0, the GNU Lesser General Public License, Version 2.1, the GNU Affero General Public License, Version 3.0, or any later versions of those licenses. -1.13. "Source Code Form" +1.12. "Source Code Form" 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 License. For legal entities, "You" includes any entity that 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 Each Contributor hereby grants You a world-wide, royalty-free, -non-exclusive license: - -(a) under intellectual property rights (other than patent or trademark) - Licensable by such Contributor to use, reproduce, make available, - modify, display, perform, distribute, and otherwise exploit its - 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. +non-exclusive license under Contributor copyrights Licensable by such +Contributor to use, reproduce, make available, modify, display, +perform, distribute, and otherwise exploit solely for Research Purposes +its Contributions, either on an unmodified basis, with Modifications, +or as part of a Larger Work. 2.2. Effective Date The licenses granted in Section 2.1 with respect to any Contribution -become effective for each Contribution on the date the Contributor first -distributes such Contribution. +become effective for each Contribution on the date the Contributor +first distributes such Contribution. 2.3. Limitations on Grant Scope 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 -distribution or licensing of Covered Software under this License. -Notwithstanding Section 2.1(b) above, no patent license is granted by a -Contributor: +distribution or licensing of Covered Software under this License. The +License is incompatible with Secondary Licenses. Notwithstanding +Section 2.1 above, no copyright license is granted: (a) for any code that a Contributor has removed from Covered Software; or -(b) for infringements caused by: (i) Your and any other third party's - modifications of Covered Software, or (ii) the combination of its - Contributions with other software (except as part of its Contributor - Version); or +(b) use of the Contributions or its Contributor Version other than for +Research Purposes only; or -(c) under Patent Claims infringed by Covered Software in the absence of - its Contributions. +(c) for infringements caused by: (i) Your and any other third party’s +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, -or logos of any Contributor (except as may be necessary to comply with -the notice requirements in Section 3.4). +This License does not grant any rights in the patents, trademarks, +service marks, or logos of any Contributor (except as may be necessary +to comply with the notice requirements in Section 3.4). 2.4. Subsequent Licenses No Contributor makes additional grants as a result of Your choice to distribute the Covered Software under a subsequent version of this -License (see Section 10.2) or under the terms of a Secondary License (if -permitted under the terms of Section 3.3). +License (see Section 10.2) or under the terms of a Secondary License +(if permitted under the terms of Section 3.3). 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 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 -attempt to alter or restrict the recipients' rights in the Source Code -Form. +attempt to alter or restrict the recipients’ rights in the Source Code 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 (b) You may distribute such Executable Form under the terms of this - License, or sublicense it under different terms, provided that the - license for the Executable Form does not attempt to limit or alter - the recipients' rights in the Source Code Form under this License. + License. 3.3. Distribution of a Larger Work 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 -the Covered Software. If the Larger Work is a combination of Covered -Software with a work governed by one or more Secondary Licenses, and the -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). +the Covered Software. The Larger Work may not be a combination of Covered +Software with a work governed by one or more Secondary Licenses. 3.4. Notices @@ -212,16 +177,15 @@ the extent required to remedy known factual inaccuracies. 3.5. Application of Additional Terms -You may choose to offer, and to charge a fee for, warranty, support, -indemnity or liability obligations to one or more recipients of Covered -Software. However, You may do so only on Your own behalf, and not on -behalf of any Contributor. You must make it absolutely clear that any -such warranty, support, indemnity, or liability obligation is offered by -You alone, and You hereby agree to indemnify every Contributor for any -liability incurred by such Contributor as a result of warranty, support, -indemnity or liability terms You offer. You may include additional -disclaimers of warranty and limitations of liability specific to any -jurisdiction. +You may not choose to offer, or charge a fee for use of the Covered +Software or a fee for, warranty, support, indemnity or liability +obligations to one or more recipients of Covered Software. You must +make it absolutely clear that any such warranty, support, indemnity, or +liability obligation is offered by You alone, and You hereby agree to +indemnify every Contributor for any liability incurred by such +Contributor as a result of warranty, support, indemnity or liability +terms You offer. You may include additional disclaimers of warranty and +limitations of liability specific to any jurisdiction. 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 -if You fail to comply with any of its terms. However, if You become -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. +if You fail to comply with any of its terms. -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, 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 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 * * shall have been informed of the possibility of such damages. This * * limitation of liability shall not apply to liability for death or * -* personal injury resulting from such party's negligence to the * -* extent applicable law prohibits such limitation. Some * +* personal injury resulting from such party’s negligence to the * +* 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 * * incidental or consequential damages, so this exclusion and * * 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 place of business and such litigation shall be governed by laws of that 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 party’s ability to bring cross-claims or counter-claims. 9. Miscellaneous @@ -332,10 +287,10 @@ shall not be used to construe this License against a Contributor. 10.1. New Versions -Mozilla Foundation is the license steward. Except as provided in Section -10.3, no one other than the license steward has the right to modify or -publish new versions of this License. Each version will be given a -distinguishing version number. +Oxford Nanopore Technologies PLC. is the license steward. Except as +provided in Section 10.3, no one other than the license steward has the +right to modify or publish new versions of this License. Each version +will be given a distinguishing version number. 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 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 ------------------------------------------- - This Source Code Form is subject to the terms of the Mozilla Public - 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/. + This Source Code Form is subject to the terms of the Oxford Nanopore + Technologies PLC. Public License, v. 1.0. Full licence can be found + obtained from support@nanoporetech.com 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 @@ -372,9 +320,3 @@ file in a relevant directory) where a recipient would be likely to look for such a notice. 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. diff --git a/bin/workflow_glue/check_sample_sheet.py b/bin/workflow_glue/check_sample_sheet.py index 0f7d17b..2bd1779 100755 --- a/bin/workflow_glue/check_sample_sheet.py +++ b/bin/workflow_glue/check_sample_sheet.py @@ -11,7 +11,10 @@ def main(args): barcodes = [] aliases = [] - types = [] + sample_types = [] + allowed_sample_types = [ + "test_sample", "positive_control", "negative_control", "no_template_control" + ] try: with open(args.sample_sheet, "r") as f: @@ -31,45 +34,48 @@ def main(args): barcodes.append(row["barcode"]) except KeyError: sys.stdout.write("'barcode' column missing") - exit() + sys.exit() try: aliases.append(row["alias"]) except KeyError: sys.stdout.write("'alias' column missing") - exit() + sys.exit() try: - types.append(row["type"]) + sample_types.append(row["type"]) except KeyError: pass except Exception as e: sys.stdout.write(f"Parsing error: {e}") - exit() + sys.exit() # check barcode and alias values are unique if len(barcodes) > len(set(barcodes)): sys.stdout.write("values in 'barcode' column not unique") - exit() + sys.exit() if len(aliases) > len(set(aliases)): sys.stdout.write("values in 'alias' column not unique") - exit() + sys.exit() - if types: + if sample_types: # check if "type" column has unexpected values - unexp_type_vals = set(types) - set( - [ - "test_sample", - "positive_control", - "negative_control", - "no_template_control", - ] - ) + unexp_type_vals = set(sample_types) - set(allowed_sample_types) + if unexp_type_vals: sys.stdout.write( f"found unexpected values in 'type' column: {unexp_type_vals}. " - "allowed values are: `['test_sample', 'positive_control', " - "'negative_control', 'no_template_control']`" + f"Allowed values are: {allowed_sample_types}" ) - 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}.") @@ -78,4 +84,10 @@ def argparser(): """Argument parser for entrypoint.""" parser = wf_parser("check_sample_sheet") 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 diff --git a/lib/fastqingress.nf b/lib/fastqingress.nf index e24048e..6fefbce 100644 --- a/lib/fastqingress.nf +++ b/lib/fastqingress.nf @@ -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 // with repeated keys; we therefore need to transform the sample sheet data into // 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 | map { it.collectEntries { [(it["barcode"]): it] } } // 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, "fastcat_stats": false, "fastcat_extra_args": "", + "required_sample_types": [], "watch_path": false], name: "fastq_ingress") 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 if (margs.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 // `null`) 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 * @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 // the sample sheet is valid and parse it. However, because of Nextflow's // 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` // below. This lets the CSV channel only start to emit once the error checking is // 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 if (it) error "Invalid sample sheet: ${it}." it @@ -425,13 +426,19 @@ def get_sample_sheet(Path sample_sheet) { * message is emitted. * * @param: path to sample sheet CSV + * @param: list of required sample types (optional) * @return: string (optional) */ process validate_sample_sheet { label params.process_label - input: path csv + input: + path csv + val required_sample_types 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 """ } +