From bb9a31de9f94c9e6a30892285bcb42b4dbdf36c7 Mon Sep 17 00:00:00 2001 From: j23414 Date: Fri, 25 Mar 2022 14:26:26 -0700 Subject: [PATCH] pull data from https instaed of fauna Co-authored-by: Victor Lin <13424970+victorlin@users.noreply.github.com> --- .travis.yml | 17 ++++++++++-- README.md | 11 ++++---- Snakefile | 47 +++++++++++++------------------- example_data/metadata.tsv.gz | Bin 0 -> 1618 bytes example_data/sequences.fasta.xz | Bin 0 -> 12980 bytes 5 files changed, 40 insertions(+), 35 deletions(-) create mode 100644 example_data/metadata.tsv.gz create mode 100644 example_data/sequences.fasta.xz diff --git a/.travis.yml b/.travis.yml index 013f76e..121022c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -7,11 +7,24 @@ python: before_install: - python3 -m pip install --upgrade pip setuptools wheel install: - - pip3 install git+https://github.com/nextstrain/cli + # https://docs.conda.io/projects/conda/en/latest/user-guide/tasks/use-conda-with-travis-ci.html#the-travis-yml-file + - wget https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh -O miniconda.sh; + - bash miniconda.sh -b -p $HOME/miniconda + - source "$HOME/miniconda/etc/profile.d/conda.sh" + - hash -r + - conda config --set always_yes yes --set changeps1 no + - conda update -q conda + # Useful for debugging any issues with conda + - conda info -a + # Install nextstrain cli + - conda install -n base -c conda-forge mamba --yes + - conda activate base + - mamba create -n nextstrain -c conda-forge -c bioconda nextstrain-cli augur auspice nextalign snakemake git --yes + - conda activate nextstrain - nextstrain version - nextstrain check-setup - nextstrain update script: - mkdir -p data/ - - cp -v example_data/measles.fasta data/ + - cp -v example_data/* data/. - nextstrain build . diff --git a/README.md b/README.md index f74625c..e930b31 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ This is the [Nextstrain](https://nextstrain.org) build for measles virus, visibl The build encompasses fetching data, preparing it for analysis, doing quality control, performing analyses, and saving the results in a format suitable for visualization (with [auspice][]). This involves running components of -Nextstrain such as [fauna][] and [augur][]. +Nextstrain such as [augur][]. All measles-specific steps and functionality for the Nextstrain pipeline should be housed in this repository. @@ -42,22 +42,23 @@ Configuration takes place entirely with the `Snakefile`. This can be read top-to specifies its file inputs and output and also its parameters. There is little redirection and each rule should be able to be reasoned with on its own. - + -If you don't have access to our database, you can run the build using the +If you don't have access to our https endpoints, you can run the build using the example data provided in this repository. Before running the build, copy the example sequences into the `data/` directory like so: mkdir -p data/ - cp example_data/measles.fasta data/ + cp example_data/* data/. [Nextstrain]: https://nextstrain.org -[fauna]: https://github.com/nextstrain/fauna + [augur]: https://github.com/nextstrain/augur [auspice]: https://github.com/nextstrain/auspice [snakemake cli]: https://snakemake.readthedocs.io/en/stable/executable.html#all-options diff --git a/Snakefile b/Snakefile index 621b990..87b9b6d 100644 --- a/Snakefile +++ b/Snakefile @@ -13,40 +13,31 @@ rule files: files = rules.files.params rule download: - message: "Downloading sequences from fauna" + message: "Downloading sequences and metadata from data.nextstrain.org" output: - sequences = "data/measles.fasta" + sequences = "data/sequences.fasta.xz", + metadata = "data/metadata.tsv.gz" params: - fasta_fields = "strain virus accession collection_date region country division location source locus authors url title journal puburl" + sequences_url = "https://data.nextstrain.org/files/measles/sequences.fasta.xz", + metadata_url = "https://data.nextstrain.org/files/measles/metadata.tsv.gz" shell: """ - python3 ../fauna/vdb/download.py \ - --database vdb \ - --virus measles \ - --fasta_fields {params.fasta_fields} \ - --resolve_method choose_genbank \ - --path $(dirname {output.sequences}) \ - --fstem $(basename {output.sequences} .fasta) + curl -fsSL --compressed {params.sequences_url:q} --output {output.sequences} + curl -fsSL --compressed {params.metadata_url:q} --output {output.metadata} """ -rule parse: - message: "Parsing fasta into sequences and metadata" +rule decompress: + message: "Decompressing sequences and metadata" input: - sequences = rules.download.output.sequences + sequences = "data/sequences.fasta.xz", + metadata = "data/metadata.tsv.gz" output: - sequences = "results/sequences.fasta", - metadata = "results/metadata.tsv" - params: - fasta_fields = "strain virus accession date region country division city db segment authors url title journal paper_url", - prettify_fields = "region country division city" + sequences = "data/sequences.fasta", + metadata = "data/metadata.tsv" shell: """ - augur parse \ - --sequences {input.sequences} \ - --output-sequences {output.sequences} \ - --output-metadata {output.metadata} \ - --fields {params.fasta_fields} \ - --prettify-fields {params.prettify_fields} + gzip --decompress --keep {input.metadata} + xz --decompress --keep {input.sequences} """ rule filter: @@ -59,8 +50,8 @@ rule filter: - minimum genome length of {params.min_length} """ input: - sequences = rules.parse.output.sequences, - metadata = rules.parse.output.metadata, + sequences = rules.decompress.output.sequences, + metadata = rules.decompress.output.metadata, exclude = files.dropped_strains output: sequences = "results/filtered.fasta" @@ -128,7 +119,7 @@ rule refine: input: tree = rules.tree.output.tree, alignment = rules.align.output, - metadata = rules.parse.output.metadata + metadata = rules.decompress.output.metadata output: tree = "results/tree.nwk", node_data = "results/branch_lengths.json" @@ -190,7 +181,7 @@ rule export: message: "Exporting data files for for auspice" input: tree = rules.refine.output.tree, - metadata = rules.parse.output.metadata, + metadata = rules.decompress.output.metadata, branch_lengths = rules.refine.output.node_data, nt_muts = rules.ancestral.output.node_data, aa_muts = rules.translate.output.node_data, diff --git a/example_data/metadata.tsv.gz b/example_data/metadata.tsv.gz new file mode 100644 index 0000000000000000000000000000000000000000..044d947e2b0f81906da54efa6ed41cff36597296 GIT binary patch literal 1618 zcmV-Y2CexYiwFqlB|c&R18rq=VPs)+VJ>uYb^z5_$#UB`5Ixghf!ici;sWlROG;j2 zIbKS(lTQ%BW>-RIJLW@k7*-liVmt zN#%FAe$bcfNpND_-}Y^cEhn~Jqo73PR2hS-&q6 ztC#;{%14Ah>b)qaalzyxhqp$wLJ)CMRi*mdwr8`M#nTb9cwShXO{}q)+PqFvA*tO3 zJZ6%n6}qiQ1#1&;4y%f0=$+@7{rfZ1bufO91{OL3q{iqoWK1PG=L%A-E80Uzp3w-?;!2q{YE&tVGt(RabDr+y@4m* zF`jsj@f-?ZL_w^>Vc+(!g=70T?(n?4z#;bhSmOz#hCko974;IS4<&hG`Pyy`*h>Hw z;MoS)F7S~k%A8gdwa?N}kPfv*@X&)41zMzmR7EtM7cVkmV)zf63OR1DiQfa|Q7K`n zHY0DJr&{mM@A|eMSU9rr3OXNg*(W^ja|!00JV?!g`1IY$$wDk103Jf%FN1xulDbPrYfvW^V}yIN)-Adq3s)P!c60dYG46efh3IC;tb zbl~IA2_ul74U_(+AG1x`T?kMdT0v@QrzcOHo;>GRJm(0uL0>_mIU>;Y=ZZC0q$~W> zIJNqvJHDkGrq$Mvg|z;}phnn_fDC@@Y05dtW^#m+Ai%K~9bD1b_W_lP&Ks8jtaE~O zkD=wr2{hs0-Yz^w{6F^?XQUW00w5+Yt?=YD2!l9C41E=pNsCkep#iBKzP4LK>sZ#H zPIMcvx`%|})CAz-bz6cAXjf|PEjp$ieU8pguZ%@G0ggcrxo%TM@rG3t zyFT^;{K_P}vIscYtwn%%`)d)F(DZ+0VZ9w&E^m+Vyu&a3pnvGc*okAHX`C!*Iv^$C z=mN4O?eWTX4Z`b3l96oy>>}PsI%T3(`5e_8*vdlx0ZOqgK5Dk`Aj0 zEy#GR8!Cq@glFiX){+RuN>p^wLsyw!h^)@Rn4uIz#nhX{Z+gwsG9_eLHK*MkbRS&@20J9ue1&|`1}(-BA5Gvmm`+x8sK!{NaVcrj(2f&s>{g~8(aFBb3A z_Y*&C)Izr#@GH;NeJTmG!L{AG%d6#9bJK;p65NE6C8c6|6`!HtFKET(+#Heg5oPoN zx)C%Elj$b%0A&lc-NsaU8nQZt-#{zZ(+cv=39w{kN?=bUMN88Tqlf2b=6M79r?VRu zjp_<y6cayb@cHl- zN_XUuZtIm6&%FHQLWU?MQr7h78H1H5$QoCvWR0JJbsj59Sn)OR>c&dY1D!2ftW+=W zX$N2_@;R(!3CLkHy!n`~<@4EGEj8lEU7#3;iDSYhg!3fXaIus`Vc_Gp>hcYy2YAPI Qxz9}h7d`u{tN=B3pb8vsdo;Y|g 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 literal 0 HcmV?d00001