From 7734083b3ba4599679a93cf50c93022e1480c5f8 Mon Sep 17 00:00:00 2001 From: Cornelius Roemer Date: Fri, 5 Jun 2026 13:46:49 +0200 Subject: [PATCH 1/9] Uncommitted changes from December 2025 --- nextclade/Snakefile | 13 +++++++++--- nextclade/config/config.yaml | 16 +++++++++------ nextclade/resources/all-clades/clades.tsv | 4 +++- nextclade/resources/clade-i/clades.tsv | 2 -- .../clade-i/include_recombinants.txt | 1 + .../clade-iib/include_recombinants.txt | 1 + nextclade/resources/color_ordering.tsv | 2 ++ .../lineage-b.1/include_recombinants.txt | 1 + nextclade/scripts/clades_renaming.py | 20 ++++++++++++++----- 9 files changed, 43 insertions(+), 17 deletions(-) create mode 100644 nextclade/resources/clade-i/include_recombinants.txt create mode 100644 nextclade/resources/clade-iib/include_recombinants.txt create mode 100644 nextclade/resources/lineage-b.1/include_recombinants.txt diff --git a/nextclade/Snakefile b/nextclade/Snakefile index 9be52d49..4046066a 100644 --- a/nextclade/Snakefile +++ b/nextclade/Snakefile @@ -466,8 +466,8 @@ else: {input.alignment} \ --output-file {output.tree} \ --pruning-threshold 30 \ - --num-trees 20 \ - --spr-trees 10 + --num-trees 30 \ + --spr-trees 5 """ @@ -590,14 +590,21 @@ rule clades: rule rename_clades: input: clades="results/{build_name}/clades_raw.json", + tree="results/{build_name}/tree.nwk", script="scripts/clades_renaming.py", output: node_data="results/{build_name}/clades.json", + params: + outgroup_clade_name=lambda w: config[w.build_name].get( + "outgroup_clade_name", "unassigned" + ), shell: """ python {input.script} \ --input-node-data {input.clades} \ - --output-node-data {output.node_data} + --output-node-data {output.node_data} \ + --outgroup-clade-name {params.outgroup_clade_name} \ + --tree-file {input.tree} """ diff --git a/nextclade/config/config.yaml b/nextclade/config/config.yaml index a8be7cbd..ea49ec19 100644 --- a/nextclade/config/config.yaml +++ b/nextclade/config/config.yaml @@ -16,6 +16,7 @@ clade-iib: b1: "--subsample-max-sequences 1000 --group-by clade lineage year month country --probabilistic-sampling" nonb1: "--sequences-per-group 10 --group-by clade lineage year month country --probabilistic-sampling" general_include: "resources/include_accessions.txt" + outgroup_clade_name: "outgroup" clade-i: root: "reconstructed_ancestral_mpox" @@ -36,37 +37,40 @@ clade-i: - OPG005 - OPG015_dup - OPG016 + outgroup_clade_name: "outgroup" all-clades: root: "reconstructed_ancestral_mpox" min_date: "" exclude_where: - b1: "--exclude-where outbreak=hMPXV-1" - nonb1: "--exclude-where outbreak!=hMPXV-1" + b1: "--exclude-where outbreak=sh2017" + nonb1: "--exclude-where outbreak!=sh2017" subsampling: - b1: "--subsample-max-sequences 500 --group-by clade lineage year country --probabilistic-sampling" - nonb1: "--subsample-max-sequences 800 --group-by clade lineage year country --probabilistic-sampling" + b1: "--subsample-max-sequences 600 --group-by clade lineage year country --probabilistic-sampling" + nonb1: "--subsample-max-sequences 1000 --group-by clade lineage year country --probabilistic-sampling" general_include: "resources/include_accessions.txt" genes_to_exclude: - OPG001_dup - OPG002_dup - OPG003_dup - OPG015_dup + outgroup_clade_name: "unassigned" lineage-b.1: root: "ref_in_coord" min_date: "" exclude_where: b1: >- - --min-date 2022 --exclude-where outbreak!=hMPXV-1 lineage=A.2 lineage=A.2.1 lineage=A.2.2 lineage=A.2.3 lineage=A.2.4 + --min-date 2022 --exclude-where outbreak!=sh2017 lineage=A.2 lineage=A.2.1 lineage=A.2.2 lineage=A.2.3 lineage=A.2.4 lineage=A.2.5 lineage=G.1 lineage=H.1 lineage=H.2 lineage=A lineage=A.1 nonb1: >- - --min-date 2024 --exclude-where outbreak!=hMPXV-1 lineage=A.2 lineage=A.2.1 lineage=A.2.2 lineage=A.2.3 lineage=A.2.4 + --min-date 2024 --exclude-where outbreak!=sh2017 lineage=A.2 lineage=A.2.1 lineage=A.2.2 lineage=A.2.3 lineage=A.2.4 lineage=A.2.5 lineage=G.1 lineage=H.1 lineage=H.2 lineage=A lineage=A.1 subsampling: b1: "--subsample-max-sequences 2000 --group-by clade lineage year month country --probabilistic-sampling" nonb1: "--subsample-max-sequences 2000 --group-by clade lineage year month country --probabilistic-sampling" general_include: "resources/include_accessions.txt" + outgroup_clade_name: "outgroup" ## filter min_length: 160000 diff --git a/nextclade/resources/all-clades/clades.tsv b/nextclade/resources/all-clades/clades.tsv index 02a0d96b..b8b9d8b2 100644 --- a/nextclade/resources/all-clades/clades.tsv +++ b/nextclade/resources/all-clades/clades.tsv @@ -1,6 +1,7 @@ # Nuc coordinates valid for reference NC_063383 (MPXV-M5312_HM12_Rivers) clade gene site alt -unassigned nuc 179226 T + +unassigned nuc 720 C clade Ib/IIb nuc 60171 T clade Ib/IIb nuc 122558 A @@ -22,6 +23,7 @@ clade Ib nuc 19455 T clade II nuc 86502 G clade II nuc 150970 A clade II nuc 35352 C +clade II nuc 103424 T clade IIa clade clade II clade IIa nuc 54013 G diff --git a/nextclade/resources/clade-i/clades.tsv b/nextclade/resources/clade-i/clades.tsv index 13cbab4b..df0aa076 100644 --- a/nextclade/resources/clade-i/clades.tsv +++ b/nextclade/resources/clade-i/clades.tsv @@ -1,7 +1,5 @@ # Nuc coordinates valid for reference DQ011155.1 clade gene site alt -unassigned nuc 113493 G - clade I nuc 75464 G clade I nuc 165916 T diff --git a/nextclade/resources/clade-i/include_recombinants.txt b/nextclade/resources/clade-i/include_recombinants.txt new file mode 100644 index 00000000..3e8a398b --- /dev/null +++ b/nextclade/resources/clade-i/include_recombinants.txt @@ -0,0 +1 @@ +PP_004DYJ3 diff --git a/nextclade/resources/clade-iib/include_recombinants.txt b/nextclade/resources/clade-iib/include_recombinants.txt new file mode 100644 index 00000000..3e8a398b --- /dev/null +++ b/nextclade/resources/clade-iib/include_recombinants.txt @@ -0,0 +1 @@ +PP_004DYJ3 diff --git a/nextclade/resources/color_ordering.tsv b/nextclade/resources/color_ordering.tsv index e3979c87..70deed46 100644 --- a/nextclade/resources/color_ordering.tsv +++ b/nextclade/resources/color_ordering.tsv @@ -217,12 +217,14 @@ region North America ################ +clade_membership unassigned clade_membership I clade_membership Ia clade_membership Ib clade_membership II clade_membership IIa clade_membership IIb +clade_membership Ib/IIb ################ diff --git a/nextclade/resources/lineage-b.1/include_recombinants.txt b/nextclade/resources/lineage-b.1/include_recombinants.txt new file mode 100644 index 00000000..3e8a398b --- /dev/null +++ b/nextclade/resources/lineage-b.1/include_recombinants.txt @@ -0,0 +1 @@ +PP_004DYJ3 diff --git a/nextclade/scripts/clades_renaming.py b/nextclade/scripts/clades_renaming.py index f351c66f..69271c30 100644 --- a/nextclade/scripts/clades_renaming.py +++ b/nextclade/scripts/clades_renaming.py @@ -1,6 +1,8 @@ import argparse import json +from Bio import Phylo + if __name__ == "__main__": parser = argparse.ArgumentParser( description="Split clade membership into clade, outbreak and lineage", @@ -15,7 +17,12 @@ help="output Auspice JSON", ) parser.add_argument("--outgroup-clade-name", type=str, default="outgroup", help="name for outgroup clade") + parser.add_argument("--tree-file", type=str, help="input tree file (not used)") args = parser.parse_args() + # get all node names + with open (args.tree_file) as fh: + tree = Phylo.read(fh, "newick") + all_node_names = {clade.name for clade in tree.find_clades() if clade.name is not None} with open(args.input_node_data) as fh: data = json.load(fh) new_node_data = {} @@ -41,12 +48,8 @@ clade_name = "IIb" outbreak_name = old_clade_name lineage_name = "A" - elif old_clade_name.startswith(args.outgroup_clade_name): + elif old_clade_name.startswith(args.outgroup_clade_name) or old_clade_name == "unassigned" or old_clade_name == "": clade_name = args.outgroup_clade_name - elif old_clade_name.startswith("outgroup"): - clade_name = "outgroup" - elif old_clade_name.startswith("unassigned"): - clade_name = "unassigned" else: clade_name = "IIb" outbreak_name = "sh2017" @@ -65,6 +68,13 @@ new_node_data[name] = node_data + for name in all_node_names - new_node_data.keys(): + new_node_data[name] = { + "clade_membership": args.outgroup_clade_name, + "outbreak": "", + "lineage": "", + } + new_branch_labels = {} for name, node in data["branches"].items(): From 55f88ce1d665e9529a4a984256bc3966920457bc Mon Sep 17 00:00:00 2001 From: Cornelius Roemer Date: Thu, 11 Jun 2026 14:32:19 +0200 Subject: [PATCH 2/9] Switch to iqtree and reformat Snakefile --- nextclade/Snakefile | 81 ++++++++++++++++++++------------------------- 1 file changed, 35 insertions(+), 46 deletions(-) diff --git a/nextclade/Snakefile b/nextclade/Snakefile index 4046066a..5485adae 100644 --- a/nextclade/Snakefile +++ b/nextclade/Snakefile @@ -118,11 +118,11 @@ rule decompress_sequences_and_remove_duplicates: shell: """ zstdcat {input.sequences} \ - | seqkit replace \ - -p "^([^.]+).*" -r '$1' \ - | seqkit grep -w0 -v -f {input.known_duplicates} \ - | seqkit seq -m={params.min_length} \ - > {output.sequences} + | seqkit replace \ + -p "^([^.]+).*" -r '$1' \ + | seqkit grep -w0 -v -f {input.known_duplicates} \ + | seqkit seq -m={params.min_length} \ + >{output.sequences} """ @@ -228,7 +228,6 @@ rule reformat_ambiguous: df["date"] = df["date"].apply(replace_ambiguous_date) - df.to_csv(output.metadata, sep="\t", index=False) @@ -361,21 +360,21 @@ rule align: shell: """ cat {input.root} {input.reference} {input.sequences} \ - | seqkit seq -w0 -i \ - | seqkit rmdup -n \ - | nextclade3 run \ - --retry-reverse-complement \ - --input-ref {input.reference} \ - --excess-bandwidth 100 \ - --terminal-bandwidth 300 \ - --allowed-mismatches 8 \ - --window-size 40 \ - --min-seed-cover 0.1 \ - --input-annotation {input.annotation} \ - --gap-alignment-side left \ - --output-fasta /dev/stdout \ - --output-translations {params.translation_template} \ - | seqkit seq -w0 -i > {output.alignment} + | seqkit seq -w0 -i \ + | seqkit rmdup -n \ + | nextclade3 run \ + --retry-reverse-complement \ + --input-ref {input.reference} \ + --excess-bandwidth 100 \ + --terminal-bandwidth 300 \ + --allowed-mismatches 8 \ + --window-size 40 \ + --min-seed-cover 0.1 \ + --input-annotation {input.annotation} \ + --gap-alignment-side left \ + --output-fasta /dev/stdout \ + --output-translations {params.translation_template} \ + | seqkit seq -w0 -i >{output.alignment} """ @@ -395,11 +394,9 @@ rule mask: rule deduplicate_2: - """ - Remove identical sequences (even if they have differing Ns) - Keep those sequences with fewer Ns - Focus for Nextclade is on diversity, not on representativeness - """ + # Remove identical sequences (even if they have differing Ns) + # Keep those sequences with fewer Ns + # Focus for Nextclade is on diversity, not on representativeness input: sequences="results/{build_name}/masked_with_dups.fasta", output: @@ -422,7 +419,7 @@ rule pre_tree_exclude: seqkit grep -w0 -v -f \ <(cat {input.duplicates} {input.recombinants}) \ {input.sequences} \ - > {output.sequences} + >{output.sequences} """ @@ -454,20 +451,12 @@ else: output: tree="results/{build_name}/masked.fasta.treefile", shell: - # """ - # augur tree \ - # --alignment {input.alignment} \ - # --tree-builder-args "--polytomy --ninit 2 -n 2 --epsilon 0.05 -T 4 --redo" \ - # --nthreads 4 \ - # --output {output.tree} - # """ """ - ~/code/pree/rust/target/release/rust_parsimony build \ - {input.alignment} \ - --output-file {output.tree} \ - --pruning-threshold 30 \ - --num-trees 30 \ - --spr-trees 5 + augur tree \ + --alignment {input.alignment} \ + --tree-builder-args "--polytomy --ninit 2 -n 2 --epsilon 0.05 -T 4 --redo" \ + --nthreads 4 \ + --output {output.tree} """ @@ -565,7 +554,7 @@ rule ancestral: --genes {params.genes} \ --output-node-data {output.node_data} \ --inference joint \ - 2>&1 > {output.log} + 2>&1 >{output.log} """ @@ -601,10 +590,10 @@ rule rename_clades: shell: """ python {input.script} \ - --input-node-data {input.clades} \ - --output-node-data {output.node_data} \ - --outgroup-clade-name {params.outgroup_clade_name} \ - --tree-file {input.tree} + --input-node-data {input.clades} \ + --output-node-data {output.node_data} \ + --outgroup-clade-name {params.outgroup_clade_name} \ + --tree-file {input.tree} """ @@ -649,7 +638,7 @@ rule patch_auspice_config: auspice_config="results/{build_name}/auspice_config.json", shell: """ - jsonpatch {input.auspice_config} {input.patch_json} > {output.auspice_config} + jsonpatch {input.auspice_config} {input.patch_json} >{output.auspice_config} """ From c56723394303b23bc346142c46f258a78684016a Mon Sep 17 00:00:00 2001 From: Cornelius Roemer Date: Thu, 11 Jun 2026 14:33:09 +0200 Subject: [PATCH 3/9] nextclade: Improve clade I mask and exclude Pakistani sequences --- nextclade/resources/clade-i/mask.bed | 5 +++-- nextclade/resources/exclude_accessions.txt | 26 ++++++++++++++++++++++ 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/nextclade/resources/clade-i/mask.bed b/nextclade/resources/clade-i/mask.bed index 34d6b73f..62353a55 100644 --- a/nextclade/resources/clade-i/mask.bed +++ b/nextclade/resources/clade-i/mask.bed @@ -4,7 +4,9 @@ chr 6610 6612 artefact in some DRC sequences chr 10399 10521 very diverse in clade I chr 13867 13869 reverted in some Ib chr 18280 18282 homoplasic in Ib -chr 20570 20580 homoplasic in Ib +chr 19251 19253 deleted/homoplasic in Ib +chr 20392 20394 deleted/homoplasic in Ib +chr 20570 20581 homoplasic in Ib chr 31903 31905 homoplasic in Ib chr 58388 58490 homoplasic in Ib chr 64227 64329 homoplasic in Ib @@ -20,7 +22,6 @@ chr 159132 159234 homoplasic in Ib chr 165586 165688 homoplasic in Ib chr 169399 169601 homoplasic in Ib chr 177247 177349 homoplasic in Ib -chr 185990 186092 homoplasic in Ib chr 133165 133365 indel variation and long homopolymers chr 136612 136712 indel variation and long homopolymers chr 140150 140350 indel variation and long repetitive elements diff --git a/nextclade/resources/exclude_accessions.txt b/nextclade/resources/exclude_accessions.txt index e25ecde6..953b1723 100644 --- a/nextclade/resources/exclude_accessions.txt +++ b/nextclade/resources/exclude_accessions.txt @@ -504,3 +504,29 @@ PP_0033ZEY PP_0034079 PP_00340T2 PP_00341CY + +PP_00713Q7 # Ib/IIb recombinant, already covered by UK sequence +PP_00713P9 # Ib/IIb recombinant, already covered by UK sequence + +PP_00703Q9 # Pakistani clade I with many artefacts/reversions +PP_00704T2 # Pakistani clade I with many artefacts/reversions +PP_00704U0 # Pakistani clade I with many artefacts/reversions +PP_00705NB # Pakistani clade I with many artefacts/reversions +PP_00705P9 # Pakistani clade I with many artefacts/reversions +PP_00705Q7 # Pakistani clade I with many artefacts/reversions +PP_00705R5 # Pakistani clade I with many artefacts/reversions +PP_00705S3 # Pakistani clade I with many artefacts/reversions +PP_00705T1 # Pakistani clade I with many artefacts/reversions +PP_00705UZ # Pakistani clade I with many artefacts/reversions +PP_00706MC # Pakistani clade I with many artefacts/reversions +PP_00706NA # Pakistani clade I with many artefacts/reversions +PP_00706P8 # Pakistani clade I with many artefacts/reversions +PP_00706Q6 # Pakistani clade I with many artefacts/reversions +PP_00706R4 # Pakistani clade I with many artefacts/reversions +PP_00706S2 # Pakistani clade I with many artefacts/reversions +PP_00706T0 # Pakistani clade I with many artefacts/reversions +PP_00706UY # Pakistani clade I with many artefacts/reversions +PP_00706VW # Pakistani clade I with many artefacts/reversions +PP_00706WU # Pakistani clade I with many artefacts/reversions +PP_00706XS # Pakistani clade I with many artefacts/reversions +PP_00706YQ # Pakistani clade I with many artefacts/reversions From d430138bfa590cd1475efb0f251c3f58a5da8a7f Mon Sep 17 00:00:00 2001 From: Cornelius Roemer Date: Thu, 11 Jun 2026 14:34:20 +0200 Subject: [PATCH 4/9] Format snakefile and exclude Pakistani seqs with artefacts --- phylogenetic/defaults/exclude.txt | 23 ++++++++++++++ phylogenetic/rules/construct_phylogeny.smk | 36 ++++++++-------------- 2 files changed, 36 insertions(+), 23 deletions(-) diff --git a/phylogenetic/defaults/exclude.txt b/phylogenetic/defaults/exclude.txt index a107579a..f9efbe80 100644 --- a/phylogenetic/defaults/exclude.txt +++ b/phylogenetic/defaults/exclude.txt @@ -135,3 +135,26 @@ PP_0011BTZ # B.1 with reversions PP_003416A # G.1 with many reversions interspersed PP_004DYJ3 # clade Ib/IIb recombinant that messes up phylogeny + +PP_00703Q9 # Pakistani clade I with many artefacts/reversions +PP_00704T2 # Pakistani clade I with many artefacts/reversions +PP_00704U0 # Pakistani clade I with many artefacts/reversions +PP_00705NB # Pakistani clade I with many artefacts/reversions +PP_00705P9 # Pakistani clade I with many artefacts/reversions +PP_00705Q7 # Pakistani clade I with many artefacts/reversions +PP_00705R5 # Pakistani clade I with many artefacts/reversions +PP_00705S3 # Pakistani clade I with many artefacts/reversions +PP_00705T1 # Pakistani clade I with many artefacts/reversions +PP_00705UZ # Pakistani clade I with many artefacts/reversions +PP_00706MC # Pakistani clade I with many artefacts/reversions +PP_00706NA # Pakistani clade I with many artefacts/reversions +PP_00706P8 # Pakistani clade I with many artefacts/reversions +PP_00706Q6 # Pakistani clade I with many artefacts/reversions +PP_00706R4 # Pakistani clade I with many artefacts/reversions +PP_00706S2 # Pakistani clade I with many artefacts/reversions +PP_00706T0 # Pakistani clade I with many artefacts/reversions +PP_00706UY # Pakistani clade I with many artefacts/reversions +PP_00706VW # Pakistani clade I with many artefacts/reversions +PP_00706WU # Pakistani clade I with many artefacts/reversions +PP_00706XS # Pakistani clade I with many artefacts/reversions +PP_00706YQ # Pakistani clade I with many artefacts/reversions diff --git a/phylogenetic/rules/construct_phylogeny.smk b/phylogenetic/rules/construct_phylogeny.smk index 789042a5..f7605af5 100644 --- a/phylogenetic/rules/construct_phylogeny.smk +++ b/phylogenetic/rules/construct_phylogeny.smk @@ -16,20 +16,17 @@ OUTPUTS: rule tree: - """ - Building tree - """ input: alignment=build_dir + "/{build_name}/masked.fasta", tree_mask=config["tree_mask"], output: tree=build_dir + "/{build_name}/tree_raw.nwk", - # It's faster to use 4 threads rather than doing a full search - hence hardcoding 4 - threads: min(workflow.cores, 4) log: "logs/{build_name}/tree.txt", benchmark: "benchmarks/{build_name}/tree.txt" + # It's faster to use 4 threads rather than doing a full search - hence hardcoding 4 + threads: min(workflow.cores, 4) shell: r""" exec &> >(tee {log:q}) @@ -37,7 +34,7 @@ rule tree: augur tree \ --alignment {input.alignment:q} \ --exclude-sites {input.tree_mask:q} \ - --tree-builder-args "-T {threads}" \ + --tree-builder-args "-T {threads} --seqtype DNA" \ --output {output.tree:q} \ --nthreads {threads} """ @@ -45,23 +42,23 @@ rule tree: rule fix_tree: """ - Fixing tree - """ +Fixing tree +""" input: tree=build_dir + "/{build_name}/tree_raw.nwk", alignment=build_dir + "/{build_name}/masked.fasta", output: tree=build_dir + "/{build_name}/tree_fixed.nwk", + log: + "logs/{build_name}/fix_tree.txt", + benchmark: + "benchmarks/{build_name}/fix_tree.txt" params: root=lambda w: ( ("--root " + config["treefix_root"]) if config.get("treefix_root", False) else "" ), - log: - "logs/{build_name}/fix_tree.txt", - benchmark: - "benchmarks/{build_name}/fix_tree.txt" shell: r""" exec &> >(tee {log:q}) @@ -75,13 +72,6 @@ rule fix_tree: rule refine: - """ - Refining tree - - estimate timetree - - use {params.coalescent} coalescent timescale - - estimate {params.date_inference} node dates - - filter tips more than {params.clock_filter_iqd} IQDs from clock expectation - """ input: tree=( build_dir + "/{build_name}/tree_fixed.nwk" @@ -93,6 +83,10 @@ rule refine: output: tree=build_dir + "/{build_name}/tree.nwk", node_data=build_dir + "/{build_name}/branch_lengths.json", + log: + "logs/{build_name}/refine.txt", + benchmark: + "benchmarks/{build_name}/refine.txt" params: coalescent="opt", date_inference="marginal", @@ -110,10 +104,6 @@ rule refine: ), strain_id=config["strain_id_field"], divergence_units=config["divergence_units"], - log: - "logs/{build_name}/refine.txt", - benchmark: - "benchmarks/{build_name}/refine.txt" shell: r""" exec &> >(tee {log:q}) From 3c5294519aa7b5dc14686a7b9448995a6f6c7312 Mon Sep 17 00:00:00 2001 From: Cornelius Roemer Date: Thu, 11 Jun 2026 14:47:00 +0200 Subject: [PATCH 5/9] nextclade: namespace lineages by outbreak Prefix sh2017 lineage definitions and parent references across the Nextclade clade tables so parallel lineage systems can coexist. Update clade renaming to parse outbreak/lineage identifiers, map them to their parent clade, and reject legacy unprefixed lineage names. --- nextclade/resources/all-clades/clades.tsv | 430 ++++++++++----------- nextclade/resources/clade-iib/clades.tsv | 430 ++++++++++----------- nextclade/resources/lineage-b.1/clades.tsv | 342 ++++++++-------- nextclade/scripts/clades_renaming.py | 35 +- 4 files changed, 620 insertions(+), 617 deletions(-) diff --git a/nextclade/resources/all-clades/clades.tsv b/nextclade/resources/all-clades/clades.tsv index b8b9d8b2..54fa03da 100644 --- a/nextclade/resources/all-clades/clades.tsv +++ b/nextclade/resources/all-clades/clades.tsv @@ -31,243 +31,243 @@ clade IIa nuc 54013 G clade IIb clade clade II clade IIb nuc 48148 C -sh2017 clade clade IIb -sh2017 nuc 19367 T -sh2017 nuc 48527 A +sh2017/A clade clade IIb +sh2017/A nuc 19367 T +sh2017/A nuc 48527 A -A.1 clade sh2017 -A.1 nuc 83326 T +sh2017/A.1 clade sh2017/A +sh2017/A.1 nuc 83326 T -A.1.1 clade A.1 -A.1.1 nuc 34459 A +sh2017/A.1.1 clade sh2017/A.1 +sh2017/A.1.1 nuc 34459 A -B.1 clade A.1.1 -B.1 nuc 77383 A +sh2017/B.1 clade sh2017/A.1.1 +sh2017/B.1 nuc 77383 A -B.1.1 clade B.1 -B.1.1 nuc 74360 A +sh2017/B.1.1 clade sh2017/B.1 +sh2017/B.1.1 nuc 74360 A -B.1.2 clade B.1 -B.1.2 nuc 186165 A +sh2017/B.1.2 clade sh2017/B.1 +sh2017/B.1.2 nuc 186165 A -B.1.3 clade B.1 -B.1.3 nuc 190660 A +sh2017/B.1.3 clade sh2017/B.1 +sh2017/B.1.3 nuc 190660 A -C.1 clade B.1.3 -C.1 nuc 105923 A -C.1 nuc 64426 T -C.1 nuc 55133 A +sh2017/C.1 clade sh2017/B.1.3 +sh2017/C.1 nuc 105923 A +sh2017/C.1 nuc 64426 T +sh2017/C.1 nuc 55133 A -C.1.1 clade C.1 -C.1.1 nuc 21062 T -C.1.1 nuc 149963 T +sh2017/C.1.1 clade sh2017/C.1 +sh2017/C.1.1 nuc 21062 T +sh2017/C.1.1 nuc 149963 T -E.1 clade C.1.1 -E.1 nuc 13563 A -E.1 nuc 121394 T -E.1 nuc 162280 A +sh2017/E.1 clade sh2017/C.1.1 +sh2017/E.1 nuc 13563 A +sh2017/E.1 nuc 121394 T +sh2017/E.1 nuc 162280 A -E.1.1 clade E.1 -E.1.1 nuc 41405 T -E.1.1 nuc 157928 T +sh2017/E.1.1 clade sh2017/E.1 +sh2017/E.1.1 nuc 41405 T +sh2017/E.1.1 nuc 157928 T -E.2 clade C.1.1 -E.2 nuc 13563 A -E.2 nuc 151847 A -E.2 nuc 37738 T +sh2017/E.2 clade sh2017/C.1.1 +sh2017/E.2 nuc 13563 A +sh2017/E.2 nuc 151847 A +sh2017/E.2 nuc 37738 T -E.2.1 clade E.2 -E.2.1 nuc 55466 A -E.2.1 nuc 135121 T +sh2017/E.2.1 clade sh2017/E.2 +sh2017/E.2.1 nuc 55466 A +sh2017/E.2.1 nuc 135121 T -E.3 clade C.1.1 -E.3 nuc 142797 T +sh2017/E.3 clade sh2017/C.1.1 +sh2017/E.3 nuc 142797 T -E.3.1 clade E.3 -E.3.1 nuc 113957 T -E.3.1 nuc 74018 T +sh2017/E.3.1 clade sh2017/E.3 +sh2017/E.3.1 nuc 113957 T +sh2017/E.3.1 nuc 74018 T -E.4 clade C.1.1 -E.4 nuc 41806 A -E.4 nuc 136791 G +sh2017/E.4 clade sh2017/C.1.1 +sh2017/E.4 nuc 41806 A +sh2017/E.4 nuc 136791 G -C.1.2 clade C.1 -C.1.2 nuc 28142 A -C.1.2 nuc 126761 A +sh2017/C.1.2 clade sh2017/C.1 +sh2017/C.1.2 nuc 28142 A +sh2017/C.1.2 nuc 126761 A -C.1.3 clade C.1 -C.1.3 nuc 33332 T -C.1.3 nuc 37974 A - -B.1.4 clade B.1 -B.1.4 nuc 34308 A +sh2017/C.1.3 clade sh2017/C.1 +sh2017/C.1.3 nuc 33332 T +sh2017/C.1.3 nuc 37974 A + +sh2017/B.1.4 clade sh2017/B.1 +sh2017/B.1.4 nuc 34308 A -B.1.5 clade B.1 -B.1.5 nuc 70780 T +sh2017/B.1.5 clade sh2017/B.1 +sh2017/B.1.5 nuc 70780 T -B.1.6 clade B.1 -B.1.6 nuc 111029 A +sh2017/B.1.6 clade sh2017/B.1 +sh2017/B.1.6 nuc 111029 A -D.1 clade B.1.6 -D.1 nuc 10945 A -D.1 nuc 39515 A -D.1 nuc 44627 T -D.1 nuc 56276 A +sh2017/D.1 clade sh2017/B.1.6 +sh2017/D.1 nuc 10945 A +sh2017/D.1 nuc 39515 A +sh2017/D.1 nuc 44627 T +sh2017/D.1 nuc 56276 A -B.1.7 clade B.1 -B.1.7 nuc 25644 T +sh2017/B.1.7 clade sh2017/B.1 +sh2017/B.1.7 nuc 25644 T -B.1.8 clade B.1 -B.1.8 nuc 5595 A -B.1.8 nuc 191615 T +sh2017/B.1.8 clade sh2017/B.1 +sh2017/B.1.8 nuc 5595 A +sh2017/B.1.8 nuc 191615 T -B.1.9 clade B.1 -B.1.9 nuc 181367 A - -B.1.10 clade B.1 -B.1.10 nuc 89906 T -B.1.10 nuc 94798 A - -B.1.11 clade B.1 -B.1.11 nuc 18133 T -B.1.11 nuc 159277 A - -B.1.12 clade B.1 -B.1.12 nuc 182950 T +sh2017/B.1.9 clade sh2017/B.1 +sh2017/B.1.9 nuc 181367 A + +sh2017/B.1.10 clade sh2017/B.1 +sh2017/B.1.10 nuc 89906 T +sh2017/B.1.10 nuc 94798 A + +sh2017/B.1.11 clade sh2017/B.1 +sh2017/B.1.11 nuc 18133 T +sh2017/B.1.11 nuc 159277 A + +sh2017/B.1.12 clade sh2017/B.1 +sh2017/B.1.12 nuc 182950 T -B.1.13 clade B.1 -B.1.13 nuc 175093 A +sh2017/B.1.13 clade sh2017/B.1 +sh2017/B.1.13 nuc 175093 A -B.1.14 clade B.1 -B.1.14 nuc 36617 A -B.1.14 nuc 159779 T - -B.1.15 clade B.1 -B.1.15 nuc 149818 A -B.1.15 nuc 151362 A - -B.1.16 clade B.1 -B.1.16 nuc 9389 T -B.1.16 nuc 161797 A -B.1.16 nuc 185557 C - -B.1.17 clade B.1 -B.1.17 nuc 12169 A -B.1.17 nuc 44960 A - -B.1.18 clade B.1 -B.1.18 nuc 141757 T -B.1.18 nuc 43706 T -B.1.18 nuc 124690 C - -B.1.19 clade B.1 -B.1.19 nuc 9963 A -B.1.19 nuc 148268 T - -B.1.20 clade B.1 -B.1.20 nuc 53326 A -B.1.20 nuc 164385 T -B.1.20 nuc 187620 T - -F.1 clade B.1.20 -F.1 nuc 11668 A -F.1 nuc 35132 A -F.1 nuc 70414 T -F.1 nuc 70666 T -F.1 nuc 96938 T - -F.1.1 clade F.1 -F.1.1 nuc 133402 T -F.1.1 nuc 143277 T - -F.2 clade B.1.20 -F.2 nuc 161629 A -F.2 nuc 22167 T - -F.2.1 clade F.2 -F.2.1 nuc 44032 T -F.2.1 nuc 80820 A -F.2.1 nuc 165892 A - -F.3 clade B.1.20 -F.3 nuc 174050 T -F.3 nuc 180618 T - -F.4 clade B.1.20 -F.4 nuc 34277 T -F.4 nuc 92382 T -F.4 nuc 122551 T -F.4 nuc 126919 A -F.4 nuc 176643 A - -F.4.1 clade F.4 -F.4.1 nuc 21394 A -F.4.1 nuc 111492 T - -F.5 clade B.1.20 -F.5 nuc 150831 T -F.5 nuc 126169 A - -F.6 clade B.1.20 -F.6 nuc 146690 A -F.6 nuc 159608 T -F.6 nuc 168964 A - -B.1.21 clade B.1 -B.1.21 nuc 22415 A -B.1.21 nuc 132698 T - -B.1.22 clade B.1 -B.1.22 nuc 34784 T -B.1.22 nuc 101418 T - -J.1 clade B.1.22 -J.1 nuc 45528 T -J.1 nuc 121663 A - -B.1.23 clade B.1 -B.1.23 nuc 27935 A -B.1.23 nuc 64171 G -B.1.23 nuc 73235 T - -A.2 clade sh2017 -A.2 nuc 34472 T - -A.2.1 clade A.2 -A.2.1 nuc 25072 T -A.2.1 nuc 140492 C -A.2.1 nuc 179537 T - -H.1 clade A.2.1 -H.1 nuc 52289 A -H.1 nuc 67261 A -H.1 nuc 181947 A - -H.2 clade A.2.1 -H.2 nuc 43103 A -H.2 nuc 184924 T - -A.2.2 clade A.2 -A.2.2 nuc 21991 A -A.2.2 nuc 103019 T -A.2.2 nuc 158424 A - -G.1 clade A.2.2 -G.1 nuc 85413 T -G.1 nuc 164382 C - -A.2.3 clade A.2 -A.2.3 nuc 57284 T -A.2.3 nuc 74226 T - -A.2.4 clade A.2 -A.2.4 nuc 15105 T -A.2.4 nuc 179628 G - -A.2.5 clade A.2 -A.2.5 nuc 12426 T -A.2.5 nuc 134107 A - -A.3 clade sh2017 -A.3 nuc 96841 A -A.3 nuc 100971 T \ No newline at end of file +sh2017/B.1.14 clade sh2017/B.1 +sh2017/B.1.14 nuc 36617 A +sh2017/B.1.14 nuc 159779 T + +sh2017/B.1.15 clade sh2017/B.1 +sh2017/B.1.15 nuc 149818 A +sh2017/B.1.15 nuc 151362 A + +sh2017/B.1.16 clade sh2017/B.1 +sh2017/B.1.16 nuc 9389 T +sh2017/B.1.16 nuc 161797 A +sh2017/B.1.16 nuc 185557 C + +sh2017/B.1.17 clade sh2017/B.1 +sh2017/B.1.17 nuc 12169 A +sh2017/B.1.17 nuc 44960 A + +sh2017/B.1.18 clade sh2017/B.1 +sh2017/B.1.18 nuc 141757 T +sh2017/B.1.18 nuc 43706 T +sh2017/B.1.18 nuc 124690 C + +sh2017/B.1.19 clade sh2017/B.1 +sh2017/B.1.19 nuc 9963 A +sh2017/B.1.19 nuc 148268 T + +sh2017/B.1.20 clade sh2017/B.1 +sh2017/B.1.20 nuc 53326 A +sh2017/B.1.20 nuc 164385 T +sh2017/B.1.20 nuc 187620 T + +sh2017/F.1 clade sh2017/B.1.20 +sh2017/F.1 nuc 11668 A +sh2017/F.1 nuc 35132 A +sh2017/F.1 nuc 70414 T +sh2017/F.1 nuc 70666 T +sh2017/F.1 nuc 96938 T + +sh2017/F.1.1 clade sh2017/F.1 +sh2017/F.1.1 nuc 133402 T +sh2017/F.1.1 nuc 143277 T + +sh2017/F.2 clade sh2017/B.1.20 +sh2017/F.2 nuc 161629 A +sh2017/F.2 nuc 22167 T + +sh2017/F.2.1 clade sh2017/F.2 +sh2017/F.2.1 nuc 44032 T +sh2017/F.2.1 nuc 80820 A +sh2017/F.2.1 nuc 165892 A + +sh2017/F.3 clade sh2017/B.1.20 +sh2017/F.3 nuc 174050 T +sh2017/F.3 nuc 180618 T + +sh2017/F.4 clade sh2017/B.1.20 +sh2017/F.4 nuc 34277 T +sh2017/F.4 nuc 92382 T +sh2017/F.4 nuc 122551 T +sh2017/F.4 nuc 126919 A +sh2017/F.4 nuc 176643 A + +sh2017/F.4.1 clade sh2017/F.4 +sh2017/F.4.1 nuc 21394 A +sh2017/F.4.1 nuc 111492 T + +sh2017/F.5 clade sh2017/B.1.20 +sh2017/F.5 nuc 150831 T +sh2017/F.5 nuc 126169 A + +sh2017/F.6 clade sh2017/B.1.20 +sh2017/F.6 nuc 146690 A +sh2017/F.6 nuc 159608 T +sh2017/F.6 nuc 168964 A + +sh2017/B.1.21 clade sh2017/B.1 +sh2017/B.1.21 nuc 22415 A +sh2017/B.1.21 nuc 132698 T + +sh2017/B.1.22 clade sh2017/B.1 +sh2017/B.1.22 nuc 34784 T +sh2017/B.1.22 nuc 101418 T + +sh2017/J.1 clade sh2017/B.1.22 +sh2017/J.1 nuc 45528 T +sh2017/J.1 nuc 121663 A + +sh2017/B.1.23 clade sh2017/B.1 +sh2017/B.1.23 nuc 27935 A +sh2017/B.1.23 nuc 64171 G +sh2017/B.1.23 nuc 73235 T + +sh2017/A.2 clade sh2017/A +sh2017/A.2 nuc 34472 T + +sh2017/A.2.1 clade sh2017/A.2 +sh2017/A.2.1 nuc 25072 T +sh2017/A.2.1 nuc 140492 C +sh2017/A.2.1 nuc 179537 T + +sh2017/H.1 clade sh2017/A.2.1 +sh2017/H.1 nuc 52289 A +sh2017/H.1 nuc 67261 A +sh2017/H.1 nuc 181947 A + +sh2017/H.2 clade sh2017/A.2.1 +sh2017/H.2 nuc 43103 A +sh2017/H.2 nuc 184924 T + +sh2017/A.2.2 clade sh2017/A.2 +sh2017/A.2.2 nuc 21991 A +sh2017/A.2.2 nuc 103019 T +sh2017/A.2.2 nuc 158424 A + +sh2017/G.1 clade sh2017/A.2.2 +sh2017/G.1 nuc 85413 T +sh2017/G.1 nuc 164382 C + +sh2017/A.2.3 clade sh2017/A.2 +sh2017/A.2.3 nuc 57284 T +sh2017/A.2.3 nuc 74226 T + +sh2017/A.2.4 clade sh2017/A.2 +sh2017/A.2.4 nuc 15105 T +sh2017/A.2.4 nuc 179628 G + +sh2017/A.2.5 clade sh2017/A.2 +sh2017/A.2.5 nuc 12426 T +sh2017/A.2.5 nuc 134107 A + +sh2017/A.3 clade sh2017/A +sh2017/A.3 nuc 96841 A +sh2017/A.3 nuc 100971 T \ No newline at end of file diff --git a/nextclade/resources/clade-iib/clades.tsv b/nextclade/resources/clade-iib/clades.tsv index 8b8adea7..d92c7f0a 100644 --- a/nextclade/resources/clade-iib/clades.tsv +++ b/nextclade/resources/clade-iib/clades.tsv @@ -4,243 +4,243 @@ outgroup nuc 54013 G clade IIb nuc 48148 C -A clade clade IIb -A nuc 19367 T -A nuc 48527 A +sh2017/A clade clade IIb +sh2017/A nuc 19367 T +sh2017/A nuc 48527 A -A.1 clade A -A.1 nuc 83326 T +sh2017/A.1 clade sh2017/A +sh2017/A.1 nuc 83326 T -A.1.1 clade A.1 -A.1.1 nuc 34459 A +sh2017/A.1.1 clade sh2017/A.1 +sh2017/A.1.1 nuc 34459 A -B.1 clade A.1.1 -B.1 nuc 77383 A +sh2017/B.1 clade sh2017/A.1.1 +sh2017/B.1 nuc 77383 A -B.1.1 clade B.1 -B.1.1 nuc 74360 A +sh2017/B.1.1 clade sh2017/B.1 +sh2017/B.1.1 nuc 74360 A -B.1.2 clade B.1 -B.1.2 nuc 186165 A +sh2017/B.1.2 clade sh2017/B.1 +sh2017/B.1.2 nuc 186165 A -B.1.3 clade B.1 -B.1.3 nuc 190660 A +sh2017/B.1.3 clade sh2017/B.1 +sh2017/B.1.3 nuc 190660 A -C.1 clade B.1.3 -C.1 nuc 105923 A -C.1 nuc 64426 T -C.1 nuc 55133 A +sh2017/C.1 clade sh2017/B.1.3 +sh2017/C.1 nuc 105923 A +sh2017/C.1 nuc 64426 T +sh2017/C.1 nuc 55133 A -C.1.1 clade C.1 -C.1.1 nuc 21062 T -C.1.1 nuc 149963 T +sh2017/C.1.1 clade sh2017/C.1 +sh2017/C.1.1 nuc 21062 T +sh2017/C.1.1 nuc 149963 T -E.1 clade C.1.1 -E.1 nuc 13563 A -E.1 nuc 121394 T -E.1 nuc 162280 A +sh2017/E.1 clade sh2017/C.1.1 +sh2017/E.1 nuc 13563 A +sh2017/E.1 nuc 121394 T +sh2017/E.1 nuc 162280 A -E.1.1 clade E.1 -E.1.1 nuc 41405 T -E.1.1 nuc 157928 T +sh2017/E.1.1 clade sh2017/E.1 +sh2017/E.1.1 nuc 41405 T +sh2017/E.1.1 nuc 157928 T -E.2 clade C.1.1 -E.2 nuc 13563 A -E.2 nuc 151847 A -E.2 nuc 37738 T +sh2017/E.2 clade sh2017/C.1.1 +sh2017/E.2 nuc 13563 A +sh2017/E.2 nuc 151847 A +sh2017/E.2 nuc 37738 T -E.2.1 clade E.2 -E.2.1 nuc 55466 A -E.2.1 nuc 135121 T +sh2017/E.2.1 clade sh2017/E.2 +sh2017/E.2.1 nuc 55466 A +sh2017/E.2.1 nuc 135121 T -E.3 clade C.1.1 -E.3 nuc 142797 T +sh2017/E.3 clade sh2017/C.1.1 +sh2017/E.3 nuc 142797 T -E.3.1 clade E.3 -E.3.1 nuc 113957 T -E.3.1 nuc 74018 T +sh2017/E.3.1 clade sh2017/E.3 +sh2017/E.3.1 nuc 113957 T +sh2017/E.3.1 nuc 74018 T -E.4 clade C.1.1 -E.4 nuc 41806 A -E.4 nuc 136791 G +sh2017/E.4 clade sh2017/C.1.1 +sh2017/E.4 nuc 41806 A +sh2017/E.4 nuc 136791 G -C.1.2 clade C.1 -C.1.2 nuc 28142 A -C.1.2 nuc 126761 A +sh2017/C.1.2 clade sh2017/C.1 +sh2017/C.1.2 nuc 28142 A +sh2017/C.1.2 nuc 126761 A -C.1.3 clade C.1 -C.1.3 nuc 33332 T -C.1.3 nuc 37974 A - -B.1.4 clade B.1 -B.1.4 nuc 34308 A +sh2017/C.1.3 clade sh2017/C.1 +sh2017/C.1.3 nuc 33332 T +sh2017/C.1.3 nuc 37974 A + +sh2017/B.1.4 clade sh2017/B.1 +sh2017/B.1.4 nuc 34308 A -B.1.5 clade B.1 -B.1.5 nuc 70780 T +sh2017/B.1.5 clade sh2017/B.1 +sh2017/B.1.5 nuc 70780 T -B.1.6 clade B.1 -B.1.6 nuc 111029 A +sh2017/B.1.6 clade sh2017/B.1 +sh2017/B.1.6 nuc 111029 A -D.1 clade B.1.6 -D.1 nuc 10945 A -D.1 nuc 39515 A -D.1 nuc 44627 T -D.1 nuc 56276 A +sh2017/D.1 clade sh2017/B.1.6 +sh2017/D.1 nuc 10945 A +sh2017/D.1 nuc 39515 A +sh2017/D.1 nuc 44627 T +sh2017/D.1 nuc 56276 A -B.1.7 clade B.1 -B.1.7 nuc 25644 T +sh2017/B.1.7 clade sh2017/B.1 +sh2017/B.1.7 nuc 25644 T -B.1.8 clade B.1 -B.1.8 nuc 5595 A -B.1.8 nuc 191615 T +sh2017/B.1.8 clade sh2017/B.1 +sh2017/B.1.8 nuc 5595 A +sh2017/B.1.8 nuc 191615 T -B.1.9 clade B.1 -B.1.9 nuc 181367 A - -B.1.10 clade B.1 -B.1.10 nuc 89906 T -B.1.10 nuc 94798 A - -B.1.11 clade B.1 -B.1.11 nuc 18133 T -B.1.11 nuc 159277 A - -B.1.12 clade B.1 -B.1.12 nuc 182950 T +sh2017/B.1.9 clade sh2017/B.1 +sh2017/B.1.9 nuc 181367 A + +sh2017/B.1.10 clade sh2017/B.1 +sh2017/B.1.10 nuc 89906 T +sh2017/B.1.10 nuc 94798 A + +sh2017/B.1.11 clade sh2017/B.1 +sh2017/B.1.11 nuc 18133 T +sh2017/B.1.11 nuc 159277 A + +sh2017/B.1.12 clade sh2017/B.1 +sh2017/B.1.12 nuc 182950 T -B.1.13 clade B.1 -B.1.13 nuc 175093 A +sh2017/B.1.13 clade sh2017/B.1 +sh2017/B.1.13 nuc 175093 A -B.1.14 clade B.1 -B.1.14 nuc 36617 A -B.1.14 nuc 159779 T - -B.1.15 clade B.1 -B.1.15 nuc 149818 A -B.1.15 nuc 151362 A - -B.1.16 clade B.1 -B.1.16 nuc 9389 T -B.1.16 nuc 161797 A -B.1.16 nuc 185557 C - -B.1.17 clade B.1 -B.1.17 nuc 12169 A -B.1.17 nuc 44960 A - -B.1.18 clade B.1 -B.1.18 nuc 141757 T -B.1.18 nuc 43706 T -B.1.18 nuc 124690 C - -B.1.19 clade B.1 -B.1.19 nuc 9963 A -B.1.19 nuc 148268 T - -B.1.20 clade B.1 -B.1.20 nuc 53326 A -B.1.20 nuc 164385 T -B.1.20 nuc 187620 T - -F.1 clade B.1.20 -F.1 nuc 11668 A -F.1 nuc 35132 A -F.1 nuc 70414 T -F.1 nuc 70666 T -F.1 nuc 96938 T - -F.1.1 clade F.1 -F.1.1 nuc 133402 T -F.1.1 nuc 143277 T - -F.2 clade B.1.20 -F.2 nuc 161629 A -F.2 nuc 22167 T - -F.2.1 clade F.2 -F.2.1 nuc 44032 T -F.2.1 nuc 80820 A -F.2.1 nuc 165892 A - -F.3 clade B.1.20 -F.3 nuc 174050 T -F.3 nuc 180618 T - -F.4 clade B.1.20 -F.4 nuc 34277 T -F.4 nuc 92382 T -F.4 nuc 122551 T -F.4 nuc 126919 A -F.4 nuc 176643 A - -F.4.1 clade F.4 -F.4.1 nuc 21394 A -F.4.1 nuc 111492 T - -F.5 clade B.1.20 -F.5 nuc 150831 T -F.5 nuc 126169 A - -F.6 clade B.1.20 -F.6 nuc 146690 A -F.6 nuc 159608 T -F.6 nuc 168964 A - -B.1.21 clade B.1 -B.1.21 nuc 22415 A -B.1.21 nuc 132698 T - -B.1.22 clade B.1 -B.1.22 nuc 34784 T -B.1.22 nuc 101418 T - -J.1 clade B.1.22 -J.1 nuc 45528 T -J.1 nuc 121663 A - -B.1.23 clade B.1 -B.1.23 nuc 27935 A -B.1.23 nuc 64171 G -B.1.23 nuc 73235 T - -A.2 clade A -A.2 nuc 34472 T - -A.2.1 clade A.2 -A.2.1 nuc 25072 T -A.2.1 nuc 140492 C -A.2.1 nuc 179537 T - -H.1 clade A.2.1 -H.1 nuc 52289 A -H.1 nuc 67261 A -H.1 nuc 181947 A - -H.2 clade A.2.1 -H.2 nuc 43103 A -H.2 nuc 184924 T - -A.2.2 clade A.2 -A.2.2 nuc 21991 A -A.2.2 nuc 103019 T -A.2.2 nuc 158424 A - -G.1 clade A.2.2 -G.1 nuc 85413 T -G.1 nuc 164382 C - -A.2.3 clade A.2 -A.2.3 nuc 57284 T -A.2.3 nuc 74226 T - -A.2.4 clade A.2 -A.2.4 nuc 15105 T -A.2.4 nuc 179628 G - -A.2.5 clade A.2 -A.2.5 nuc 12426 T -A.2.5 nuc 134107 A - -A.3 clade A -A.3 nuc 96841 A -A.3 nuc 100971 T \ No newline at end of file +sh2017/B.1.14 clade sh2017/B.1 +sh2017/B.1.14 nuc 36617 A +sh2017/B.1.14 nuc 159779 T + +sh2017/B.1.15 clade sh2017/B.1 +sh2017/B.1.15 nuc 149818 A +sh2017/B.1.15 nuc 151362 A + +sh2017/B.1.16 clade sh2017/B.1 +sh2017/B.1.16 nuc 9389 T +sh2017/B.1.16 nuc 161797 A +sh2017/B.1.16 nuc 185557 C + +sh2017/B.1.17 clade sh2017/B.1 +sh2017/B.1.17 nuc 12169 A +sh2017/B.1.17 nuc 44960 A + +sh2017/B.1.18 clade sh2017/B.1 +sh2017/B.1.18 nuc 141757 T +sh2017/B.1.18 nuc 43706 T +sh2017/B.1.18 nuc 124690 C + +sh2017/B.1.19 clade sh2017/B.1 +sh2017/B.1.19 nuc 9963 A +sh2017/B.1.19 nuc 148268 T + +sh2017/B.1.20 clade sh2017/B.1 +sh2017/B.1.20 nuc 53326 A +sh2017/B.1.20 nuc 164385 T +sh2017/B.1.20 nuc 187620 T + +sh2017/F.1 clade sh2017/B.1.20 +sh2017/F.1 nuc 11668 A +sh2017/F.1 nuc 35132 A +sh2017/F.1 nuc 70414 T +sh2017/F.1 nuc 70666 T +sh2017/F.1 nuc 96938 T + +sh2017/F.1.1 clade sh2017/F.1 +sh2017/F.1.1 nuc 133402 T +sh2017/F.1.1 nuc 143277 T + +sh2017/F.2 clade sh2017/B.1.20 +sh2017/F.2 nuc 161629 A +sh2017/F.2 nuc 22167 T + +sh2017/F.2.1 clade sh2017/F.2 +sh2017/F.2.1 nuc 44032 T +sh2017/F.2.1 nuc 80820 A +sh2017/F.2.1 nuc 165892 A + +sh2017/F.3 clade sh2017/B.1.20 +sh2017/F.3 nuc 174050 T +sh2017/F.3 nuc 180618 T + +sh2017/F.4 clade sh2017/B.1.20 +sh2017/F.4 nuc 34277 T +sh2017/F.4 nuc 92382 T +sh2017/F.4 nuc 122551 T +sh2017/F.4 nuc 126919 A +sh2017/F.4 nuc 176643 A + +sh2017/F.4.1 clade sh2017/F.4 +sh2017/F.4.1 nuc 21394 A +sh2017/F.4.1 nuc 111492 T + +sh2017/F.5 clade sh2017/B.1.20 +sh2017/F.5 nuc 150831 T +sh2017/F.5 nuc 126169 A + +sh2017/F.6 clade sh2017/B.1.20 +sh2017/F.6 nuc 146690 A +sh2017/F.6 nuc 159608 T +sh2017/F.6 nuc 168964 A + +sh2017/B.1.21 clade sh2017/B.1 +sh2017/B.1.21 nuc 22415 A +sh2017/B.1.21 nuc 132698 T + +sh2017/B.1.22 clade sh2017/B.1 +sh2017/B.1.22 nuc 34784 T +sh2017/B.1.22 nuc 101418 T + +sh2017/J.1 clade sh2017/B.1.22 +sh2017/J.1 nuc 45528 T +sh2017/J.1 nuc 121663 A + +sh2017/B.1.23 clade sh2017/B.1 +sh2017/B.1.23 nuc 27935 A +sh2017/B.1.23 nuc 64171 G +sh2017/B.1.23 nuc 73235 T + +sh2017/A.2 clade sh2017/A +sh2017/A.2 nuc 34472 T + +sh2017/A.2.1 clade sh2017/A.2 +sh2017/A.2.1 nuc 25072 T +sh2017/A.2.1 nuc 140492 C +sh2017/A.2.1 nuc 179537 T + +sh2017/H.1 clade sh2017/A.2.1 +sh2017/H.1 nuc 52289 A +sh2017/H.1 nuc 67261 A +sh2017/H.1 nuc 181947 A + +sh2017/H.2 clade sh2017/A.2.1 +sh2017/H.2 nuc 43103 A +sh2017/H.2 nuc 184924 T + +sh2017/A.2.2 clade sh2017/A.2 +sh2017/A.2.2 nuc 21991 A +sh2017/A.2.2 nuc 103019 T +sh2017/A.2.2 nuc 158424 A + +sh2017/G.1 clade sh2017/A.2.2 +sh2017/G.1 nuc 85413 T +sh2017/G.1 nuc 164382 C + +sh2017/A.2.3 clade sh2017/A.2 +sh2017/A.2.3 nuc 57284 T +sh2017/A.2.3 nuc 74226 T + +sh2017/A.2.4 clade sh2017/A.2 +sh2017/A.2.4 nuc 15105 T +sh2017/A.2.4 nuc 179628 G + +sh2017/A.2.5 clade sh2017/A.2 +sh2017/A.2.5 nuc 12426 T +sh2017/A.2.5 nuc 134107 A + +sh2017/A.3 clade sh2017/A +sh2017/A.3 nuc 96841 A +sh2017/A.3 nuc 100971 T diff --git a/nextclade/resources/lineage-b.1/clades.tsv b/nextclade/resources/lineage-b.1/clades.tsv index 7d94583f..99b3b59e 100644 --- a/nextclade/resources/lineage-b.1/clades.tsv +++ b/nextclade/resources/lineage-b.1/clades.tsv @@ -1,197 +1,197 @@ # Nuc coordinates valid for reference NC_063383 (MPXV-M5312_HM12_Rivers) clade gene site alt -A.1.1 nuc 34459 A -A.1.1 nuc 77383 G +sh2017/A.1.1 nuc 34459 A +sh2017/A.1.1 nuc 77383 G # Just for B.1 build -unassigned clade A.1.1 +unassigned clade sh2017/A.1.1 -B.1 clade A.1.1 -B.1 nuc 77383 A +sh2017/B.1 clade sh2017/A.1.1 +sh2017/B.1 nuc 77383 A -B.1.1 clade B.1 -B.1.1 nuc 74360 A +sh2017/B.1.1 clade sh2017/B.1 +sh2017/B.1.1 nuc 74360 A -B.1.2 clade B.1 -B.1.2 nuc 186165 A +sh2017/B.1.2 clade sh2017/B.1 +sh2017/B.1.2 nuc 186165 A -B.1.3 clade B.1 -B.1.3 nuc 190660 A +sh2017/B.1.3 clade sh2017/B.1 +sh2017/B.1.3 nuc 190660 A -C.1 clade B.1.3 -C.1 nuc 105923 A -C.1 nuc 64426 T -C.1 nuc 55133 A +sh2017/C.1 clade sh2017/B.1.3 +sh2017/C.1 nuc 105923 A +sh2017/C.1 nuc 64426 T +sh2017/C.1 nuc 55133 A -C.1.1 clade C.1 -C.1.1 nuc 21062 T -C.1.1 nuc 149963 T +sh2017/C.1.1 clade sh2017/C.1 +sh2017/C.1.1 nuc 21062 T +sh2017/C.1.1 nuc 149963 T -E.1 clade C.1.1 -E.1 nuc 13563 A -E.1 nuc 121394 T -E.1 nuc 162280 A +sh2017/E.1 clade sh2017/C.1.1 +sh2017/E.1 nuc 13563 A +sh2017/E.1 nuc 121394 T +sh2017/E.1 nuc 162280 A -E.1.1 clade E.1 -E.1.1 nuc 41405 T -E.1.1 nuc 157928 T +sh2017/E.1.1 clade sh2017/E.1 +sh2017/E.1.1 nuc 41405 T +sh2017/E.1.1 nuc 157928 T -E.2 clade C.1.1 -E.2 nuc 13563 A -E.2 nuc 151847 A -E.2 nuc 37738 T +sh2017/E.2 clade sh2017/C.1.1 +sh2017/E.2 nuc 13563 A +sh2017/E.2 nuc 151847 A +sh2017/E.2 nuc 37738 T -E.2.1 clade E.2 -E.2.1 nuc 55466 A -E.2.1 nuc 135121 T +sh2017/E.2.1 clade sh2017/E.2 +sh2017/E.2.1 nuc 55466 A +sh2017/E.2.1 nuc 135121 T -E.3 clade C.1.1 -E.3 nuc 142797 T +sh2017/E.3 clade sh2017/C.1.1 +sh2017/E.3 nuc 142797 T -E.3.1 clade E.3 -E.3.1 nuc 113957 T -E.3.1 nuc 74018 T +sh2017/E.3.1 clade sh2017/E.3 +sh2017/E.3.1 nuc 113957 T +sh2017/E.3.1 nuc 74018 T -E.4 clade C.1.1 -E.4 nuc 41806 A -E.4 nuc 136791 G +sh2017/E.4 clade sh2017/C.1.1 +sh2017/E.4 nuc 41806 A +sh2017/E.4 nuc 136791 G -C.1.2 clade C.1 -C.1.2 nuc 28142 A -C.1.2 nuc 126761 A +sh2017/C.1.2 clade sh2017/C.1 +sh2017/C.1.2 nuc 28142 A +sh2017/C.1.2 nuc 126761 A -C.1.3 clade C.1 -C.1.3 nuc 33332 T -C.1.3 nuc 37974 A - -B.1.4 clade B.1 -B.1.4 nuc 34308 A +sh2017/C.1.3 clade sh2017/C.1 +sh2017/C.1.3 nuc 33332 T +sh2017/C.1.3 nuc 37974 A + +sh2017/B.1.4 clade sh2017/B.1 +sh2017/B.1.4 nuc 34308 A -B.1.5 clade B.1 -B.1.5 nuc 70780 T +sh2017/B.1.5 clade sh2017/B.1 +sh2017/B.1.5 nuc 70780 T -B.1.6 clade B.1 -B.1.6 nuc 111029 A +sh2017/B.1.6 clade sh2017/B.1 +sh2017/B.1.6 nuc 111029 A -D.1 clade B.1.6 -D.1 nuc 10945 A -D.1 nuc 39515 A -D.1 nuc 44627 T -D.1 nuc 56276 A +sh2017/D.1 clade sh2017/B.1.6 +sh2017/D.1 nuc 10945 A +sh2017/D.1 nuc 39515 A +sh2017/D.1 nuc 44627 T +sh2017/D.1 nuc 56276 A -B.1.7 clade B.1 -B.1.7 nuc 25644 T +sh2017/B.1.7 clade sh2017/B.1 +sh2017/B.1.7 nuc 25644 T -B.1.8 clade B.1 -B.1.8 nuc 5595 A -B.1.8 nuc 191615 T +sh2017/B.1.8 clade sh2017/B.1 +sh2017/B.1.8 nuc 5595 A +sh2017/B.1.8 nuc 191615 T -B.1.9 clade B.1 -B.1.9 nuc 181367 A - -B.1.10 clade B.1 -B.1.10 nuc 89906 T -B.1.10 nuc 94798 A - -B.1.11 clade B.1 -B.1.11 nuc 18133 T -B.1.11 nuc 159277 A - -B.1.12 clade B.1 -B.1.12 nuc 182950 T - -B.1.13 clade B.1 -B.1.13 nuc 175093 A - -B.1.14 clade B.1 -B.1.14 nuc 36617 A -B.1.14 nuc 159779 T - -B.1.15 clade B.1 -B.1.15 nuc 149818 A -B.1.15 nuc 151362 A - -B.1.16 clade B.1 -B.1.16 nuc 9389 T -B.1.16 nuc 161797 A -B.1.16 nuc 185557 C - -B.1.17 clade B.1 -B.1.17 nuc 12169 A -B.1.17 nuc 44960 A - -B.1.18 clade B.1 -B.1.18 nuc 141757 T -B.1.18 nuc 43706 T -B.1.18 nuc 124690 C - -B.1.19 clade B.1 -B.1.19 nuc 9963 A -B.1.19 nuc 148268 T - -B.1.20 clade B.1 -B.1.20 nuc 53326 A -B.1.20 nuc 164385 T -B.1.20 nuc 187620 T - -F.1 clade B.1.20 -F.1 nuc 11668 A -F.1 nuc 35132 A -F.1 nuc 70414 T -F.1 nuc 70666 T -F.1 nuc 96938 T - -F.1.1 clade F.1 -F.1.1 nuc 133402 T -F.1.1 nuc 143277 T - -F.2 clade B.1.20 -F.2 nuc 161629 A -F.2 nuc 22167 T - -F.2.1 clade F.2 -F.2.1 nuc 44032 T -F.2.1 nuc 80820 A -F.2.1 nuc 165892 A - -F.3 clade B.1.20 -F.3 nuc 174050 T -F.3 nuc 180618 T - -F.4 clade B.1.20 -F.4 nuc 34277 T -F.4 nuc 92382 T -F.4 nuc 122551 T -F.4 nuc 126919 A -F.4 nuc 176643 A - -F.4.1 clade F.4 -F.4.1 nuc 21394 A -F.4.1 nuc 111492 T - -F.5 clade B.1.20 -F.5 nuc 150831 T -F.5 nuc 126169 A - -F.6 clade B.1.20 -F.6 nuc 146690 A -F.6 nuc 159608 T -F.6 nuc 168964 A - -B.1.21 clade B.1 -B.1.21 nuc 22415 A -B.1.21 nuc 132698 T - -B.1.22 clade B.1 -B.1.22 nuc 34784 T -B.1.22 nuc 101418 T - -J.1 clade B.1.22 -J.1 nuc 45528 T -J.1 nuc 121663 A - -B.1.23 clade B.1 -B.1.23 nuc 27935 A -B.1.23 nuc 64171 G -B.1.23 nuc 73235 T +sh2017/B.1.9 clade sh2017/B.1 +sh2017/B.1.9 nuc 181367 A + +sh2017/B.1.10 clade sh2017/B.1 +sh2017/B.1.10 nuc 89906 T +sh2017/B.1.10 nuc 94798 A + +sh2017/B.1.11 clade sh2017/B.1 +sh2017/B.1.11 nuc 18133 T +sh2017/B.1.11 nuc 159277 A + +sh2017/B.1.12 clade sh2017/B.1 +sh2017/B.1.12 nuc 182950 T + +sh2017/B.1.13 clade sh2017/B.1 +sh2017/B.1.13 nuc 175093 A + +sh2017/B.1.14 clade sh2017/B.1 +sh2017/B.1.14 nuc 36617 A +sh2017/B.1.14 nuc 159779 T + +sh2017/B.1.15 clade sh2017/B.1 +sh2017/B.1.15 nuc 149818 A +sh2017/B.1.15 nuc 151362 A + +sh2017/B.1.16 clade sh2017/B.1 +sh2017/B.1.16 nuc 9389 T +sh2017/B.1.16 nuc 161797 A +sh2017/B.1.16 nuc 185557 C + +sh2017/B.1.17 clade sh2017/B.1 +sh2017/B.1.17 nuc 12169 A +sh2017/B.1.17 nuc 44960 A + +sh2017/B.1.18 clade sh2017/B.1 +sh2017/B.1.18 nuc 141757 T +sh2017/B.1.18 nuc 43706 T +sh2017/B.1.18 nuc 124690 C + +sh2017/B.1.19 clade sh2017/B.1 +sh2017/B.1.19 nuc 9963 A +sh2017/B.1.19 nuc 148268 T + +sh2017/B.1.20 clade sh2017/B.1 +sh2017/B.1.20 nuc 53326 A +sh2017/B.1.20 nuc 164385 T +sh2017/B.1.20 nuc 187620 T + +sh2017/F.1 clade sh2017/B.1.20 +sh2017/F.1 nuc 11668 A +sh2017/F.1 nuc 35132 A +sh2017/F.1 nuc 70414 T +sh2017/F.1 nuc 70666 T +sh2017/F.1 nuc 96938 T + +sh2017/F.1.1 clade sh2017/F.1 +sh2017/F.1.1 nuc 133402 T +sh2017/F.1.1 nuc 143277 T + +sh2017/F.2 clade sh2017/B.1.20 +sh2017/F.2 nuc 161629 A +sh2017/F.2 nuc 22167 T + +sh2017/F.2.1 clade sh2017/F.2 +sh2017/F.2.1 nuc 44032 T +sh2017/F.2.1 nuc 80820 A +sh2017/F.2.1 nuc 165892 A + +sh2017/F.3 clade sh2017/B.1.20 +sh2017/F.3 nuc 174050 T +sh2017/F.3 nuc 180618 T + +sh2017/F.4 clade sh2017/B.1.20 +sh2017/F.4 nuc 34277 T +sh2017/F.4 nuc 92382 T +sh2017/F.4 nuc 122551 T +sh2017/F.4 nuc 126919 A +sh2017/F.4 nuc 176643 A + +sh2017/F.4.1 clade sh2017/F.4 +sh2017/F.4.1 nuc 21394 A +sh2017/F.4.1 nuc 111492 T + +sh2017/F.5 clade sh2017/B.1.20 +sh2017/F.5 nuc 150831 T +sh2017/F.5 nuc 126169 A + +sh2017/F.6 clade sh2017/B.1.20 +sh2017/F.6 nuc 146690 A +sh2017/F.6 nuc 159608 T +sh2017/F.6 nuc 168964 A + +sh2017/B.1.21 clade sh2017/B.1 +sh2017/B.1.21 nuc 22415 A +sh2017/B.1.21 nuc 132698 T + +sh2017/B.1.22 clade sh2017/B.1 +sh2017/B.1.22 nuc 34784 T +sh2017/B.1.22 nuc 101418 T + +sh2017/J.1 clade sh2017/B.1.22 +sh2017/J.1 nuc 45528 T +sh2017/J.1 nuc 121663 A + +sh2017/B.1.23 clade sh2017/B.1 +sh2017/B.1.23 nuc 27935 A +sh2017/B.1.23 nuc 64171 G +sh2017/B.1.23 nuc 73235 T diff --git a/nextclade/scripts/clades_renaming.py b/nextclade/scripts/clades_renaming.py index 69271c30..5e2a9d39 100644 --- a/nextclade/scripts/clades_renaming.py +++ b/nextclade/scripts/clades_renaming.py @@ -3,6 +3,19 @@ from Bio import Phylo +OUTBREAK_CLADES = { + "sh2017": "IIb", + "sh2023": "Ib", +} + + +def split_outbreak_lineage(clade_name: str) -> tuple[str, str]: + outbreak_name, lineage_name = clade_name.split("/", maxsplit=1) + if outbreak_name not in OUTBREAK_CLADES or not lineage_name: + raise ValueError(f"Invalid outbreak/lineage clade name: {clade_name}") + return outbreak_name, lineage_name + + if __name__ == "__main__": parser = argparse.ArgumentParser( description="Split clade membership into clade, outbreak and lineage", @@ -31,9 +44,7 @@ outbreak_name = "" lineage_name = "" - # if it starts with clade -> it's a clade - # if it starts with outbreak -> it's outbreak, need to look up clade - # if it starts with lineage -> it's clade IIb, outbreak hMPXV-1 + # Namespaced lineages identify both their outbreak and parent clade. if old_clade_name.startswith("clade"): clade_name = old_clade_name.split()[1] match clade_name: @@ -44,16 +55,13 @@ elif old_clade_name == "sh2024": clade_name = "Ia" outbreak_name = old_clade_name - elif old_clade_name == "sh2017": - clade_name = "IIb" - outbreak_name = old_clade_name - lineage_name = "A" + elif "/" in old_clade_name: + outbreak_name, lineage_name = split_outbreak_lineage(old_clade_name) + clade_name = OUTBREAK_CLADES[outbreak_name] elif old_clade_name.startswith(args.outgroup_clade_name) or old_clade_name == "unassigned" or old_clade_name == "": clade_name = args.outgroup_clade_name else: - clade_name = "IIb" - outbreak_name = "sh2017" - lineage_name = old_clade_name + raise ValueError(f"Unrecognized clade name: {old_clade_name}") node_data = { "clade_membership": clade_name, @@ -78,20 +86,15 @@ new_branch_labels = {} for name, node in data["branches"].items(): - # Rename sh2017 -> sh2017/A - # Rename clade Ib -> clade IIb/outbreak sh2023 + # Clade Ib is also the root of outbreak sh2023. if "labels" in node and "clade" in node["labels"]: def make_label(label: str) -> dict: return {"labels": {"clade": label}} match node["labels"]["clade"]: - case "sh2017": - new_branch_labels[name] = make_label("sh2017/A") case "clade Ib": new_branch_labels[name] = make_label("clade Ib/sh2023") - case "A": - new_branch_labels[name] = make_label("sh2017/A") case _: new_branch_labels[name] = node data["branches"] = new_branch_labels From 031f11fb89447ece435de5f33a3a5e1e4bcc0ea0 Mon Sep 17 00:00:00 2001 From: Cornelius Roemer Date: Thu, 11 Jun 2026 15:32:32 +0200 Subject: [PATCH 6/9] Adding new lineage definitions to clades, make deduplication more robust --- nextclade/Snakefile | 64 +- nextclade/resources/all-clades/clades.tsv | 26 +- .../all-clades/include_accessions.txt | 14 + nextclade/resources/clade-i/clades.tsv | 24 + .../resources/clade-i/include_accessions.txt | 14 + nextclade/resources/color_ordering.tsv | 3 + nextclade/resources/known_duplicates.txt | 785 ++++++++++++++++++ nextclade/scripts/clades_renaming.py | 19 +- nextclade/scripts/deduplicate.py | 83 +- 9 files changed, 985 insertions(+), 47 deletions(-) diff --git a/nextclade/Snakefile b/nextclade/Snakefile index 5485adae..dae5f2af 100644 --- a/nextclade/Snakefile +++ b/nextclade/Snakefile @@ -106,11 +106,38 @@ rule decompress_metadata: """ +rule filter_known_duplicates: + input: + known_duplicates="resources/known_duplicates.txt", + includes=[ + "resources/include_accessions.txt", + expand( + "resources/{build_name}/include_accessions.txt", build_name=BUILD_NAMES + ), + "resources/all-clades/include_recombinants.txt", + ], + output: + "results/known_duplicates_to_exclude.txt", + run: + known_duplicates = { + line.strip() for line in open(input.known_duplicates) if line.strip() + } + includes = set() + for path in input.includes: + for line in open(path): + accession = line.split("#", maxsplit=1)[0].strip() + if accession: + includes.add(accession) + with open(output[0], "w") as file: + for accession in sorted(known_duplicates - includes): + print(accession, file=file) + + rule decompress_sequences_and_remove_duplicates: "Decompressing sequences and strip version from fasta ID" input: sequences="data/{file}.fasta.zst", - known_duplicates="resources/known_duplicates.txt", + known_duplicates="results/known_duplicates_to_exclude.txt", output: sequences="data/{file}.fasta", params: @@ -156,18 +183,30 @@ rule premask: rule deduplicate: - """ - Remove identical sequences (even if they have differing Ns) - Keep those sequences with fewer Ns - Focus for Nextclade is on diversity, not on representativeness - """ + # Remove identical sequences (even if they have differing Ns) + # Keep those sequences with fewer Ns + # Focus for Nextclade is on diversity, not on representativeness input: sequences="results/premasked.fasta", + includes=[ + "resources/include_accessions.txt", + expand( + "resources/{build_name}/include_accessions.txt", build_name=BUILD_NAMES + ), + "resources/all-clades/include_recombinants.txt", + ], output: "results/duplicates.txt", + params: + include_options=lambda w, input: " ".join( + f"--include {path}" for path in input.includes + ), shell: """ - python3 scripts/deduplicate.py {input.sequences} {output} + python3 scripts/deduplicate.py \ + {input.sequences} \ + {output} \ + {params.include_options} """ @@ -399,11 +438,20 @@ rule deduplicate_2: # Focus for Nextclade is on diversity, not on representativeness input: sequences="results/{build_name}/masked_with_dups.fasta", + include=lambda w: config[w.build_name]["general_include"], + specific_include="resources/{build_name}/include_accessions.txt", output: duplicates="results/{build_name}/duplicates.txt", + params: + include_options=lambda w, input: " ".join( + f"--include {path}" for path in [input.include, input.specific_include] + ), shell: """ - python3 scripts/deduplicate.py {input.sequences} {output.duplicates} + python3 scripts/deduplicate.py \ + {input.sequences} \ + {output.duplicates} \ + {params.include_options} """ diff --git a/nextclade/resources/all-clades/clades.tsv b/nextclade/resources/all-clades/clades.tsv index 54fa03da..14f8911d 100644 --- a/nextclade/resources/all-clades/clades.tsv +++ b/nextclade/resources/all-clades/clades.tsv @@ -20,6 +20,30 @@ sh2024 nuc 171897 A clade Ib clade clade I clade Ib nuc 19455 T +sh2023/A.1 clade clade Ib +sh2023/A.1 nuc 140753 A +sh2023/A.1 nuc 186208 A + +sh2023/A.2 clade clade Ib +sh2023/A.2 nuc 138816 A +sh2023/A.2 nuc 165799 T + +sh2023/A.3 clade clade Ib +sh2023/A.3 nuc 54739 G +sh2023/A.3 nuc 128447 T + +sh2023/A.4 clade clade Ib +sh2023/A.4 nuc 149636 T +sh2023/A.4 nuc 171609 A + +sh2023/A.4.1 clade sh2023/A.4 +sh2023/A.4.1 nuc 3656 A +sh2023/A.4.1 nuc 17707 T + +sh2023/A.5 clade clade Ib +sh2023/A.5 nuc 4301 T +sh2023/A.5 nuc 127872 A + clade II nuc 86502 G clade II nuc 150970 A clade II nuc 35352 C @@ -270,4 +294,4 @@ sh2017/A.2.5 nuc 134107 A sh2017/A.3 clade sh2017/A sh2017/A.3 nuc 96841 A -sh2017/A.3 nuc 100971 T \ No newline at end of file +sh2017/A.3 nuc 100971 T diff --git a/nextclade/resources/all-clades/include_accessions.txt b/nextclade/resources/all-clades/include_accessions.txt index 3f1d74e6..4a3758e1 100644 --- a/nextclade/resources/all-clades/include_accessions.txt +++ b/nextclade/resources/all-clades/include_accessions.txt @@ -1,5 +1,19 @@ reconstructed_ancestral_mpox #reference +PP_000ZHUV #reference for sh2023/A +PP_000SV68 #reference for sh2023/A +PP_004JQPQ #reference for sh2023/A.1 +PP_0014F50 #reference for sh2023/A.2 +PP_006VEEV #reference for sh2023/A.2 +PP_004BJA4 #reference for sh2023/A.3 +PP_0014F18 #reference for sh2023/A.3 +PP_006KNVA #reference for sh2023/A.4 +PP_004G68A #reference for sh2023/A.4 +PP_006XGN6 #reference for sh2023/A.4.1 +PP_006WSXE #reference for sh2023/A.4.1 +PP_001016L #reference for sh2023/A.5 +PP_006KPSF #reference for sh2023/A.5 + MT903337 #reference for A PP_000T5FC #reference for A MK783031 #reference for A diff --git a/nextclade/resources/clade-i/clades.tsv b/nextclade/resources/clade-i/clades.tsv index df0aa076..747d125c 100644 --- a/nextclade/resources/clade-i/clades.tsv +++ b/nextclade/resources/clade-i/clades.tsv @@ -13,3 +13,27 @@ sh2024 nuc 189974 T clade Ib clade clade I clade Ib nuc 91698 A + +sh2023/A.1 clade clade Ib +sh2023/A.1 nuc 142696 A +sh2023/A.1 nuc 185991 A + +sh2023/A.2 clade clade Ib +sh2023/A.2 nuc 140762 A +sh2023/A.2 nuc 165512 T + +sh2023/A.3 clade clade Ib +sh2023/A.3 nuc 57123 G +sh2023/A.3 nuc 130845 T + +sh2023/A.4 clade clade Ib +sh2023/A.4 nuc 151617 T +sh2023/A.4 nuc 171422 A + +sh2023/A.4.1 clade sh2023/A.4 +sh2023/A.4.1 nuc 3703 A +sh2023/A.4.1 nuc 17884 T + +sh2023/A.5 clade clade Ib +sh2023/A.5 nuc 4348 T +sh2023/A.5 nuc 130270 A diff --git a/nextclade/resources/clade-i/include_accessions.txt b/nextclade/resources/clade-i/include_accessions.txt index 1d624d10..78cdc5d7 100644 --- a/nextclade/resources/clade-i/include_accessions.txt +++ b/nextclade/resources/clade-i/include_accessions.txt @@ -4,6 +4,20 @@ KJ642617 # outgroup IIb PP_000T2N0 # outgroup IIb reconstructed_ancestral_mpox #reference +PP_000ZHUV #reference for sh2023/A +PP_000SV68 #reference for sh2023/A +PP_004JQPQ #reference for sh2023/A.1 +PP_0014F50 #reference for sh2023/A.2 +PP_006VEEV #reference for sh2023/A.2 +PP_004BJA4 #reference for sh2023/A.3 +PP_0014F18 #reference for sh2023/A.3 +PP_006KNVA #reference for sh2023/A.4 +PP_004G68A #reference for sh2023/A.4 +PP_006XGN6 #reference for sh2023/A.4.1 +PP_006WSXE #reference for sh2023/A.4.1 +PP_001016L #reference for sh2023/A.5 +PP_006KPSF #reference for sh2023/A.5 + PP_000STVX PP_000ZHHH PP_0010A3H diff --git a/nextclade/resources/color_ordering.tsv b/nextclade/resources/color_ordering.tsv index 70deed46..d8bd9b9b 100644 --- a/nextclade/resources/color_ordering.tsv +++ b/nextclade/resources/color_ordering.tsv @@ -291,6 +291,9 @@ lineage A.2.3 lineage A.2.4 lineage A.2.5 lineage A.3 +lineage A.4 +lineage A.4.1 +lineage A.5 ################ diff --git a/nextclade/resources/known_duplicates.txt b/nextclade/resources/known_duplicates.txt index 26b97019..4e4a8722 100644 --- a/nextclade/resources/known_duplicates.txt +++ b/nextclade/resources/known_duplicates.txt @@ -747,6 +747,7 @@ PP_000TYWN PP_000TYYJ PP_000TZ0E PP_000TZ46 +PP_000TZ54 PP_000TZ62 PP_000TZAU PP_000TZBS @@ -985,11 +986,13 @@ PP_000UBV9 PP_000UBW7 PP_000UBZ1 PP_000UC0Z +PP_000UC1X PP_000UC4R PP_000UC8H PP_000UCBB PP_000UCF3 PP_000UCMQ +PP_000UCPL PP_000UCQJ PP_000UCRG PP_000UCSE @@ -1144,6 +1147,7 @@ PP_000UMEW PP_000UMHP PP_000UMJM PP_000UMKK +PP_000UMMF PP_000UMQ9 PP_000UMS5 PP_000UMT3 @@ -1432,6 +1436,7 @@ PP_000V5SK PP_000V5TH PP_000V5WB PP_000V5X9 +PP_000V62Z PP_000V66R PP_000V6AH PP_000V6BF @@ -1506,6 +1511,7 @@ PP_000VABB PP_000VAE5 PP_000VAG1 PP_000VAJW +PP_000VAKU PP_000VASE PP_000VAUA PP_000VAZ0 @@ -1877,6 +1883,7 @@ PP_000VYZC PP_000VZ0A PP_000VZ18 PP_000VZ34 +PP_000VZ42 PP_000VZ8U PP_000VZFE PP_000VZGC @@ -2187,6 +2194,7 @@ PP_000WP90 PP_000WPAY PP_000WPBW PP_000WPGL +PP_000WPKD PP_000WPLB PP_000WPVT PP_000WPWR @@ -2273,6 +2281,7 @@ PP_000WUEK PP_000WUGF PP_000WUHC PP_000WUJA +PP_000WUK8 PP_000WUM4 PP_000WUQY PP_000WURW @@ -2284,6 +2293,7 @@ PP_000WUZE PP_000WV36 PP_000WV44 PP_000WV52 +PP_000WVCN PP_000WVDL PP_000WVFG PP_000WVGE @@ -2769,6 +2779,7 @@ PP_000XLDT PP_000XLER PP_000XLFP PP_000XLGM +PP_000XLJG PP_000XLN8 PP_000XLS0 PP_000XLUW @@ -4642,6 +4653,7 @@ PP_0013C9X PP_0013CBT PP_0013CEM PP_0013CFK +PP_0013CGH PP_0013CHE PP_0013CKA PP_0013CM6 @@ -4753,6 +4765,7 @@ PP_0013HDJ PP_0013HGC PP_0013HH9 PP_0013HK5 +PP_0013HM1 PP_0013HNZ PP_0013HQV PP_0013HRT @@ -4835,6 +4848,7 @@ PP_00140QA PP_00140R8 PP_00140U2 PP_00140V0 +PP_00140WY PP_00140XW PP_001411N PP_00143S3 @@ -5134,6 +5148,7 @@ PP_0015HJ3 PP_0015HK1 PP_0015HPT PP_0015HQR +PP_0015HRP PP_0015HTK PP_0015HVF PP_0015HXB @@ -5160,8 +5175,10 @@ PP_0015LBF PP_0015LCD PP_0015LE9 PP_0015LF7 +PP_0015LG5 PP_0015LJ0 PP_0015LKY +PP_0015LNS PP_002XKR1 PP_002XKSZ PP_002XKTX @@ -5177,17 +5194,21 @@ PP_002XLFM PP_002XLLA PP_002XLM8 PP_002XLN6 +PP_002XQ8X PP_002XQ9V PP_002XQDM PP_002XQEK PP_002XQGF PP_002XQK8 +PP_002XQRW PP_002XQTS PP_002XQUQ +PP_002XQVN PP_002XQWL PP_002XQYG PP_002XQZE PP_002XR28 +PP_002XR52 PP_002XR60 PP_002Y09H PP_002Y0AF @@ -5223,6 +5244,7 @@ PP_002Y25P PP_002Y28H PP_002Y2C9 PP_002Y2NN +PP_002Y2TC PP_002Y2V8 PP_002Y30Y PP_002Y7FY @@ -5269,6 +5291,7 @@ PP_0031VPM PP_0031VY3 PP_0031W1X PP_0031WUA +PP_003204K PP_00321KM PP_0033A47 PP_0033A55 @@ -5465,7 +5488,125 @@ PP_003RMC3 PP_003RMD1 PP_003RMHS PP_003RMKN +PP_003RMLL PP_003RMNG +PP_003RMPE +PP_003RMV2 +PP_003RMW0 +PP_003RMXY +PP_003RMYW +PP_003RMZU +PP_003RN0S +PP_003RN1Q +PP_003RN2N +PP_003RN3L +PP_003RN4J +PP_003RN5G +PP_003RN6E +PP_003RN7C +PP_003RN8A +PP_003RN98 +PP_003RNA6 +PP_003RNB4 +PP_003RNC2 +PP_003RND0 +PP_003RNEY +PP_003RNFW +PP_003RNGU +PP_003RNR9 +PP_003RP4H +PP_003RP5F +PP_003RP6D +PP_003RP7B +PP_003RP89 +PP_003RP97 +PP_003RPA5 +PP_003RPB3 +PP_003RPDZ +PP_003RPEX +PP_003RPFV +PP_003RPGT +PP_003RPHQ +PP_003RPJN +PP_003RPKL +PP_003RPLJ +PP_003RPMG +PP_003RPNE +PP_003RPPC +PP_003RPQA +PP_003RPR8 +PP_003RPS6 +PP_003RPT4 +PP_003RPU2 +PP_003RPV0 +PP_003RPWY +PP_003RPXW +PP_003RPYU +PP_003RPZS +PP_003RQ0Q +PP_003RQ1N +PP_003RQ2L +PP_003RQ3J +PP_003RQ4G +PP_003RQ5E +PP_003RQ6C +PP_003RQ7A +PP_003RQ88 +PP_003RQA4 +PP_003RQB2 +PP_003RQDY +PP_003RQEW +PP_003RQFU +PP_003RQGS +PP_003RQHP +PP_003RQJM +PP_003RQKK +PP_003RQLH +PP_003RQMF +PP_003RQND +PP_003RQPB +PP_003RQQ9 +PP_003RQR7 +PP_003RQS5 +PP_003RQT3 +PP_003RQU1 +PP_003RQVZ +PP_003RQWX +PP_003RQXV +PP_003RQYT +PP_003RQZR +PP_003RR0P +PP_003RR1M +PP_003RR2K +PP_003RR3H +PP_003RR4F +PP_003RR5D +PP_003RR6B +PP_003RR79 +PP_003RR87 +PP_003RRCZ +PP_003RRDX +PP_003RREV +PP_003RRFT +PP_003RRGR +PP_003RRHN +PP_003RRJL +PP_003RRKJ +PP_003RRLG +PP_003RRME +PP_003RRNC +PP_003RRPA +PP_003RRQ8 +PP_003RRR6 +PP_003RRS4 +PP_003RRT2 +PP_003RRU0 +PP_003RRVY +PP_003RRWW +PP_003RSEU +PP_003RSFS +PP_003RSGQ +PP_003RSHM PP_003RTDV PP_003V39K PP_003V3BF @@ -5480,6 +5621,7 @@ PP_0049BKW PP_0049BPN PP_0049BQL PP_0049BSG +PP_0049BVA PP_0049MGT PP_0049MHQ PP_0049MKL @@ -5506,6 +5648,7 @@ PP_0049YBS PP_0049YCQ PP_004A00A PP_004A1TN +PP_004A1UL PP_004A1VJ PP_004AFFZ PP_004AFGX @@ -5774,6 +5917,7 @@ PP_004AXRW PP_004AXVN PP_004AXWL PP_004AY1A +PP_004AYAS PP_004AYCN PP_004AYDL PP_004AYM3 @@ -6006,6 +6150,7 @@ PP_004BDSA PP_004BDT8 PP_004BDU6 PP_004BDV4 +PP_004BDX0 PP_004BE0U PP_004BE2Q PP_004BE3N @@ -6133,6 +6278,7 @@ PP_004C6V9 PP_004C6W7 PP_004C6Z1 PP_004C70Z +PP_004C71X PP_004C74R PP_004C76M PP_004C77K @@ -6156,6 +6302,7 @@ PP_004D1WA PP_004D1Y6 PP_004D1Z4 PP_004D24U +PP_004D26Q PP_004D28L PP_004D29J PP_004D2AG @@ -6167,3 +6314,641 @@ PP_004D7PJ PP_004D7SC PP_004D7V6 PP_004D7Y0 +PP_004EB5F +PP_004EB6D +PP_004EB7B +PP_004EBA5 +PP_004EBGT +PP_004EBKL +PP_004EBPC +PP_004EC4G +PP_004EC96 +PP_004ECEW +PP_004ECGS +PP_004ECR7 +PP_004ECS5 +PP_004ECT3 +PP_004ECVZ +PP_004ECWX +PP_004ECZR +PP_004ED79 +PP_004EDB1 +PP_004F3D5 +PP_004F3F1 +PP_004F3GZ +PP_004F3HW +PP_004F3LQ +PP_004F3PJ +PP_004F3RE +PP_004F3SC +PP_004FJP3 +PP_004FJQ1 +PP_004FJRZ +PP_004FJSX +PP_004FJWP +PP_004FJZH +PP_004H8BZ +PP_004H8ET +PP_004H8FR +PP_004H8GP +PP_004HDZH +PP_004HE0F +PP_004HE1D +PP_004HE47 +PP_004HE55 +PP_004HE71 +PP_004HE8Z +PP_004HE9X +PP_004HEAV +PP_004HECR +PP_004HEZG +PP_004HG0D +PP_004HG29 +PP_004HGCP +PP_004HGDM +PP_004HGFH +PP_004HGUQ +PP_004HGVN +PP_004HGXJ +PP_004HJWJ +PP_004HK0A +PP_004HK18 +PP_004HK26 +PP_004HK34 +PP_004HK50 +PP_004HK7W +PP_004HK8U +PP_004HKDJ +PP_004HKFE +PP_004J3DY +PP_004J3HP +PP_004J4EV +PP_004JCZG +PP_004JD1C +PP_004JD2A +PP_004JDCQ +PP_004JQQN +PP_004K477 +PP_004K485 +PP_004KJVG +PP_004KWGX +PP_004KYGV +PP_004KYJQ +PP_004KYMJ +PP_004KYNG +PP_004KYQC +PP_004KYRA +PP_004KYS8 +PP_004KYU4 +PP_004M366 +PP_004M374 +PP_004M3FN +PP_004M3GL +PP_004M3LB +PP_004M3M9 +PP_004M3R1 +PP_004M3WR +PP_004M3XP +PP_004M89V +PP_0052PPP +PP_0052PRK +PP_006KH9N +PP_006KHAL +PP_006KHCG +PP_006KHDE +PP_006KHG8 +PP_006KHK1 +PP_006KHPT +PP_006KHQR +PP_006KHRP +PP_006KHSM +PP_006KHUH +PP_006KHVF +PP_006KHWD +PP_006KHXB +PP_006KHY9 +PP_006KHZ7 +PP_006KJ05 +PP_006KJ21 +PP_006KJ3Z +PP_006KJ4X +PP_006KJ5V +PP_006KJ6T +PP_006KJ7R +PP_006KJ8P +PP_006KJ9M +PP_006KJBH +PP_006KJDD +PP_006KJEB +PP_006KJH4 +PP_006KJNU +PP_006KJPS +PP_006KJQQ +PP_006KJRN +PP_006KJSL +PP_006KJTJ +PP_006KJUG +PP_006KJWC +PP_006KJZ6 +PP_006KK04 +PP_006KK20 +PP_006KK3Y +PP_006KK4W +PP_006KK5U +PP_006KK6S +PP_006KK8N +PP_006KK9L +PP_006KKCE +PP_006KKDC +PP_006KKEA +PP_006KKF8 +PP_006KKG6 +PP_006KKH3 +PP_006KKKZ +PP_006KKMV +PP_006KKQP +PP_006KKRM +PP_006KKSK +PP_006KKTH +PP_006KKVD +PP_006KKWB +PP_006KKX9 +PP_006KKY7 +PP_006KKZ5 +PP_006KL03 +PP_006KL11 +PP_006KL2Z +PP_006KL3X +PP_006KL4V +PP_006KL6R +PP_006KL8M +PP_006KLAH +PP_006KLCD +PP_006KLE9 +PP_006KLG5 +PP_006KLH2 +PP_006KLKY +PP_006KLTG +PP_006KLUE +PP_006KLX8 +PP_006KM02 +PP_006KM10 +PP_006KM4U +PP_006KM8L +PP_006KM9J +PP_006KMAG +PP_006KMBE +PP_006KMCC +PP_006KMDA +PP_006KME8 +PP_006KMF6 +PP_006KMG4 +PP_006KMH1 +PP_006KMJZ +PP_006KMKX +PP_006KMLV +PP_006KMQM +PP_006KMSH +PP_006KMTF +PP_006KMW9 +PP_006KMX7 +PP_006KMY5 +PP_006KN01 +PP_006KN3V +PP_006KN5R +PP_006KN6P +PP_006KN9H +PP_006KNAF +PP_006KNBD +PP_006KNCB +PP_006KND9 +PP_006KNE7 +PP_006KNF5 +PP_006KNG3 +PP_006KNH0 +PP_006KNJY +PP_006KNKW +PP_006KNNQ +PP_006KNQL +PP_006KNRJ +PP_006KNSG +PP_006KNTE +PP_006KNUC +PP_006KNY4 +PP_006KP00 +PP_006KP1Y +PP_006KP4S +PP_006KP6N +PP_006KP8J +PP_006KP9G +PP_006KPE6 +PP_006KPG2 +PP_006KPHZ +PP_006KPJX +PP_006KPLT +PP_006KPMR +PP_006KPNP +PP_006KPPM +PP_006KPTD +PP_006KPUB +PP_006KPV9 +PP_006KPW7 +PP_006KPX5 +PP_006KPY3 +PP_006KQ0Z +PP_006KQ1X +PP_006KQ2V +PP_006KQ3T +PP_006KQ4R +PP_006KQ5P +PP_006KQ6M +PP_006KQ7K +PP_006KQAD +PP_006KQBB +PP_006KQC9 +PP_006KQD7 +PP_006KQE5 +PP_006KQHY +PP_006KQKU +PP_006KQLS +PP_006KQMQ +PP_006KQSE +PP_006KQTC +PP_006KQUA +PP_006KQW6 +PP_006KQX4 +PP_006KR0Y +PP_006KR2U +PP_006KR4Q +PP_006KR6L +PP_006KR7J +PP_006KR8G +PP_006KR9E +PP_006KRAC +PP_006KRBA +PP_006KRPK +PP_006KRQH +PP_006KRSD +PP_006KRTB +PP_006KRV7 +PP_006KRY1 +PP_006KRZZ +PP_006KS1V +PP_006KS2T +PP_006KS5M +PP_006KS6K +PP_006KS8F +PP_006KS9D +PP_006KSC7 +PP_006KSF1 +PP_006KSGZ +PP_006KSJU +PP_006KSKS +PP_006KSLQ +PP_006KSMN +PP_006KSNL +PP_006KSQG +PP_006KSRE +PP_006KSTA +PP_006KSU8 +PP_006KSW4 +PP_006KSY0 +PP_006KSZY +PP_006KT0W +PP_006KT4N +PP_006KT5L +PP_006KTAA +PP_006KTB8 +PP_006KTC6 +PP_006KTE2 +PP_006KTF0 +PP_006KTGY +PP_006KTHV +PP_006KTJT +PP_006KTNK +PP_006KTV5 +PP_006KTW3 +PP_006KTX1 +PP_006KTYZ +PP_006KU2R +PP_006KU3P +PP_006KU6H +PP_006KU7F +PP_006KUB7 +PP_006KUC5 +PP_006KUFZ +PP_006KUGX +PP_006KUHU +PP_006KUJS +PP_006KULN +PP_006KUML +PP_006KUNJ +PP_006KUPG +PP_006KUQE +PP_006KURC +PP_006KUU6 +PP_006KUYY +PP_006KUZW +PP_006KV0U +PP_006KV4L +PP_006KV5J +PP_006KV7E +PP_006KV8C +PP_006KV9A +PP_006KVD2 +PP_006KVFY +PP_006KVGW +PP_006KVJR +PP_006KVKP +PP_006KVLM +PP_006KVNH +PP_006KVT7 +PP_006KW2P +PP_006KW5H +PP_006KW6F +PP_006KW7D +PP_006KW8B +PP_006KWA7 +PP_006KWB5 +PP_006KWFX +PP_006KWGV +PP_006KWJQ +PP_006KWLL +PP_006KWPE +PP_006KWW0 +PP_006KWYW +PP_006KX1Q +PP_006KX98 +PP_006KXA6 +PP_006KXEY +PP_006KXJP +PP_006KXU3 +PP_006KXXX +PP_006PWHJ +PP_006PWJG +PP_006PWLC +PP_006PWN8 +PP_006PWP6 +PP_006PWR2 +PP_006QKKP +PP_006R811 +PP_006R83X +PP_006R84V +PP_006TY41 +PP_006TY6X +PP_006TYBM +PP_006UFDY +PP_006UFEW +PP_006UZ06 +PP_006UZ14 +PP_006UZ30 +PP_006V003 +PP_006V102 +PP_006V110 +PP_006V21Z +PP_006V23V +PP_006V25R +PP_006V27M +PP_006WHGL +PP_006WHHH +PP_006WHP5 +PP_006WHQ3 +PP_006WHR1 +PP_006WHTX +PP_006WHXP +PP_006WHYM +PP_006WJ1F +PP_006WJ2D +PP_006WJ49 +PP_006WJ81 +PP_006WJAX +PP_006WJDR +PP_006WJFM +PP_006WJGK +PP_006WJHG +PP_006WJKC +PP_006WJM8 +PP_006WJN6 +PP_006WJSY +PP_006WJUU +PP_006WJXN +PP_006WJZJ +PP_006WK1E +PP_006WK3A +PP_006WK48 +PP_006WKBU +PP_006WKFL +PP_006WKGJ +PP_006WKHF +PP_006WKP3 +PP_006WKQ1 +PP_006WKUT +PP_006WKVR +PP_006WKXM +PP_006WL1D +PP_006WL2B +PP_006WL39 +PP_006WL47 +PP_006WL55 +PP_006WL63 +PP_006WL8Z +PP_006WLAV +PP_006WLBT +PP_006WLDP +PP_006WLEM +PP_006WLGH +PP_006WLHE +PP_006WLL8 +PP_006WLM6 +PP_006WLN4 +PP_006WLP2 +PP_006WLSW +PP_006WLTU +PP_006WLXL +PP_006WM0E +PP_006WM2A +PP_006WM8Y +PP_006WMBS +PP_006WMDN +PP_006WMGG +PP_006WMK9 +PP_006WMM5 +PP_006WMP1 +PP_006WMQZ +PP_006WMRX +PP_006WMUR +PP_006WMZF +PP_006WN1B +PP_006WN29 +PP_006WN37 +PP_006WN45 +PP_006WNAT +PP_006WNCP +PP_006WNDM +PP_006WNEK +PP_006WNGF +PP_006WNJA +PP_006WNL6 +PP_006WNM4 +PP_006WNN2 +PP_006WNP0 +PP_006WNQY +PP_006WNRW +PP_006WNVN +PP_006WNWL +PP_006WNXJ +PP_006WP1A +PP_006WP44 +PP_006WP52 +PP_006WP60 +PP_006WP7Y +PP_006WP9U +PP_006WPEJ +PP_006WPGE +PP_006WPJ9 +PP_006WPRV +PP_006WPYF +PP_006WQ43 +PP_006WQ6Z +PP_006WQ7X +PP_006WQ8V +PP_006WQ9T +PP_006WQAR +PP_006WQBP +PP_006WQCM +PP_006WQDK +PP_006WQEH +PP_006WQFF +PP_006WQGD +PP_006WQHA +PP_006WQJ8 +PP_006WQK6 +PP_006WQL4 +PP_006WQM2 +PP_006WQN0 +PP_006WQPY +PP_006WQQW +PP_006WQSS +PP_006WQTQ +PP_006WQXG +PP_006WR0A +PP_006WR26 +PP_006WR34 +PP_006WR50 +PP_006WRAQ +PP_006WREG +PP_006WRGC +PP_006WRH9 +PP_006WRJ7 +PP_006WRNZ +PP_006WRPX +PP_006WRQV +PP_006WRTP +PP_006WRVK +PP_006WRXF +PP_006WS17 +PP_006WS25 +PP_006WS33 +PP_006WS41 +PP_006WS8T +PP_006WS9R +PP_006WSDH +PP_006WSEF +PP_006WSGB +PP_006WSH8 +PP_006WSK4 +PP_006WSM0 +PP_006WSPW +PP_006WSQU +PP_006WSRS +PP_006WSSQ +PP_006WSTN +PP_006WT08 +PP_006WT24 +PP_006WT9Q +PP_006WTBL +PP_006WTK3 +PP_006WTNX +PP_006WTPV +PP_006WTQT +PP_006WTUK +PP_006WU07 +PP_006WU23 +PP_006WU31 +PP_006WU4Z +PP_006WU7T +PP_006WU8R +PP_006WU9P +PP_006WUBK +PP_006WUCH +PP_006WUDF +PP_006WUG9 +PP_006WUK2 +PP_006WUPU +PP_006WUQS +PP_006WURQ +PP_006WUSN +PP_006WUVG +PP_006WUXC +PP_006WUYA +PP_006WUZ8 +PP_006WV06 +PP_006WV6U +PP_006WV7S +PP_006WVEC +PP_006WVZ7 +PP_006WW05 +PP_006WW13 +PP_006WW6T +PP_006WWAK +PP_006WWCF +PP_006WWLY +PP_006WWMW +PP_006WWNU +PP_006WWPS +PP_006WWRN +PP_006WX04 +PP_006WX5U +PP_006WX8N +PP_006WX9L +PP_006WXAJ +PP_006WXCE +PP_006WXDC +PP_006WXEA +PP_006WXH3 +PP_006WXMV +PP_006WXPR +PP_006WXQP +PP_006WXRM +PP_006WXSK +PP_006WXUF +PP_006WXVD +PP_006WXWB +PP_006WXX9 +PP_006WXZ5 +PP_006WY11 +PP_006WY2Z +PP_006WY3X +PP_006WY4V +PP_006WY5T +PP_006WY6R +PP_006WYCD +PP_006WYDB +PP_006WYH2 +PP_006WYJ0 +PP_006X1V7 +PP_006XGGK +PP_006XGJE +PP_006XGLA +PP_006XGQ2 +PP_00713P9 +PP_00719HF +PP_0071ZQB +PP_0071ZS7 +PP_0071ZT5 +PP_0071ZU3 +PP_0071ZV1 +PP_0071ZWZ +PP_0072483 +PP_0072491 +PP_00724BX diff --git a/nextclade/scripts/clades_renaming.py b/nextclade/scripts/clades_renaming.py index 5e2a9d39..b7a73593 100644 --- a/nextclade/scripts/clades_renaming.py +++ b/nextclade/scripts/clades_renaming.py @@ -50,6 +50,7 @@ def split_outbreak_lineage(clade_name: str) -> tuple[str, str]: match clade_name: case "Ib": outbreak_name = "sh2023" + lineage_name = "A" case "Ib/IIb": outbreak_name = "recombinant" elif old_clade_name == "sh2024": @@ -86,17 +87,19 @@ def split_outbreak_lineage(clade_name: str) -> tuple[str, str]: new_branch_labels = {} for name, node in data["branches"].items(): - # Clade Ib is also the root of outbreak sh2023. if "labels" in node and "clade" in node["labels"]: - - def make_label(label: str) -> dict: - return {"labels": {"clade": label}} - - match node["labels"]["clade"]: + label = node["labels"]["clade"] + match label: case "clade Ib": - new_branch_labels[name] = make_label("clade Ib/sh2023") + label = "clade Ib/sh2023/A" case _: - new_branch_labels[name] = node + if label.startswith(tuple(f"{outbreak}/" for outbreak in OUTBREAK_CLADES)): + _, lineage_name = split_outbreak_lineage(label) + label = label if lineage_name == "A" else lineage_name + + new_branch_labels[name] = node | { + "labels": node["labels"] | {"clade": label} + } data["branches"] = new_branch_labels data["nodes"] = new_node_data with open(args.output_node_data, "w") as fh: diff --git a/nextclade/scripts/deduplicate.py b/nextclade/scripts/deduplicate.py index 1b67199b..d644abb5 100644 --- a/nextclade/scripts/deduplicate.py +++ b/nextclade/scripts/deduplicate.py @@ -13,6 +13,17 @@ from Bio import SeqIO +def read_accessions(paths: list[str]) -> set[str]: + accessions = set() + for path in paths: + with open(path) as file: + for line in file: + accession = line.split("#", maxsplit=1)[0].strip() + if accession: + accessions.add(accession) + return accessions + + def informative_sites(sequence: str) -> int: """ Count number of ACGT characters in a sequence @@ -71,7 +82,7 @@ def informative_indexes_sorted_by_entropy(composition: list) -> list: site_information = sorted(site_information.items(), key=lambda x: x[1], reverse=True) return [x[0] for x in site_information] -def process_batch(batch_indices, all_sequences, info_sites): +def process_batch(batch_indices, all_sequences, info_sites, includes): """ Process a batch of ying sequences against all potential duplicates Returns a list of IDs to remove @@ -85,20 +96,28 @@ def process_batch(batch_indices, all_sequences, info_sites): for yang_idx in range(ying_idx + 1, len(all_sequences)): yang_seq = all_sequences[yang_idx] - if identical(ying_seq["seq"], yang_seq["seq"], info_sites): + if yang_seq["id"] not in includes and identical(ying_seq["seq"], yang_seq["seq"], info_sites): print(f"Removing {yang_seq['id']} as identical to {ying_seq['id']}") duplicates.append(yang_seq["id"]) return duplicates -def deduplicate(input: str, output: str, num_processes: int = 10): +def deduplicate( + input: str, + output: str, + include: list[str] = [], + num_processes: int = 10, +): """ Deduplicate sequences in a file Args: sequences: path to sequences file output: path to output file + include: paths containing sequence IDs that must not be removed num_processes: number of cores to use """ + includes = read_accessions(include) + dup_list = set() with open(input, "r") as f: sequences = [ { @@ -108,35 +127,39 @@ def deduplicate(input: str, output: str, num_processes: int = 10): } for record in itertools.islice(SeqIO.parse(f, "fasta"), 0, None) ] - sequences = sorted(sequences, key=lambda x: x["number_informative_sites"], reverse=True) - composition = composition_per_site(sequences) - info_sites = informative_indexes_sorted_by_entropy(composition) - - # Divide work among processes - each process takes a batch of ying sequences - num_sequences = len(sequences) - batch_size = max(1, num_sequences // (num_processes * 5)) # Smaller batches for better load balancing - - # Create batches of indices - batches = [] - for i in range(0, num_sequences-1, batch_size): # -1 because the last sequence has nothing to compare against - end = min(i + batch_size, num_sequences-1) - batches.append(list(range(i, end))) - - # Process batches in parallel - pool = multiprocessing.Pool(processes=num_processes) - process_func = partial(process_batch, all_sequences=sequences, info_sites=info_sites) - results = pool.map(process_func, batches) - - # Clean up - pool.close() - pool.join() - - # Combine results - dup_list = {dup for batch_result in results for dup in batch_result} + sequences = sorted( + sequences, + key=lambda x: (x["id"] in includes, x["number_informative_sites"]), + reverse=True, + ) + if sequences: + composition = composition_per_site(sequences) + info_sites = informative_indexes_sorted_by_entropy(composition) + + # Divide work among processes - each process takes a batch of ying sequences + num_sequences = len(sequences) + batch_size = max(1, num_sequences // (num_processes * 5)) # Smaller batches for better load balancing + + # Create batches of indices + batches = [] + for i in range(0, num_sequences-1, batch_size): # -1 because the last sequence has nothing to compare against + end = min(i + batch_size, num_sequences-1) + batches.append(list(range(i, end))) + + # Process batches in parallel + pool = multiprocessing.Pool(processes=num_processes) + process_func = partial(process_batch, all_sequences=sequences, info_sites=info_sites, includes=includes) + results = pool.map(process_func, batches) + + # Clean up + pool.close() + pool.join() + + # Combine results + dup_list.update(dup for batch_result in results for dup in batch_result) - # Write output with open(output, "w") as f: - for dup in dup_list: + for dup in sorted(dup_list): f.write(f"{dup}\n") if __name__ == "__main__": From b63f1f46b9f1f0e742aaaf2e7e3c2e47777adcd2 Mon Sep 17 00:00:00 2001 From: Cornelius Roemer Date: Thu, 11 Jun 2026 15:41:02 +0200 Subject: [PATCH 7/9] Treemask problematic clade Ib Ugandan sites --- nextclade/resources/all-clades/mask.bed | 2 ++ 1 file changed, 2 insertions(+) diff --git a/nextclade/resources/all-clades/mask.bed b/nextclade/resources/all-clades/mask.bed index 9781bb22..d094a32d 100644 --- a/nextclade/resources/all-clades/mask.bed +++ b/nextclade/resources/all-clades/mask.bed @@ -1,9 +1,11 @@ Chrom ChromStart ChromEnd locus tag Comment chr 0 1500 mask from beginning chr 6400 7100 very diverse region in clade IIa vs (clade IIb and clade I) +chr 18105 18110 clade I vs II reference bias in Ugandan sequences chr 29750 29770 clade I vs II alignment issues/homopolymers chr 39050 39090 clade I vs II alignment issues/homopolymers chr 107660 107680 clade I vs II alignment issues/homopolymers +chr 121319 121321 clade I vs II reference bias in Ugandan sequences chr 133050 133250 indel variation and long homopolymers chr 136500 136600 indel variation and long homopolymers chr 140050 140250 indel variation and long repetitive elements From 549d8a1eae0cef819de9f992474056a7999752eb Mon Sep 17 00:00:00 2001 From: Cornelius Roemer Date: Fri, 12 Jun 2026 17:03:22 +0200 Subject: [PATCH 8/9] Add joint outbreakLineage field & use it for filtering, stabilize clade I tree with constraint tree --- nextclade/Snakefile | 17 ++++- nextclade/config/config.yaml | 51 ++++++++------ nextclade/resources/auspice_config.json | 11 +++ .../resources/clade-i/constraint_tree.nwk | 32 +++++++++ nextclade/resources/color_ordering.tsv | 68 +++++++++++++++++++ nextclade/scripts/assign-colors.py | 1 + nextclade/scripts/clades_renaming.py | 6 ++ 7 files changed, 165 insertions(+), 21 deletions(-) create mode 100644 nextclade/resources/clade-i/constraint_tree.nwk diff --git a/nextclade/Snakefile b/nextclade/Snakefile index dae5f2af..044fc64a 100644 --- a/nextclade/Snakefile +++ b/nextclade/Snakefile @@ -267,6 +267,14 @@ rule reformat_ambiguous: df["date"] = df["date"].apply(replace_ambiguous_date) + df["outbreakLineage"] = df.apply( + lambda row: ( + f"{row['outbreak']}/{row['lineage']}" + if row["outbreak"] and row["lineage"] + else "" + ), + axis=1, + ) df.to_csv(output.metadata, sep="\t", index=False) @@ -496,13 +504,20 @@ else: rule tree: input: alignment="results/{build_name}/masked.fasta", + constraint_tree=lambda w: config[w.build_name].get("constraint_tree", ""), output: tree="results/{build_name}/masked.fasta.treefile", + params: + constraint_option=lambda w: ( + f"-g {config[w.build_name]['constraint_tree']}" + if "constraint_tree" in config[w.build_name] + else "" + ), shell: """ augur tree \ --alignment {input.alignment} \ - --tree-builder-args "--polytomy --ninit 2 -n 2 --epsilon 0.05 -T 4 --redo" \ + --tree-builder-args "--polytomy --ninit 2 -n 2 --epsilon 0.05 -T 4 --redo {params.constraint_option}" \ --nthreads 4 \ --output {output.tree} """ diff --git a/nextclade/config/config.yaml b/nextclade/config/config.yaml index ea49ec19..b8d84fe1 100644 --- a/nextclade/config/config.yaml +++ b/nextclade/config/config.yaml @@ -4,17 +4,23 @@ clade-iib: exclude_where: b1: "--exclude-where clade!=IIb" nonb1: >- - --exclude-where clade!=IIb lineage=B.1 lineage=B.1.1 lineage=B.1.2 lineage=B.1.3 lineage=B.1.4 lineage=B.1.5 lineage=B.1.6 - lineage=B.1.7 lineage=B.1.8 lineage=B.1.9 lineage=B.1.10 lineage=B.1.11 lineage=B.1.12 lineage=B.1.13 lineage=B.1.14 - lineage=B.1.15 - lineage=B.1.16 lineage=B.1.17 lineage=B.1.18 lineage=B.1.19 lineage=B.1.20 lineage=B.1.21 lineage=B.1.22 lineage=B.1.23 - lineage=C.1 lineage=C.2 lineage=C.3 lineage=C.4 lineage=C.5 lineage=C.6 lineage=D.1 lineage=D.2 lineage=D.3 lineage=D.4 - lineage=D.5 lineage=D.6 lineage=E.1 lineage=E.2 lineage=E.3 lineage=E.4 lineage=E.5 lineage=E.6 lineage=F.1 lineage=F.2 - lineage=F.3 lineage=F.4 lineage=F.5 lineage=F.6 lineage=C.1.2 lineage=C.1.3 lineage=E.4 lineage=E.1.1 lineage=E.2.1 - lineage=E.3.1 lineage=F.2.1 lineage=F.4.1 lineage=J.1 + --exclude-where clade!=IIb outbreakLineage=sh2017/B.1 outbreakLineage=sh2017/B.1.1 outbreakLineage=sh2017/B.1.2 outbreakLineage=sh2017/B.1.3 + outbreakLineage=sh2017/B.1.4 outbreakLineage=sh2017/B.1.5 outbreakLineage=sh2017/B.1.6 + outbreakLineage=sh2017/B.1.7 outbreakLineage=sh2017/B.1.8 outbreakLineage=sh2017/B.1.9 outbreakLineage=sh2017/B.1.10 + outbreakLineage=sh2017/B.1.11 outbreakLineage=sh2017/B.1.12 outbreakLineage=sh2017/B.1.13 outbreakLineage=sh2017/B.1.14 + outbreakLineage=sh2017/B.1.15 + outbreakLineage=sh2017/B.1.16 outbreakLineage=sh2017/B.1.17 outbreakLineage=sh2017/B.1.18 outbreakLineage=sh2017/B.1.19 + outbreakLineage=sh2017/B.1.20 outbreakLineage=sh2017/B.1.21 outbreakLineage=sh2017/B.1.22 outbreakLineage=sh2017/B.1.23 + outbreakLineage=sh2017/C.1 outbreakLineage=sh2017/C.2 outbreakLineage=sh2017/C.3 outbreakLineage=sh2017/C.4 outbreakLineage=sh2017/C.5 + outbreakLineage=sh2017/C.6 outbreakLineage=sh2017/D.1 outbreakLineage=sh2017/D.2 outbreakLineage=sh2017/D.3 outbreakLineage=sh2017/D.4 + outbreakLineage=sh2017/D.5 outbreakLineage=sh2017/D.6 outbreakLineage=sh2017/E.1 outbreakLineage=sh2017/E.2 outbreakLineage=sh2017/E.3 + outbreakLineage=sh2017/E.4 outbreakLineage=sh2017/E.5 outbreakLineage=sh2017/E.6 outbreakLineage=sh2017/F.1 outbreakLineage=sh2017/F.2 + outbreakLineage=sh2017/F.3 outbreakLineage=sh2017/F.4 outbreakLineage=sh2017/F.5 outbreakLineage=sh2017/F.6 outbreakLineage=sh2017/C.1.2 + outbreakLineage=sh2017/C.1.3 outbreakLineage=sh2017/E.4 outbreakLineage=sh2017/E.1.1 outbreakLineage=sh2017/E.2.1 + outbreakLineage=sh2017/E.3.1 outbreakLineage=sh2017/F.2.1 outbreakLineage=sh2017/F.4.1 outbreakLineage=sh2017/J.1 subsampling: - b1: "--subsample-max-sequences 1000 --group-by clade lineage year month country --probabilistic-sampling" - nonb1: "--sequences-per-group 10 --group-by clade lineage year month country --probabilistic-sampling" + b1: "--subsample-max-sequences 1000 --group-by clade outbreakLineage year month country --probabilistic-sampling" + nonb1: "--sequences-per-group 10 --group-by clade outbreakLineage year month country --probabilistic-sampling" general_include: "resources/include_accessions.txt" outgroup_clade_name: "outgroup" @@ -25,8 +31,8 @@ clade-i: b1: "--exclude-where clade=II clade=IIa clade=IIb clade=outgroup clade=Ia" nonb1: "--exclude-where clade=II clade=IIa clade=IIb clade=outgroup clade=Ib" subsampling: - b1: "--subsample-max-sequences 1000 --group-by clade lineage year month country --probabilistic-sampling" - nonb1: "--subsample-max-sequences 1000 --group-by clade lineage year month country --probabilistic-sampling" + b1: "--subsample-max-sequences 1000 --group-by clade outbreakLineage year month country --probabilistic-sampling" + nonb1: "--subsample-max-sequences 1000 --group-by clade outbreakLineage year month country --probabilistic-sampling" annotation: "resources/clade-i/genome_annotation.gff3" genes: "resources/clade-i/genes.txt" general_include: "resources/clade-i/include_accessions.txt" @@ -38,6 +44,7 @@ clade-i: - OPG015_dup - OPG016 outgroup_clade_name: "outgroup" + constraint_tree: "resources/clade-i/constraint_tree.nwk" all-clades: root: "reconstructed_ancestral_mpox" @@ -46,8 +53,8 @@ all-clades: b1: "--exclude-where outbreak=sh2017" nonb1: "--exclude-where outbreak!=sh2017" subsampling: - b1: "--subsample-max-sequences 600 --group-by clade lineage year country --probabilistic-sampling" - nonb1: "--subsample-max-sequences 1000 --group-by clade lineage year country --probabilistic-sampling" + b1: "--subsample-max-sequences 600 --group-by clade outbreakLineage year country --probabilistic-sampling" + nonb1: "--subsample-max-sequences 1000 --group-by clade outbreakLineage year country --probabilistic-sampling" general_include: "resources/include_accessions.txt" genes_to_exclude: - OPG001_dup @@ -61,14 +68,18 @@ lineage-b.1: min_date: "" exclude_where: b1: >- - --min-date 2022 --exclude-where outbreak!=sh2017 lineage=A.2 lineage=A.2.1 lineage=A.2.2 lineage=A.2.3 lineage=A.2.4 - lineage=A.2.5 lineage=G.1 lineage=H.1 lineage=H.2 lineage=A lineage=A.1 + --min-date 2022 --exclude-where outbreak!=sh2017 outbreakLineage=sh2017/A.2 outbreakLineage=sh2017/A.2.1 outbreakLineage=sh2017/A.2.2 + outbreakLineage=sh2017/A.2.3 outbreakLineage=sh2017/A.2.4 + outbreakLineage=sh2017/A.2.5 outbreakLineage=sh2017/G.1 outbreakLineage=sh2017/H.1 outbreakLineage=sh2017/H.2 outbreakLineage=sh2017/A + outbreakLineage=sh2017/A.1 nonb1: >- - --min-date 2024 --exclude-where outbreak!=sh2017 lineage=A.2 lineage=A.2.1 lineage=A.2.2 lineage=A.2.3 lineage=A.2.4 - lineage=A.2.5 lineage=G.1 lineage=H.1 lineage=H.2 lineage=A lineage=A.1 + --min-date 2024 --exclude-where outbreak!=sh2017 outbreakLineage=sh2017/A.2 outbreakLineage=sh2017/A.2.1 outbreakLineage=sh2017/A.2.2 + outbreakLineage=sh2017/A.2.3 outbreakLineage=sh2017/A.2.4 + outbreakLineage=sh2017/A.2.5 outbreakLineage=sh2017/G.1 outbreakLineage=sh2017/H.1 outbreakLineage=sh2017/H.2 outbreakLineage=sh2017/A + outbreakLineage=sh2017/A.1 subsampling: - b1: "--subsample-max-sequences 2000 --group-by clade lineage year month country --probabilistic-sampling" - nonb1: "--subsample-max-sequences 2000 --group-by clade lineage year month country --probabilistic-sampling" + b1: "--subsample-max-sequences 2000 --group-by clade outbreakLineage year month country --probabilistic-sampling" + nonb1: "--subsample-max-sequences 2000 --group-by clade outbreakLineage year month country --probabilistic-sampling" general_include: "resources/include_accessions.txt" outgroup_clade_name: "outgroup" diff --git a/nextclade/resources/auspice_config.json b/nextclade/resources/auspice_config.json index f3795b79..4f3c8a89 100644 --- a/nextclade/resources/auspice_config.json +++ b/nextclade/resources/auspice_config.json @@ -27,6 +27,11 @@ "name": "lineage", "displayName": "Lineage", "description": "" + }, + { + "name": "outbreakLineage", + "displayName": "Outbreak/Lineage", + "description": "" } ], "placement_mask_ranges": [ @@ -63,6 +68,11 @@ "title": "Lineage", "type": "categorical" }, + { + "key": "outbreakLineage", + "title": "Outbreak lineage", + "type": "categorical" + }, { "key": "date", "title": "Collection Date", @@ -181,6 +191,7 @@ "filters": [ "clade_membership", "lineage", + "outbreakLineage", "country", "host", "author", diff --git a/nextclade/resources/clade-i/constraint_tree.nwk b/nextclade/resources/clade-i/constraint_tree.nwk new file mode 100644 index 00000000..41da19e5 --- /dev/null +++ b/nextclade/resources/clade-i/constraint_tree.nwk @@ -0,0 +1,32 @@ +( + ( + PP_000ZHUV, + PP_000SV68 + )internal_A, + ( + ( + PP_004JQPQ, + ( + PP_0014F50, + PP_006VEEV + )internal_A_2, + ( + PP_004BJA4, + PP_0014F18 + )internal_A_3 + )internal_A_1_to_A_3, + ( + ( + PP_006KNVA, + PP_004G68A, + PP_006XGN6, + PP_006WSXE + )internal_A_4_to_A_4.1, + ( + PP_001016L, + PP_006KPSF + )internal_A_5 + )internal_A_4_to_A_5 + )internal_A_1_to_A_5 +)internal_11da60f9 +; diff --git a/nextclade/resources/color_ordering.tsv b/nextclade/resources/color_ordering.tsv index d8bd9b9b..0652c41d 100644 --- a/nextclade/resources/color_ordering.tsv +++ b/nextclade/resources/color_ordering.tsv @@ -297,3 +297,71 @@ lineage A.5 ################ +outbreakLineage sh2017/A +outbreakLineage sh2017/A.1 +outbreakLineage sh2017/A.1.1 +outbreakLineage sh2017/B.1 +outbreakLineage sh2017/B.1.1 +outbreakLineage sh2017/B.1.2 +outbreakLineage sh2017/B.1.3 +outbreakLineage sh2017/C.1 +outbreakLineage sh2017/C.1.1 +outbreakLineage sh2017/E.1 +outbreakLineage sh2017/E.1.1 +outbreakLineage sh2017/E.2 +outbreakLineage sh2017/E.2.1 +outbreakLineage sh2017/E.3 +outbreakLineage sh2017/E.3.1 +outbreakLineage sh2017/E.4 +outbreakLineage sh2017/C.1.2 +outbreakLineage sh2017/C.1.3 +outbreakLineage sh2017/B.1.4 +outbreakLineage sh2017/B.1.5 +outbreakLineage sh2017/B.1.6 +outbreakLineage sh2017/D.1 +outbreakLineage sh2017/B.1.7 +outbreakLineage sh2017/B.1.8 +outbreakLineage sh2017/B.1.9 +outbreakLineage sh2017/B.1.10 +outbreakLineage sh2017/B.1.11 +outbreakLineage sh2017/B.1.12 +outbreakLineage sh2017/B.1.13 +outbreakLineage sh2017/B.1.14 +outbreakLineage sh2017/B.1.15 +outbreakLineage sh2017/B.1.16 +outbreakLineage sh2017/B.1.17 +outbreakLineage sh2017/B.1.18 +outbreakLineage sh2017/B.1.19 +outbreakLineage sh2017/B.1.20 +outbreakLineage sh2017/F.1 +outbreakLineage sh2017/F.1.1 +outbreakLineage sh2017/F.2 +outbreakLineage sh2017/F.2.1 +outbreakLineage sh2017/F.3 +outbreakLineage sh2017/F.4 +outbreakLineage sh2017/F.4.1 +outbreakLineage sh2017/F.5 +outbreakLineage sh2017/F.6 +outbreakLineage sh2017/B.1.21 +outbreakLineage sh2017/B.1.22 +outbreakLineage sh2017/J.1 +outbreakLineage sh2017/B.1.23 +outbreakLineage sh2017/A.2 +outbreakLineage sh2017/A.2.1 +outbreakLineage sh2017/H.1 +outbreakLineage sh2017/H.2 +outbreakLineage sh2017/A.2.2 +outbreakLineage sh2017/G.1 +outbreakLineage sh2017/A.2.3 +outbreakLineage sh2017/A.2.4 +outbreakLineage sh2017/A.2.5 +outbreakLineage sh2017/A.3 +outbreakLineage sh2023/A +outbreakLineage sh2023/A.1 +outbreakLineage sh2023/A.2 +outbreakLineage sh2023/A.3 +outbreakLineage sh2023/A.4 +outbreakLineage sh2023/A.4.1 +outbreakLineage sh2023/A.5 + +################ diff --git a/nextclade/scripts/assign-colors.py b/nextclade/scripts/assign-colors.py index 72f9dc68..c60d6637 100644 --- a/nextclade/scripts/assign-colors.py +++ b/nextclade/scripts/assign-colors.py @@ -44,6 +44,7 @@ "clade_membership", "outbreak", "lineage", + "outbreakLineage", ]: subset_present = [x for x in assignment[name] if x in metadata[name].unique()] assignment[name] = subset_present diff --git a/nextclade/scripts/clades_renaming.py b/nextclade/scripts/clades_renaming.py index b7a73593..5ff527f2 100644 --- a/nextclade/scripts/clades_renaming.py +++ b/nextclade/scripts/clades_renaming.py @@ -68,6 +68,11 @@ def split_outbreak_lineage(clade_name: str) -> tuple[str, str]: "clade_membership": clade_name, "outbreak": outbreak_name, "lineage": lineage_name, + "outbreakLineage": ( + f"{outbreak_name}/{lineage_name}" + if outbreak_name and lineage_name + else "" + ), } # Add placement prior for Ib/IIb recombinants @@ -82,6 +87,7 @@ def split_outbreak_lineage(clade_name: str) -> tuple[str, str]: "clade_membership": args.outgroup_clade_name, "outbreak": "", "lineage": "", + "outbreakLineage": "", } new_branch_labels = {} From eb19473dcc0c287b75ce173425e20d4ff0acd481 Mon Sep 17 00:00:00 2001 From: Cornelius Roemer Date: Mon, 6 Jul 2026 15:32:06 +0200 Subject: [PATCH 9/9] Unmask clade A.1 defining stable mutation: { "begin": 185990, "end": 186092 }, --- nextclade/resources/clade-i/auspice_config_patch.json | 1 - 1 file changed, 1 deletion(-) diff --git a/nextclade/resources/clade-i/auspice_config_patch.json b/nextclade/resources/clade-i/auspice_config_patch.json index 4d465e58..de5a1dbe 100644 --- a/nextclade/resources/clade-i/auspice_config_patch.json +++ b/nextclade/resources/clade-i/auspice_config_patch.json @@ -38,7 +38,6 @@ { "begin": 173260, "end": 173460 }, { "begin": 177247, "end": 177349 }, { "begin": 179096, "end": 179396 }, - { "begin": 185990, "end": 186092 }, { "begin": 190885, "end": 196967 } ] }