pax_global_header00006660000000000000000000000064144763650710014527gustar00rootroot0000000000000052 comment=9fdceaa5157fd0fd4bb141f45e1d742167e5d4c9 treetime-0.11.1/000077500000000000000000000000001447636507100134255ustar00rootroot00000000000000treetime-0.11.1/.github/000077500000000000000000000000001447636507100147655ustar00rootroot00000000000000treetime-0.11.1/.github/workflows/000077500000000000000000000000001447636507100170225ustar00rootroot00000000000000treetime-0.11.1/.github/workflows/ci.yml000066400000000000000000000016751447636507100201510ustar00rootroot00000000000000name: CI on: pull_request: push: branches: - master workflow_dispatch: concurrency: group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref || github.run_id }} cancel-in-progress: true jobs: test: name: 'test with python ${{ matrix.python-version }}' runs-on: ubuntu-20.04 strategy: fail-fast: false matrix: python-version: - '3.7' - '3.8' - '3.9' - '3.10' - '3.11' steps: - uses: actions/checkout@v3 - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@v4 with: python-version: ${{ matrix.python-version }} - name: Install dependencies run: | python -m pip install --upgrade pip pip install pytest wheel - name: Install treetime run: python -m pip install . - name: Run tests run: bash test.sh treetime-0.11.1/.gitignore000066400000000000000000000030271447636507100154170ustar00rootroot00000000000000*~ # KDE directory preferences .directory # # Linux trash folder which might appear on any partition or disk .Trash-* #vscode .vscode/ #VIM backup and swap [a-w][a-z] [._]s[a-w][a-z] *.un~ Session.vim .netrwhist *~ .ropeproject/ #python compiled files # Byte-compiled / optimized / DLL files __pycache__/ *.py[cod] # C extensions *.so # Distribution / packaging .Python env/ build/ develop-eggs/ dist/ downloads/ eggs/ .eggs/ lib/ lib64/ parts/ sdist/ var/ *.egg-info/ .installed.cfg *.egg # PyInstaller # Usually these files are written by a python script from a template # before PyInstaller builds the exe, so as to inject date/other infos into it. *.manifest *.spec # Installer logs pip-log.txt pip-delete-this-directory.txt # Unit test / coverage reports htmlcov/ .tox/ .coverage .coverage.* .cache nosetests.xml coverage.xml *,cover # Translations *.mo *.pot # Django stuff: *.log # Sphinx documentation docs/_build/ # PyBuilder target/ #file for sublime text *.tmlanguage.cache *.tmPreferences.cache *.stTheme.cache # workspace files are user-specific *.sublime-workspace # project files should be checked into the repository, unless a significant # proportion of contributors will probably not be using SublimeText *.sublime-project # sftp configuration file sftp-config.json #data files other resources *.svg !data/ # OS generated files # ###################### .DS_Store .DS_Store? ._* .Spotlight-V100 .Trashes Icon? ehthumbs.db Thumbs.db test/treetime_examples # Output directories produced by bash test/command_line_tests.sh test/20*/treetime-0.11.1/.pylintrc000066400000000000000000000023131447636507100152710ustar00rootroot00000000000000[MASTER] ignore=.git .idea .input .output .temp .venv .vscode [MESSAGES CONTROL] disable= bad-continuation, bad-whitespace, bare-except, chained-comparison, consider-using-in, fixme, invalid-name, len-as-condition, line-too-long, missing-docstring, multiple-imports, no-else-continue, no-else-raise, no-else-return, no-self-use, protected-access, too-many-arguments, too-many-branches, too-many-branches, too-many-instance-attributes, too-many-lines, too-many-locals, too-many-nested-blocks, too-many-public-methods, too-many-statements, trailing-newlines, unidiomatic-typecheck, unnecessary-comprehension, unnecessary-pass, useless-object-inheritance, duplicate-code, unused-argument, unused-import, unused-variable, simplifiable-if-expression, simplifiable-if-statement, singleton-comparison, attribute-defined-outside-init, multiple-statements, redefined-outer-name, cyclic-import, import-error, import-outside-toplevel, reimported, wrong-import-order, wrong-import-position, [BASIC] bad-names=foo,baz,toto,tutu,tata,let,const,nil,null,define good-names=a,b,c,e,f,g,i,j,k,x,y,z,ex,Run,_,__,___ extension-pkg-whitelist=numpy treetime-0.11.1/.readthedocs.yml000066400000000000000000000001511447636507100165100ustar00rootroot00000000000000--- version: 2 conda: environment: docs/environment.yml sphinx: configuration: docs/source/conf.py treetime-0.11.1/LICENSE000066400000000000000000000021141447636507100144300ustar00rootroot00000000000000The MIT License (MIT) Copyright (c) 2016 Pavel Sagulenko and Richard Neher Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. treetime-0.11.1/Makefile000066400000000000000000000012771447636507100150740ustar00rootroot00000000000000-include .env.example -include .env export UID=$(shell id -u) export GID=$(shell id -g) export DOCS_CONTAINER_NAME=treetime-docs SHELL := bash .ONESHELL: .PHONY: docs docker-docs docs: @$(MAKE) --no-print-directory -C docs/ html docs-clean: rm -rf docs/build docker-docs: set -euox docker build -t $${DOCS_CONTAINER_NAME} \ --network=host \ --build-arg UID=$(shell id -u) \ --build-arg GID=$(shell id -g) \ docs/ docker run -it --rm \ --name=$${DOCS_CONTAINER_NAME}-$(shell date +%s) \ --init \ --user=$(shell id -u):$(shell id -g) \ --volume=$(shell pwd):/home/user/src \ --publish=8000:8000 \ --workdir=/home/user/src \ --env 'TERM=xterm-256colors' \ $${DOCS_CONTAINER_NAME} treetime-0.11.1/README.md000066400000000000000000000303411447636507100147050ustar00rootroot00000000000000[![CI](https://github.com/neherlab/treetime/actions/workflows/ci.yml/badge.svg?branch=master)](https://github.com/neherlab/treetime/actions/workflows/ci.yml) [![anaconda](https://anaconda.org/bioconda/treetime/badges/installer/conda.svg)](https://anaconda.org/bioconda/treetime) [![readthedocs](https://readthedocs.org/projects/treetime/badge/)](https://treetime.readthedocs.io/en/latest/) ## TreeTime: maximum likelihood dating and ancestral sequence inference ### Overview TreeTime provides routines for ancestral sequence reconstruction and inference of molecular-clock phylogenies, i.e., a tree where all branches are scaled such that the positions of terminal nodes correspond to their sampling times and internal nodes are placed at the most likely time of divergence. To optimize the likelihood of time-scaled phylogenies, TreeTime uses an iterative approach that first infers ancestral sequences given the branch length of the tree (assuming the branch length of the input tree is in units of average number of nucleotide or protein substitutions per site in the sequence). After infering ancestral sequences TreeTime optimizes the positions of unconstrained nodes on the time axis, and then repeats this cycle. The only topology optimization are (optional) resolution of polytomies in a way that is most (approximately) consistent with the sampling time constraints on the tree. The package is designed to be used as a stand-alone tool on the command-line or as a library used in larger phylogenetic analysis work-flows. [The documentation of TreeTime is hosted on readthedocs.org](https://treetime.readthedocs.io/en/latest/). In addition to scripting TreeTime or using it via the command-line, there is also a small web server at [treetime.ch](https://treetime.biozentrum.unibas.ch/). ![Molecular clock phylogeny of 200 NA sequences of influenza A H3N2](https://raw.githubusercontent.com/neherlab/treetime_examples/master/figures/tree_and_clock.png) Have a look at our repository with [example data](https://github.com/neherlab/treetime_examples) and the [tutorials](https://treetime.readthedocs.io/en/latest/tutorials.html). #### Features * ancestral sequence reconstruction (marginal and joint maximum likelihood) * molecular clock tree inference (marginal and joint maximum likelihood) * inference of GTR models * rerooting to maximize temporal signal and optimize the root-to-tip distance vs time relationship * simple phylodynamic analysis such as coalescent model fits * sequence evolution along trees using flexible site specific models. ## Table of contents * [Installation and prerequisites](#installation-and-prerequisites) * [Command-line usage](#command-line-usage) + [Timetrees](#timetrees) + [Rerooting and substitution rate estimation](#rerooting-and-substitution-rate-estimation) + [Ancestral sequence reconstruction](#ancestral-sequence-reconstruction) + [Homoplasy analysis](#homoplasy-analysis) + [Mugration analysis](#mugration-analysis) + [Metadata and date format](#metadata-and-date-format) * [Example scripts](#example-scripts) * [Related tools](#related-tools) * [Projects using TreeTime](#projects-using-treetime) * [Building the documentation](#building-the-documentation) * [Developer info](#developer-info) ### Installation and prerequisites TreeTime is compatible with Python 3.7 upwards and is tested on 3.7 to 3.10. It depends on several Python libraries: * numpy, scipy, pandas: for all kind of mathematical operations as matrix operations, numerical integration, interpolation, minimization, etc. * BioPython: for parsing multiple sequence alignments and all phylogenetic functionality * matplotlib: optional dependency for plotting You may install TreeTime and its dependencies by running ```bash pip install . ``` within this repository. You can also install TreeTime from PyPi via ```bash pip install phylo-treetime ``` You might need root privileges for system wide installation. Alternatively, you can simply use it TreeTime locally without installation. In this case, just download and unpack it, and then add the TreeTime folder to your $PYTHONPATH. ### Command-line usage TreeTime can be used as part of python programs that create and interact with tree time objects. How TreeTime can be used to address typical questions like ancestral sequence reconstruction, rerooting, timetree inference etc is illustrated by a collection of example scripts described below. In addition, TreeTime can be used from the command line with arguments specifying input data and parameters. Trees can be read as newick, nexus and phylip files; fasta and phylip are supported alignment formats; metadata and dates can be provided as csv or tsv files, see [below](#metadata-and-date-format) for details. #### Timetrees The to infer a timetree, i.e. a phylogenetic tree in which branch length reflect time rather than divergence, TreeTime offers implements the command: ```bash treetime --aln --tree --dates ``` This command will infer a time tree, ancestral sequences, a GTR model, and optionally confidence intervals and coalescent models. A detailed explanation is of this command with its various options and examples is available in [the documentation on readthedocs.org](https://treetime.readthedocs.io/en/latest/tutorials/timetree.html). #### Rerooting and substitution rate estimation To explore the temporal signal in the data and estimate the substitution rate (instead if full-blown timetree estimation), TreeTime implements a subcommand `clock` that is called as follows ```bash treetime clock --tree --aln --dates --reroot least-squares ``` The full list if options is available by typing `treetime clock -h`. Instead of an input alignment, `--sequence-length ` can be provided. Documentation of additional options and examples are available at in [the documentation on readthedocs.org](https://treetime.readthedocs.io/en/latest/tutorials/clock.html). #### Ancestral sequence reconstruction: The subcommand ```bash treetime ancestral --aln input.fasta --tree input.nwk ``` will reconstruct ancestral sequences at internal nodes of the input tree. The full list if options is available by typing `treetime ancestral -h`. A detailed explanation of `treetime ancestral` with examples is available at in [the documentation on readthedocs.org](https://treetime.readthedocs.io/en/latest/tutorials/ancestral.html). #### Homoplasy analysis Detecting and quantifying homoplasies or recurrent mutations is useful to check for recombination, putative adaptive sites, or contamination. TreeTime provides a simple command to summarize homoplasies in data ```bash treetime homoplasy --aln --tree ``` The full list if options is available by typing `treetime homoplasy -h`. Please see [the documentation on readthedocs.org](https://treetime.readthedocs.io/en/latest/tutorials/homoplasy.html) for examples and more documentation. #### Mugration analysis Migration between discrete geographic regions, host switching, or other transition between discrete states are often parameterized by time-reversible models analogous to models describing evolution of genome sequences. Such models are hence often called "mugration" models. TreeTime GTR model machinery can be used to infer mugration models: ```bash treetime mugration --tree --states --attribute ``` where `` is the relevant column in the csv file specifying the metadata `states.csv`, e.g. `=country`. The full list if options is available by typing `treetime mugration -h`. Please see [the documentation on readthedocs.org](https://treetime.readthedocs.io/en/latest/tutorials/mugration.html) for examples and more documentation. #### Metadata and date format Several of TreeTime commands require the user to specify a file with dates and/or other meta data. TreeTime assumes these files to by either comma (csv) or tab-separated (tsv) files. The first line of these files is interpreted as header line specifying the content of the columns. Each file needs to have at least one column that is named `name`, `accession`, or `strain`. This column needs to contain the names of each sequence and match the names of taxons in the tree if one is provided. If more than one of `name`, `accession`, or `strain` is found, TreeTime will use the first. If the analysis requires dates, at least one column name needs to contain `date` (i.e. `sampling date` is fine). Again, if multiple hits are found, TreeTime will use the first. TreeTime will attempt to parse dates in the following way and order | order | type/format | example | description| | --- |-------------|---------|------------| | 1| float | 2017.56 | decimal date | | 2| [float:float] | [2013.45:2015.56] | decimal date range | | 3| %Y-%m-%d | 2017-08-25 | calendar date in ISO format | | 4| %Y-XX-XX | 2017-XX-XX | calendar date missing month and/or day | ### Example scripts The following scripts illustrate how treetime can be used to solve common problem with short python scripts. They are meant to be used in an interactive ipython environment and run as `run examples/ancestral_inference.py`. * [`ancestral_inference.py`](https://github.com/neherlab/treetime_examples/tree/master/scripts/ancestral_sequence_inference.py) illustrates how ancestral sequences are inferred and likely mutations are assigned to branches in the tree, * [`relaxed_clock.py`](https://github.com/neherlab/treetime_examples/tree/master/scripts/relaxed_clock.py) walks the user through the usage of relaxed molecular clock models. * [`examples/rerooting_and_timetrees.py`](https://github.com/neherlab/treetime_examples/tree/master/scripts/rerooting_and_timetrees.py) illustrates the rerooting and root-to-tip regression scatter plots. * [`ebola.py`](https://github.com/neherlab/treetime_examples/tree/master/scripts/ebola.py) uses about 300 sequences from the 2014-2015 Ebola virus outbreak to infer a timetree. This example takes a few minutes to run. HTML documentation of the different classes and function is available at [here](https://treetime.biozentrum.unibas.ch/doc). ### Related tools There are several other tools which estimate molecular clock phylogenies. * [Beast](http://beast.bio.ed.ac.uk/) relies on the MCMC-type sampling of trees. It is hence rather slow for large data sets. But BEAST allows the flexible inclusion of prior distributions, complex evolutionary models, and estimation of parameters. * [Least-Square-Dating](http://www.atgc-montpellier.fr/LSD/) (LSD) emphasizes speed (it scales as O(N) as **TreeTime**), but provides limited scope for customization. * [treedater](https://github.com/emvolz/treedater) by Eric Volz and Simon Frost is an R package that implements time tree estimation and supports relaxed clocks. ### Projects using TreeTime * TreeTime is an integral part of the [nextstrain.org](http://nextstrain.org) project to track and analyze viral sequence data in real time. * [panX](http://pangenome.de) uses TreeTime for ancestral reconstructions and inference of gene gain-loss patterns. ### Building the documentation The API documentation for the TreeTime package is generated created with Sphinx. The source code for the documentaiton is located in doc folder. - sphinx-build to generate static html pages from source. Installed as ```bash pip install Sphinx ``` After required packages are installed, navigate to doc directory, and build the docs by typing: ```bash make html ``` Instead of html, another target as `latex` or `epub` can be specified to build the docs in the desired format. #### Requirements To build the documentation, sphinx-build tool should be installed. The doc pages are using basicstrap html theme to have the same design as the TreeTime web server. Therefore, the basicstrap theme should be also available in the system. ### Developer info - Copyright and License: Pavel Sagulenko, Emma Hodcroft, and Richard Neher, MIT Licence - References * [TreeTime: Maximum-likelihood phylodynamic analysis](https://academic.oup.com/ve/article/4/1/vex042/4794731) by Pavel Sagulenko, Vadim Puller and Richard A Neher. Virus Evolution. * [NextStrain: real-time tracking of pathogen evolution](https://academic.oup.com/bioinformatics/advance-article/doi/10.1093/bioinformatics/bty407/5001388) by James Hadfield et al. Bioinformatics. treetime-0.11.1/benchmarking/000077500000000000000000000000001447636507100160555ustar00rootroot00000000000000treetime-0.11.1/benchmarking/sequence_algorithms.py000066400000000000000000000014251447636507100224720ustar00rootroot00000000000000from __future__ import print_function, division import numpy as np from Bio import Phylo if __name__ == '__main__': from treetime.seq_utils import normalize_profile, prof2seq, seq2prof from treetime.gtr import GTR gtr = GTR.standard('JC69') dummy_prof = np.random.random(size=(10000,5)) # used a lot (300us) norm_prof = normalize_profile(dummy_prof)[0] # used less but still a lot (50us) gtr.evolve(norm_prof, 0.1) # used less but still a lot (50us) gtr.propagate_profile(norm_prof, 0.1) # used only in final, sample_from_prof=False speeds it up (600us or 300us) seq, p, seq_ii = prof2seq(norm_prof, gtr, sample_from_prof=True, normalize=False) # used only initially (slow, 5ms) tmp_prof = seq2prof(seq, gtr.profile_map) treetime-0.11.1/benchmarking/timetree_algorithms.py000066400000000000000000000061701447636507100225020ustar00rootroot00000000000000from __future__ import print_function, division import numpy as np from Bio import Phylo from treetime import TreeTime from treetime.utils import parse_dates from treetime.node_interpolator import Distribution, NodeInterpolator if __name__ == '__main__': base_name = 'test/treetime_examples/data/h3n2_na/h3n2_na_20' dates = parse_dates(base_name+'.metadata.csv') tt = TreeTime(gtr='Jukes-Cantor', tree = base_name+'.nwk', use_fft=True, aln = base_name+'.fasta', verbose = 3, dates = dates, debug=True) # rerooting can be done along with the tree time inference tt.run(root="best", branch_length_mode='input', max_iter=2, time_marginal=True) # initialize date constraints and branch length interpolators # this called in each iteration. 44ms tt.init_date_constraints() ########################################################### # joint inference of node times. done in every generation. 0.7s tt._ml_t_joint() # individual steps in joint inference - post-order msgs_to_multiply = [child.joint_pos_Lx for child in tt.tree.root.clades if child.joint_pos_Lx is not None] # 330us subtree_distribution = Distribution.multiply(msgs_to_multiply) # 30ms (there are 19 nodes here, so about 20 internal branches -> 1s) res, res_t = NodeInterpolator.convolve(subtree_distribution, tt.tree.root.clades[1].branch_length_interpolator, max_or_integral='max', inverse_time=True, n_grid_points = tt.node_grid_points, n_integral=tt.n_integral, rel_tol=tt.rel_tol_refine) ########################################################### # marginal inference. done only for confidence estimation: 2.7s tt._ml_t_marginal() # individual steps in marginal inference - post-order msgs_to_multiply = [child.marginal_pos_Lx for child in tt.tree.root.clades if child.marginal_pos_Lx is not None] # 330us subtree_distribution = Distribution.multiply(msgs_to_multiply) # 60ms (there are 19 nodes here, so about 20 internal branches -> 1s) res, res_t = NodeInterpolator.convolve(subtree_distribution, tt.tree.root.clades[1].branch_length_interpolator, max_or_integral='integral', inverse_time=True, n_grid_points = tt.node_grid_points, n_integral=tt.n_integral, rel_tol=tt.rel_tol_refine) # 80ms (there are 19 nodes here, so about 20 internal branches -> 1s) res, res_t = NodeInterpolator.convolve(subtree_distribution, tt.tree.root.clades[1].branch_length_interpolator, max_or_integral='integral', inverse_time=False, n_grid_points = tt.node_grid_points, n_integral=tt.n_integral, rel_tol=tt.rel_tol_refine) # 1ms (there are 19 nodes here, so about 20 internal branches) res = NodeInterpolator.convolve_fft(subtree_distribution, tt.tree.root.clades[1].branch_length_interpolator, inverse_time=True) # 1ms (there are 19 nodes here, so about 20 internal branches) res = NodeInterpolator.convolve_fft(subtree_distribution, tt.tree.root.clades[1].branch_length_interpolator, inverse_time=False) # This points towards the convolution being the biggest computational expense. treetime-0.11.1/changelog.md000066400000000000000000000325641447636507100157100ustar00rootroot00000000000000# 0.11.1: bug fixes and tweaks to plotting - fix division by zero error during GTR inference - improve doc strings in parse dates - tweaks to background shading in timetree plot function (`plot_vs_years`) - allow to specify branches on which date confidence intervals are shown. # 0.11.0: new clock filter method Previously, only a crude analysis of whether the divergence of tips roughly follows a linear trend was implemented. Tips that deviated too much from that regression line were flagged as outliers and this threshold was parameterized as number of interquartile distances of the distribution of residuals `n_iqd`. This filter is not very sensitive and often misses misdated tips that severely distort the tree but still fall within the distribution of root-to-tip distances at that time. To overcome this, we implemented a novel filtering method that fits a simple gaussian model of divergence accumulation. Information on outliers is saved in a pandas DataFrame `self.outliers` of `TreeTime` and written to file as a tsv file when running treetime as command line tool. ### Other fixes * error when rate estimate is negative during the rate susceptibility calculation. Give hint in error message to specify the rate and its uncertainty explicitly. * Fix bug [issue #250](https://github.com/neherlab/treetime/issues/250) introduced in 0.10.0 where treetime fails in absence of an alignment when trying to create an auspice json file. [PR #251](https://github.com/neherlab/treetime/pull/251) # 0.10.1: bug fix release * avoid probability loss at the end of the domain of distributions * fix erroneous check for merger model. * raise error when probability is lost. * improve initial guess in branch length optimizations # 0.10.0: add auspice.json output, drop python 3.6 * the output directory now contains a json file that is compatible with auspice.us. Both time scaled phylogenies and ancestral inferences can now be visualized and explored using auspice. Available colorings are "Date", "genotype", "Branch support", and "Excluded". See [PR #232](https://github.com/neherlab/treetime/pull/232) for details. * move most function related to IO of the command line wrappers into a separate file. * make TreeTime own its random number generator and add `--rng-seed` to control state in CLI. Any previous usage of `numpy.random.seed` will now be ignored in favor of `--rng-seed`. See [PR #234](https://github.com/neherlab/treetime/pull/234) * add flag `--greedy-resolve` (currently default) as inverse to `--stochastic-resolve` with the aim of switching the default behavior in the future. Add deprecation warning for `greedy-resolve`. * tighten conditions that trigger approximation of narrow distribution as a delta function in convolution using FFT [PR #235](https://github.com/neherlab/treetime/pull/235). * Drop support for python 3.6. * Don't attempt to show figure when calling `Phylo.draw` to suppress matplotlib back-end warning. # 0.9.6: bug fixes and new mode of polytomy resolution * in cases when very large polytomies are resolved, the multiplication of the discretized message results in messages/distributions of length 1. This resulted in an error, since interpolation objects require at least two points. This is now caught and a small discrete grid created. * increase recursion limit to 10000 by default. The recursion limit can now also be set via the environment variable `TREETIME_RECURSION_LIMIT`. * removed unused imports, fixed typos * add new way to resolve polytomies. the previous polytomy resolution greedily pulled out pairs of child-clades at a time and merged then into a single clade. This often results in atypical caterpillar like subtrees. This is undesirable since it (i) is very atypical, (ii) causes numerical issues due to repeated convolutions, and (iii) triggers recursion errors during newick export. The new optional way of resolving replaces a multi-furcation by a randomly generated coalescent tree that backwards in time mutates (all mutations are singletons and need to 'go' before coalescence), and merges lineages. Lineages that remain when time reaches the time of the parent remain as children of the parent. This new way of resolving is much faster for large polytomies. This experimental feature can be used via the flag `--stochastic-resolve`. Note that the outcome of this stochastic resolution is stochastic! # 0.9.5: load custom GTR via CLI * fix bug that omitted the inferred state of the root in the nexus export of the migration command * add CLI flag and functionality to load sequence evolution models inferred and saved by TreeTime as human-readable text files. The flag is `--custom-gtr ` and overwrites any arguments passed under the `--gtr` flag. * explicitly specify the optimization method, brackets, bounds, and tolerances in calls of `scipy.optimize.minimize` to suppress scipy warning. Scipy had previously silently ignored bounds when the method wasn't explicitly set to `bounded`. # 0.9.4: bug fix and performance improvements * avoid negative variance associated with branch lengths in tree regression. This could happen in rare cases when marginal time tree estimation returned short negative branch length and the variance was estimated as being proportional to branch length. Variances in the `TreeRegression` clock model are now always non-negative. * downsample the grid during multiplication of distribution objects. This turned out to be an issue for trees with very large polytomies. In these cases, a large number of distributions get multiplied which resulted in grid sizes above 100000 points. Grid sizes are now downsampled to the average grid size. # 0.9.3 * Add extra error class for "unknown" (==unhandled) errors * Wrap `run` function and have it optionally raise unhandled exceptions as `TreeTimeUnknownError`. This is mainly done to improve interaction with `augur` that uses `TreeTime` internals as a library. (both by @anna-parker with input from @victorlin) [PR #206](https://github.com/neherlab/treetime/pull/206) [PR #208](https://github.com/neherlab/treetime/pull/208) # 0.9.2 bug fix release: * CLI now works for windows (thanks @corneliusroemer for the fix) * fixes vcf parsing. haploid no-calls were not properly parsed and treated as reference (thanks @jodyphelan for the issue). * fix file names in CLI output. (thanks @gtonkinhill) # 0.9.1 This release is mostly a bug-fix release and contains some additional safeguards against unwanted side-effects of greedy polytomy resolution. * resolve polytomies only when significant LH gain can be achieved * performance enhancement in pre-order iteration during marginal time tree estimate when hitting large polytomies. * allow users to set branch specific rates (only when used as a library) # 0.9.0 This release contains several major changes to how TreeTime calculates time scaled phylogenies. Most of this is work by @anna-parker! * implements convolutions needed for marginal time tree inference using FFT. Previously, these were calculated by explicit integration using optimized irregular grids. Using FFT requires regular (and hence much finer/larger) grids, but greatly reduces computational complexity from `n^2` to `n log(n)`, where `n` is the number of grid points. The FFT feature can be switched on an off with the `use_fft` attribute of the ClockTree class. * Using FFT in convolutions required moving the contributions of the coalescent models from th branches to the nodes. This should not change the results in any way, but cleans up the code. * The number concurrent of lineages determines the rate of coalescence. This can now optionally be calculated using the uncertainty of the timing of merger events, instead of the step functions used previously. * Adds a subcommand to read in ancestral reassortment graphs of two segments produced by [TreeKnit](https://github.com/PierreBarrat/TreeKnit.jl). This command takes two trees and a file with MCCs inferred by TreeKnit. See [these docs](https://treetime.readthedocs.io/en/latest/commands.html#arg) for command line usage. # 0.8.6 * optionally allow incomplete alignment [PR #178](https://github.com/neherlab/treetime/pull/178) * reduce memory footprint through better clean up and optimizing types. [PR #179](https://github.com/neherlab/treetime/pull/179) # 0.8.5 * bug fixes related to edge cases were sequences consist only of missing data * bug fix when the CLI command `treetime` is run without alignment * more robust behavior when parsing biopython alignments (id vs name of sequence records) * drop python 3.5 support # 0.8.4 -- re-release of 0.8.3.1 # 0.8.3.1 -- bug fix related to Bio.Seq.Seq now bytearray * Biopython changed the representation of sequences from strings to bytearrays. This caused crashes of mugration inference with more than 62 states as states than exceeded the ascii range. This fix now bypasses Bio.Seq in the mugration analysis. # 0.8.3 -- unpin biopython version * Biopython 1.77 and 1.78 had a bug in their nexus export. This is fixed in 1.79. We now explictly exclude the buggy versions but allow others. # 0.8.2 -- bug fixes and small feature additions This release fixes a few bugs and adds a few features * output statistics of different iterations of the treetime optimization loop (trace-log, thanks to @ktmeaton) * speed ups by @akislyuk * fix errors with dates in the distant future * better precision of tabular skyline output * adds clock-deviation to the root-to-tip output of the `clock` command # 0.8.1 -- bug fixe amino acid profile map. # 0.8.0 -- drop python 2.7 support, bug fixes. # 0.7.6 -- catch of distributions are too short for calculating confidence intervals. # 0.7.5 -- fix desync of peak from grid of distributions after pruning # 0.7.4 -- bug fix in reconstruct discrete trait routine The `reconstruct_discrete_traits` wrapper function didn't handle missing data correctly (after the changed released in 0.7.2) which resulted in alphabets and weights of different lengths. # 0.7.3 -- bug fix in average rate calculation This release fixes a problem that surfaced when inferring GTR models from trees of very similar sequences but quite a few gaps. This resulted in mutation counts like so: A: [[ 0. 1. 8. 3. 0.] C: [ 1. 0. 2. 7. 0.] G: [ 9. 0. 0. 2. 0.] T: [ 1. 23. 6. 0. 0.] -: [46. 22. 28. 38. 0.]] As a result, the rate "to gap" is inferred quite high, while the equilibrium gap fraction is low. Since we cap the equilibrium gap fraction from below to avoid reconstruction problems when branches are very short, this resulted in an average rate that had substantial contribution from and assumed 1% equilibrum gap frequency where gaps mutate at 20times the rate as others. Since gaps are ignored in distance calculations anyway, it is more sensible to exclude these transitions from the calculation of the average rate. This is now happening in line 7 of treetime/gtr.py. The average rate is restricted to mutation substitutions from non-gap states to any state. # 0.7.2 -- weights in discrete trait reconstruction This release implements a more consistent handling of weights (fixed equilibrium frequencies) in discrete state reconstruction. It also fixes a number of problems in who the arguments were processed. TreeTime now allows * unobserved discrete states * uses expected time-in-tree instead of observed time-in-tree in GTR estimation when weights are fixed. The former resulted in very unstable rate estimates. # 0.7.0 -- restructuring ## Major changes This release largely includes changes under the hood, some of which also affect how treetime behaves. The biggest changes are * sequence data handling is now done by a separate class `SequenceData`. There is now a clear distinction between input data that is never changed and inferred sequences. This class also provides consolidated set of functions to convert sparse, compressed, and full sequence representations into each other. * sequences are now unicode when running from python3. This does not seem to come with a measurable performance hit compared to byte sequences as long as all characters are ASCII. Moving away from bytes to unicode proved much less hassle than converting sequences back and forth from unicode to bytes during IO. * Ancestral state reconstruction no longer reconstructs the state of terminal nodes by default and sequence accessors and output will return the input data by default. Reconstruction is optional. * The command-line mugration model inference now optimize the overall rate numerically and is hence no longer making a short-branch length assumption. * TreeTime raises now a number of custom errors rather than returning success or error codes. This should result in fewer "silent errors" that cause problems downstream. ## Minor new features In addition, we implemented a number of other changes to the interface * `treetime`, `treetime clock` now accept the arguments `--name-column` and `-date-column` to explicitly specify the metadata columns to be used as name or date * `treetime mugration` accepts a `--name-column` argument. ## Bug fixes * scaling of skyline confidence intervals was wrong. It now reflects the inverse second derivative in log-space * catch problems after rerooting associated with missing attributes in the newly generated root node. * make conversion from calendar dates to numeric dates and vice versa compatible and remove approximate handling of leap-years. * avoid overwriting content of output directory with default names * don't export inferred dates of tips labeled as `bad_branch`.treetime-0.11.1/contributing.md000066400000000000000000000010511447636507100164530ustar00rootroot00000000000000# Contributing to TreeTime Thank you for your interest in contributing to TreeTime. We welcome pull-requests that fix bugs or implement new features. ## Bugs If you come across a bug or unexpected behavior, please file an issue. ## Testing Upon pushing a commit, travis will run a few simple tests. These use data available in the [neherlab/treetime_examples](https://github.com/neherlab/treetime_examples) repository. ## Coding conventions (loosly adhered to) * indentation: 4 spaces * docstrings: numpy style * variable names: snake_case treetime-0.11.1/docs/000077500000000000000000000000001447636507100143555ustar00rootroot00000000000000treetime-0.11.1/docs/.dockerignore000066400000000000000000000000231447636507100170240ustar00rootroot00000000000000* !environment.yml treetime-0.11.1/docs/Dockerfile000066400000000000000000000020521447636507100163460ustar00rootroot00000000000000FROM continuumio/miniconda3:4.10.3 ARG DEBIAN_FRONTEND=noninteractive ARG USER=user ARG GROUP=user ARG UID ARG GID ENV TERM="xterm-256color" ENV HOME="/home/user" RUN set -x \ && mkdir -p ${HOME}/src \ && \ if [ -z "$(getent group ${GID})" ]; then \ addgroup --system --gid ${GID} ${GROUP}; \ else \ groupmod -n ${GROUP} $(getent group ${GID} | cut -d: -f1); \ fi \ && \ if [ -z "$(getent passwd ${UID})" ]; then \ useradd \ --system \ --create-home --home-dir ${HOME} \ --shell /bin/bash \ --gid ${GROUP} \ --groups sudo \ --uid ${UID} \ ${USER}; \ fi \ && touch ${HOME}/.hushlogin RUN set -x \ && chown -R ${USER}:${GROUP} ${HOME} COPY environment.yml ${HOME}/src/ WORKDIR ${HOME}/src RUN set -x \ && conda env create docs USER ${USER} RUN set -x \ && conda init bash \ && echo "conda activate docs" >> ${HOME}/.bashrc CMD bash -c "set -x \ && source ${HOME}/.bashrc \ && cd ${HOME}/src/docs \ && rm -rf build \ && make autobuild \ " treetime-0.11.1/docs/Makefile000066400000000000000000000013311447636507100160130ustar00rootroot00000000000000# Minimal makefile for Sphinx documentation # # You can set these variables from the command line, and also # from the environment for the first two. SPHINXOPTS ?= SPHINXBUILD ?= sphinx-build SOURCEDIR = source BUILDDIR = build # Put it first so that "make" without argument is like "make help". help: @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) .PHONY: help Makefile # Catch-all target: route all unknown targets to Sphinx using the new # "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). %: Makefile @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) autobuild: sphinx-autobuild --host=0.0.0.0 --port=8000 "$(SOURCEDIR)" "$(BUILDDIR)/html" treetime-0.11.1/docs/environment.yml000066400000000000000000000005121447636507100174420ustar00rootroot00000000000000name: docs channels: - defaults dependencies: - make - sphinx - pip - pip: - biopython>=1.67,!=1.77,!=1.78 - numpy>=1.10.4 - pandas>=0.17.1 - scipy>=0.16.1 - recommonmark>=0.5.0 - sphinx-argparse>=0.2.5 - sphinx-autobuild - sphinx-markdown-tables - sphinx-rtd-theme - sphinx-tabs treetime-0.11.1/docs/flu_200.png000066400000000000000000000442031447636507100162350ustar00rootroot00000000000000PNG  IHDR XvpsBIT|d pHYsaa?i IDATxt[w}W'+N%V7ICŅSsN _F᜝;c9;NfwbӅTY1?-t0ai#fh9- R#g- }Ȯ*+Jz>i{uuytZ]^A0 C0 C0 C0 C0 C0 C0 C0 C0 C0 C0 C0 C0 C0 C0 C0 C0 C0 C0 C0 C0 C0 C0 C0 C0 C0 C0 C0 C0 sc\^tE]zg͛z+W4{9u۾momo!8˲dYV{zzT*k׮5pe|>e  -̲,MLL(4{)UѣG 4YH$Ihǎ*H(L[[lѹs紺Z3 Ða5 #߯^D"1aG;22#G8LFqr=xW.dRpX333 冀 ̩Sc5{400P34M654/W@\:p@EqB:JSTJZ\\\c+ .[N՞86::۷K<h?@@^7U,k;G</{JdnnwR1 ۰Pգԉc@ PAP Љ'NBwZb1/{Ί$B!RS ŕh9 ͒S{-X@ ~Eќzi'4׳D@rJ52~0 я~t] n0>>G6{C@2|>m׮]?JR)TtM7$ϧ^z wܱ -4M*L H caY+7Rqݻn(bf͛7jӦMrJW쓷Jrʙ[2jF\y#C:T"(M,PFiXD"1Mp(0 iDodRpX333 E+ @" Љ'~nB'oS @{,tPB4*JUJ7S_~Yz_@i羓ri߷oE\ھZJ+ `eE%v[omS TwҎK5o޼YRKNMkqJG֓c ` @|v6,WzѣG~@{ 4M6Mƾ7txd=u@J˲*nPiU2<ΰ,KD"eё#G*h}@ۨbQx +TB vRfT*U*ReYTA -T2 븪 m@ zsfijvvjF-K[̲! i6i||jG@#˲411Q"[=PSiyp:,KHDd2=pM@~Kzzzr>K&.]T^-..V,$ڵkcuH$tq*,TK|:pFGG>+,4X Okii)SleI˗KmU@l۶M7x^VJqI?\Uhz_?7R&ڂc BPP lJ&///ɓegب Љ'2xSH='Zait :a2 ˨j+,vŤ^l:@5ϧq*r˲2*U,@X%iddDG8\Ų,E"MNNW@ W]ٳX~8mWa#Ji~~^] 鲷]I*9TX%IG^w]8\#ފ/+ sss^DbN bZYYtbYU e U Љ'6'ٚEppJNߢUhk} ۢeFIY= ۢeo:{կfe.r mѲ+#SSSɻgf,@Z\"P2l2֖-[t9ؑհ+#X,s$Ȉ۷gpb'SL"ؘp]*H ^ dt[$Ia̸vQr3n*ϗ%S4,fPTvB @S͛7jӦMrJUߵC=n,G9: =w˲4113XpttT۷o_s/SρAdYVf4Ch j~_b:,h @-[N8B-s~"gYVf抽e+mYl\#{pcCKm*۪![H{քmYTJ+++sr@MWhdCS4~iE"h׮]@u ۗzx+ sssK5pr%@i[T?g@@Ke^H~>@@Kd^HJA$^BheeETJ׮][sczVdx<d>x 3>h߾}ZZZjMdb4M*Lf* Z{4$Qi2MS{n]|9ӄ^3@v_G!]ݖeɲؾQI\dؾH~/HtwwkuuUz<yޢSZ Tdl*&/_jz?@@I'[e˞Q絰}[WAh/PVVr|K~N Pb|ϟב#G}Lv[tjV2>O~b@5BL?:VmF3lݺUǏҒ\s^&->Jx6eibbBH4WIF)W݈D"<*T7~׵ @c@XU ǕJ4??Ŋ,y F!ahppPP(sX[ UOhRZa:q,TCab*$@@@K!3xF+^@@KˮTˮn*%@ 孧5@u G,syڲeΝ;ղu H|>[fz1띒^)_!I'*L:Z* i(/6G$JieeE&s[;$_" 4eܼy^6mڤ+W8RXLU<"T/!QjzfwB Pf/U -P#{kmVcv,J{555T*zw\0 (jwv䤆^О U Љ'jTbCyeYZ]]ʊ6nܨުt p0rTd|P>Gּ]@+bٞ bY>xN@@v?}ovcz*իWKV@z{{u-}sxՀ@J(='dzzlO:Hv#K?nv ꝞցE PTJ_$r//i۶mJRk^%UjW(\tIۿ5aptJNY&/..jaaAsssZ^^֥K$: فƮLOOg>_^^ɓ'iL@ɮ\pAg4::lff&gXa>i 0 C@@s* v+m۶oToosBۭ@Ae圚Uhƍ2MSJ&n@ְ,Keȋy4M\y ʭxqE"MNNWرC7n2GXx^ŋzj{Dζ, ,ʩx؃xUϱ{@R]RAhPG a BuyϱcǴsΜkt*!hw<`ZNڱcG TgP A#Vla2 gU{n=쳺tRJH!TG #{U)333 UtmVvy#$Ia(T]@@ǪeSJޓdo2=۱Ъ cw;WbXaԑ۱к 5D> :WF, ptZW^z$ \+Rqݻw] gA*9ݻwlFC:Z {A:h7|^ K @ijvv6a\t쌐e]t&t,@YrG!D"S! ?U5bLd%KBݏ~- 3 4riA-..{EMSϾ/c{0M3'p)uV9dlB#@ZD WTئF 6_bQjzFp 4Cw~w6K+"r$mDFТi"G+ MhG|zk^{Ncccڽ{wU" W#i{_fgg>UenfIs=W=p;s*GJjVEpcǎo~VD"9Zvܩ% )K*@px/_łb1adF*!LQ~TBQ@\xc.]DZp< IDAT} g|tIJ&J&lłk@Z𰦦$I:~8[jdiӧ }/)ҥK{z.bߟS )Ԕ>>>{e@5 -T%nJn`UB! 233#I6moSO=ױ ؕ-..رcڹs'Mp * m4M=#Ԕ$QhID"g`!G۫Ś C8b )|>X,Y,[sn#8Biȑ#?AG6*$رczߜ'OVLF7 Ν;500smeг-//KRՍTM4@ 2M`H$t֩i6L&knZN#t@ f+" -֐osH$l -ქs1-ܒ,82Gz]⁺#R}do}/|> \X$L,8L쬒df;rųAؖ'@:@K.)#n5fٖ'@\7Nz%I絸sKcq$-..8A~ӧOgO*4+B0iT<'b5BS 󩿿_htjxiСCcǎk_Z揙I3<}CJ$\* esΜJݨKhD# ݨ77T06=S^a.ܽ{ɤ$ @*50Hd$@the؜bჽ:y򤦦r޽{?K٧Q%Ib1ǃHcn>ϾX/٧QN{z):tY X@Mbַu!a&9۱ Y^^} X7@vHhT~ᄏw@Z?3M -ҥKy@m nBhA[mYdRdX@=@Z\"XmYlł@Z]bmYtR{{{X TW333U5W @hA }j'@ZX L1\nPW[^ -Ξb~iAb.//ɓD"%v+  kxxX`۴4 TB4@+!WbR"B%N#iX"UcǎiΝk;j[(P7*JbW@=w||\{];lhgeWIv]tGiaf]{dJփIX$u4@LRg Fh3*(7IX@I&k*ȟMQɀu5{pϧq>PWT@\5 o}[L&3|Ձj@Z?_}mH^8B|>555U6go=,˒eY2 CaYhbfgguNjFCeYP$Ȉ9Ý -4͚g[[lѹs紺xn;T?@@EO:$O~_+s?a. (ӱ~VE@YN:99+{])&]9: XX~89~W ՑF@Mnݪ~ZOT@հ,+rB@Pm۶iϞ=rJZ<ޏFX 1 C5UA$11C@:@0D`bN8QB[ڳgOO*%儕JV VvdnnN###ڷo_UGk!tӫa{1MMMr %;y<Eтp讻*Y@PV,[׷rKX9J@PpiuيŖ,H`fggL&3bΞ=zJ?OH$>KE $4ef ?gysFFFk.C@U|>(˲3hrrR~ BT4M=C9~ɀA:lT@TUNO㒤T*iE"Ӏ͔:w oP($(݊U}d/ՒFh3'W'V?":_ճ,DzB@PuV޽;Z*R49xF5۶m.IhEGf^{L !jm6=#ַ H|46[o0 TA${Mꭍ2 C'Nko3y<y^-VeWD@WD@na#x =ў>0t\,Kh4w}XS@gGx_[ E"5oa,0Bդ5@8˲Drڧ[qR)kqqѱwҤ 졄}[}n9T?Z*5>ʮ[B#M4ϿǮTz@l]=Rhq;1<GաCtԩ& nAuF599̵rRio8.{2RAl47gOF9b5A }EOʞB@]deKR T9:Æ0 5۷{@#H(L[[lѹs紺n~whJъ H$S8vpEh7d$Ia(7bO?J!`@ l޼Y^W6mҕ+Wd@Qj~a:z.]h4Z>N\Dχ?>яjqq}L:l ~eYT4訶o^>Sz>J,KhTyk477WC:kT } V<$^o2|>kچ%I^W  45;;[$h4feY:uxb,+G#145;;[p tRI8 ȹ= ʕ+e=%ݮ0@ڜi2Mi/4%=JlbU ۱2[<$)fҾ ;;TՐ9IOz'rҩ7Ʈ9sfM%nJ h(0444S o]^:] $={V'2b}Q@SdWB$IbV+!333P(ҩS,4}:V eYT?ugYD@YY0@X,VjXfG)ljo4<<`0XwaYN:>:Y%ɂb… ZZZj{x q=c:p@:i2MG?*?Jizzh/ȩStBH#&DB >n}x\PH+++{AϿ/ @.}}}5{A Ph=!!^|ł P(W2 C\+Ԍ}u{J:ueN83g( mFPC@)֌^{h/]^: B[ڨ!{A*݊6B@CT+JIR^[ +U*3ר>ʊbk?gU+BB@PcϬt+V*R8@PiU2\kUl+V}p/J2MSiݽ.r. 9 h {+deYСCtԩ&BM++gA2HH5@TVP(=%ݮ䟒őbYxh4Z^u7\/{J +X^ǓbH h @ S?G %dWA~-S2@αv(Քw!e{Y:SN5yu[RNMMIFGG7+C% h9v%$i~~^sssvv쥡 Z=p0Ȳ,[Ćt:n"t4 @@4 @@4 @@ /;{G>O]]]?\O}Sڽ{6mڤ۷kllL+++9_aOM]xQ{nVtMzޠo~u$NtO __{^=k巭z?яt4Mm޼Y}k}3}^q馛co"Ț{#򖷨G^WT</ܙX׮][sm'?O]]]z\PpN{wߝ>|p+}h}n!''o|Oo9=44vZ>˲wַ5Օ̽{oO?7~;ޑ~ի^3۟龾K_Ezaa!=??޺ukzΝ_~9s/m9^|9חO>d_zKoذ!O|"w+}wggg SNۗ~ի^}h4e˖wߝ׾җ޻wonK[̏|#鮮?^XXH?##Gr㷭z+7ozӛ t:MXްaÚGs駟Noذ!㏗|/I8p >J\vZA'~Loذ!}nͽ]]]/˙kgg鮮ۿ{={zzҗ/_\d2/޺ukWW3w}>_N?|zƍz(smyy9yh3O8>lm}9ۻwoot:f ZF8soϹkkSN?yz{ߛs_vڥ׿k7p:х '@16m$|9|Jә%~[-4׽nͽ?H IDAT}-s߷n5n&ٳ'z;ߩn)s߮7Mҗկ~U{sy}?/g֗ӿm5m!LݝsUz6lؠgϖg?Y|z;ߙs5?c=Fm߯7:~y?V$>u]z[ޒ}n:ι߷GHD{$\5yz2{߻uVk߶ h!{Q:ӧs>}ZtZE@w'!eNooo6lWرCӣK^W_u 7duj~={^ /s﷾-mذ!^~O~}KT*soww6o\^~Zo[ ~[H;S+˗/FGGu 7qmذA{R?Ou=hiiIgo}KO>^x-oK/R{axz{ޣ%]tI/| TQ_PHO?>O"oF:uJoou{nw!Mqǿ(ΉD!XExʛ&@B6hBIE Z#0+K Aݕ0l߾}ϟ?[>={ؓ'O<;p@q|݈-H˗KEQ sf{nkjj2fmŹe[]]-ɋlݨUA03SVܺuKCGUKK~Qq;w޾}[V%`__OU":޽+<ӥK֭Zw ۫}l'K$ݻn?3L}ή+++R8VKK433S:ۯ_jxxXhT`PHD'O,* رcP u-,,T%%:tZ[[uV?~\_|x܉ uuuYHDDB|ll U=ÇKf$ g( p g( p g( p g( p g( p g( p g( p g( p g( p g( pSИ}IENDB`treetime-0.11.1/docs/source/000077500000000000000000000000001447636507100156555ustar00rootroot00000000000000treetime-0.11.1/docs/source/APIdoc.rst000066400000000000000000000013601447636507100175060ustar00rootroot00000000000000API documentation ================= .. toctree:: :maxdepth: 1 :hidden: treetime clock_tree treeanc seqgen gtr merger_models vcf_utils seq_utils Core classes ------------ .. automodule:: treetime :doc:`TreeTime class` ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ :doc:`ClockTree class` ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ :doc:`TreeAnc class` ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ :doc:`SeqGen class` ~~~~~~~~~~~~~~~~~~~~~~~~~~~ :doc:`GTR class` ~~~~~~~~~~~~~~~~~~~~~ :doc:`Coalescent class` ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Utility code ------------ :doc:`VCF tools` ~~~~~~~~~~~~~~~~~~~~~~~~~~~ :doc:`Seq tools` ~~~~~~~~~~~~~~~~~~~~~~~~~~~ treetime-0.11.1/docs/source/clock_tree.rst000066400000000000000000000017321447636507100205240ustar00rootroot00000000000000***************************** ClockTree class documentation ***************************** ClockTree is a class that implements the core algorithms for maximum likelihood time tree inference. It operates on a tree with fixed topology. All operations the reroot or change tree topology are part of the TreeTime class. .. .. autoclass:: treetime.ClockTree .. :members: ClockTree docstring and constructor =================================== .. autoclass:: treetime.ClockTree :members: __init__ Running TreeTime analysis ========================= .. automethod:: treetime.ClockTree.init_date_constraints .. automethod:: treetime.ClockTree.make_time_tree Post-processing =============== .. automethod:: treetime.ClockTree.branch_length_to_years .. automethod:: treetime.ClockTree.convert_dates .. automethod:: treetime.ClockTree.get_confidence_interval .. automethod:: treetime.ClockTree.get_max_posterior_region .. automethod:: treetime.ClockTree.timetree_likelihood treetime-0.11.1/docs/source/commands.rst000066400000000000000000000002251447636507100202070ustar00rootroot00000000000000Detailed command line documentation =================================== .. argparse:: :module: treetime :func: make_parser :prog: treetime treetime-0.11.1/docs/source/conf.py000066400000000000000000000236151447636507100171630ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # TreeTime documentation build configuration file, created by # sphinx-quickstart on Mon Jul 31 11:44:07 2017. # # This file is execfile()d with the current directory set to its # containing dir. # # Note that not all possible configuration values are present in this # autogenerated file. # # All configuration values have a default; values that are commented out # serve to show the default. import sys import os # If extensions (or modules to document with autodoc) are in another directory, # add these directories to sys.path here. If the directory is relative to the # documentation root, use os.path.abspath to make it absolute, like shown here. sys.path.insert(0, os.path.abspath('../..')) from treetime import version # -- General configuration ------------------------------------------------ # If your documentation needs a minimal Sphinx version, state it here. #needs_sphinx = '1.0' # Add any Sphinx extension module names here, as strings. They can be # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom # ones. extensions = [ 'sphinx.ext.autodoc', 'sphinx.ext.doctest', 'sphinx.ext.todo', 'sphinx.ext.coverage', 'sphinx.ext.mathjax', 'sphinx.ext.viewcode', 'sphinx.ext.napoleon', 'recommonmark', 'sphinxarg.ext' ] # Napoleon settings napoleon_google_docstring = False napoleon_numpy_docstring = True napoleon_include_init_with_doc = True napoleon_include_private_with_doc = True napoleon_include_special_with_doc = True napoleon_use_admonition_for_examples = False napoleon_use_admonition_for_notes = False napoleon_use_admonition_for_references = False napoleon_use_ivar = False napoleon_use_param = True napoleon_use_rtype = True # Add any paths that contain templates here, relative to this directory. templates_path = ['_templates'] # The suffix(es) of source filenames. # You can specify multiple suffix as a list of string: # source_suffix = ['.rst', '.md'] source_suffix = ['.rst', '.md'] # The encoding of source files. #source_encoding = 'utf-8-sig' # The master toctree document. master_doc = 'index' # General information about the project. project = u'TreeTime' copyright = u'2017-2021, Pavel Sagulenko and Richard Neher' author = u'Pavel Sagulenko and Richard Neher' # The version info for the project you're documenting, acts as replacement for # |version| and |release|, also used in various other places throughout the # built documents. # # The full version, including alpha/beta/rc tags. release = version # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. # # This is also used if you do content translation via gettext catalogs. # Usually you set "language" from the command line for these cases. language = None # There are two options for replacing |today|: either, you set today to some # non-false value, then it is used: #today = '' # Else, today_fmt is used as the format for a strftime call. #today_fmt = '%B %d, %Y' # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. # This patterns also effect to html_static_path and html_extra_path exclude_patterns = [] # The reST default role (used for this markup: `text`) to use for all # documents. #default_role = None # If true, '()' will be appended to :func: etc. cross-reference text. #add_function_parentheses = True # If true, the current module name will be prepended to all description # unit titles (such as .. function::). #add_module_names = True # If true, sectionauthor and moduleauthor directives will be shown in the # output. They are ignored by default. #show_authors = False # The name of the Pygments (syntax highlighting) style to use. pygments_style = 'sphinx' # A list of ignored prefixes for module index sorting. #modindex_common_prefix = [] # If true, keep warnings as "system message" paragraphs in the built documents. #keep_warnings = False # If true, `todo` and `todoList` produce output, else they produce nothing. todo_include_todos = True # -- Options for HTML output ---------------------------------------------- # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. # html_theme = 'alabaster' html_theme = 'sphinx_rtd_theme' html_theme_options = {} # Theme options are theme-specific and customize the look and feel of a theme # further. For a list of options available for each theme, see the # documentation. #html_theme_options = {} # Add any paths that contain custom themes here, relative to this directory. #html_theme_path = [] # The name for this set of Sphinx documents. # " v documentation" by default. #html_title = u'TreeTime v1.0' # A shorter title for the navigation bar. Default is the same as html_title. #html_short_title = None # The name of an image file (relative to this directory) to place at the top # of the sidebar. #html_logo = None # The name of an image file (relative to this directory) to use as a favicon of # the docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 # pixels large. #html_favicon = None # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". # html_static_path = ['_static'] html_static_path = [] # Add any extra paths that contain custom files (such as robots.txt or # .htaccess) here, relative to this directory. These files are copied # directly to the root of the documentation. #html_extra_path = [] # If not None, a 'Last updated on:' timestamp is inserted at every page # bottom, using the given strftime format. # The empty string is equivalent to '%b %d, %Y'. #html_last_updated_fmt = None # If true, SmartyPants will be used to convert quotes and dashes to # typographically correct entities. #html_use_smartypants = True # Custom sidebar templates, maps document names to template names. #html_sidebars = {} # Additional templates that should be rendered to pages, maps page names to # template names. #html_additional_pages = {} # If false, no module index is generated. #html_domain_indices = True # If false, no index is generated. #html_use_index = True # If true, the index is split into individual pages for each letter. #html_split_index = False # If true, links to the reST sources are added to the pages. #html_show_sourcelink = True # If true, "Created using Sphinx" is shown in the HTML footer. Default is True. #html_show_sphinx = True # If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. #html_show_copyright = True # If true, an OpenSearch description file will be output, and all pages will # contain a tag referring to it. The value of this option must be the # base URL from which the finished HTML is served. #html_use_opensearch = '' # This is the file name suffix for HTML files (e.g. ".xhtml"). #html_file_suffix = None # Language to be used for generating the HTML full-text search index. # Sphinx supports the following languages: # 'da', 'de', 'en', 'es', 'fi', 'fr', 'hu', 'it', 'ja' # 'nl', 'no', 'pt', 'ro', 'ru', 'sv', 'tr', 'zh' #html_search_language = 'en' # A dictionary with options for the search language support, empty by default. # 'ja' uses this config value. # 'zh' user can custom change `jieba` dictionary path. #html_search_options = {'type': 'default'} # The name of a javascript file (relative to the configuration directory) that # implements a search results scorer. If empty, the default will be used. #html_search_scorer = 'scorer.js' # Output file base name for HTML help builder. htmlhelp_basename = 'TreeTimedoc' # -- Options for LaTeX output --------------------------------------------- latex_elements = { # The paper size ('letterpaper' or 'a4paper'). #'papersize': 'letterpaper', # The font size ('10pt', '11pt' or '12pt'). #'pointsize': '10pt', # Additional stuff for the LaTeX preamble. #'preamble': '', # Latex figure (float) alignment #'figure_align': 'htbp', } # Grouping the document tree into LaTeX files. List of tuples # (source start file, target name, title, # author, documentclass [howto, manual, or own class]). latex_documents = [ (master_doc, 'TreeTime.tex', u'TreeTime Documentation', u'Pavel Sagulenko and Richard Neher', 'manual'), ] # The name of an image file (relative to this directory) to place at the top of # the title page. #latex_logo = None # For "manual" documents, if this is true, then toplevel headings are parts, # not chapters. #latex_use_parts = False # If true, show page references after internal links. #latex_show_pagerefs = False # If true, show URL addresses after external links. #latex_show_urls = False # Documents to append as an appendix to all manuals. #latex_appendices = [] # If false, no module index is generated. #latex_domain_indices = True # -- Options for manual page output --------------------------------------- # One entry per manual page. List of tuples # (source start file, name, description, authors, manual section). man_pages = [ (master_doc, 'treetime', u'TreeTime Documentation', [author], 1) ] # If true, show URL addresses after external links. #man_show_urls = False # -- Options for Texinfo output ------------------------------------------- # Grouping the document tree into Texinfo files. List of tuples # (source start file, target name, title, author, # dir menu entry, description, category) texinfo_documents = [ (master_doc, 'TreeTime', u'TreeTime Documentation', author, 'TreeTime', 'One line description of project.', 'Miscellaneous'), ] # Documents to append as an appendix to all manuals. #texinfo_appendices = [] # If false, no module index is generated. #texinfo_domain_indices = True # How to display URL addresses: 'footnote', 'no', or 'inline'. #texinfo_show_urls = 'footnote' # If true, do not generate a @detailmenu in the "Top" node's menu. #texinfo_no_detailmenu = False treetime-0.11.1/docs/source/gtr.rst000066400000000000000000000016441447636507100172100ustar00rootroot00000000000000*********************** GTR class documentation *********************** .. autoclass:: treetime.GTR :members: __init__ .. automethod:: treetime.GTR.standard .. automethod:: treetime.GTR.custom .. automethod:: treetime.GTR.random .. automethod:: treetime.GTR.infer .. automethod:: treetime.GTR.assign_rates .. Note:: GTR object can be modified in-place by calling :py:func:`treetime.GTR.assign_rates` Sequence manipulation --------------------- .. automethod:: treetime.GTR.state_pair Distance and probability computations ------------------------------------- .. automethod:: treetime.GTR.optimal_t .. automethod:: treetime.GTR.optimal_t_compressed .. automethod:: treetime.GTR.prob_t .. automethod:: treetime.GTR.prob_t_compressed .. automethod:: treetime.GTR.prob_t_profiles .. automethod:: treetime.GTR.propagate_profile .. automethod:: treetime.GTR.sequence_logLH .. automethod:: treetime.GTR.expQt treetime-0.11.1/docs/source/index.rst000066400000000000000000000053201447636507100175160ustar00rootroot00000000000000.. TreeTime documentation master file, created by sphinx-quickstart on Mon Jul 31 11:44:07 2017. You can adapt this file completely to your liking, but it should at least contain the root `toctree` directive. TreeTime: time-tree and ancestral sequence inference ==================================================== .. image:: https://github.com/neherlab/treetime/actions/workflows/ci.yml/badge.svg?branch=master :target: https://github.com/neherlab/treetime/actions/workflows/ci.yml .. image:: https://anaconda.org/bioconda/treetime/badges/installer/conda.svg :target: https://anaconda.org/bioconda/treetime TreeTime provides routines for ancestral sequence reconstruction and inference of molecular-clock phylogenies, i.e., a tree where all branches are scaled such that the positions of terminal nodes correspond to their sampling times and internal nodes are placed at the most likely time of divergence. To optimize the likelihood of time-scaled phylogenies, TreeTime uses an iterative approach that first optimizes branch lengths of the tree given the sequence data and date constraints, and then optimizes coalescent tree priors, relaxed clock parameters, or resolves polytomies. This cycle is repeated a few times. The only topology optimization are (optional) resolution of polytomies in a way that is most (approximately) consistent with the sampling time constraints on the tree. The code is hosted on `github.com/neherlab/treetime `_. .. toctree:: :maxdepth: 2 :hidden: installation tutorials commands APIdoc .. image:: https://raw.githubusercontent.com/neherlab/treetime_examples/master/figures/tree_and_clock.png Features -------- * ancestral sequence reconstruction (marginal and joint maximum likelihood) * molecular clock tree inference (marginal and joint maximum likelihood) * inference of GTR models * rerooting to maximize temporal signal and optimize the root-to-tip distance vs time relationship * simple phylodynamic analysis such as coalescent model fits Developer info -------------- - Source code on github at https://github.com/neherlab/treetime - Copyright and License: Pavel Sagulenko, Emma Hodcroft, and Richard Neher, MIT Licence - References * `TreeTime: Maximum-likelihood phylodynamic analysis `_ by Pavel Sagulenko, Vadim Puller and Richard A Neher. Virus Evolution. * `NextStrain: real-time tracking of pathogen evolution `_ by James Hadfield et al. Bioinformatics. Indices and tables ================== * :ref:`genindex` * :ref:`modindex` * :ref:`search` treetime-0.11.1/docs/source/installation.rst000066400000000000000000000034411447636507100211120ustar00rootroot00000000000000Installation ============ TreeTime is compatible with Python 2.7 upwards and is tested on 2.7, 3.5, and 3.6. It depends on several Python libraries: * numpy, scipy, pandas: for all kind of mathematical operations as matrix operations, numerical integration, interpolation, minimization, etc. * BioPython: for parsing multiple sequence alignments and phylogenetic trees * matplotlib: optional dependency for plotting Installing from PyPi or Conda ----------------------------- You can also install TreeTime from PyPi via .. code:: bash pip install phylo-treetime You might need root privileges for system wide installation. Similarly, you can install from conda using .. code:: bash conda install -c bioconda treetime Installing from source ---------------------- Clone or download the source code. .. code:: bash git clone https://github.com/neherlab/treetime.git cd treetime pip install . You might need root privileges for system wide installation. Alternatively, you can simply use it TreeTime locally without installation. In this case, just download and unpack it, and then add the TreeTime folder to your $PYTHONPATH. Building the documentation -------------------------- The API documentation for the TreeTime package is generated created with Sphinx. The source code for the documentaiton is located in doc folder. - sphinx-build to generate static html pages from source. Installed as .. code:: bash pip install Sphinx - basicstrap Html theme for sphinx: .. code:: bash pip install recommonmark sphinx-argparse sphinx_rtd_theme After required packages are installed, navigate to doc directory, and build the docs by typing: .. code:: bash make html Instead of html, another target as `latex` or `epub` can be specified to build the docs in the desired format. treetime-0.11.1/docs/source/merger_models.rst000066400000000000000000000021551447636507100212360ustar00rootroot00000000000000****************************** Coalescent class documentation ****************************** .. Note:: Using the coalescent model is optional. When running via the command line this class will only be initialized when the flag .. code-block:: bash --coalescent is used. The argument is either ``‘const’`` (have TreeTime estimate a constant coalescence rate), or ``‘skyline’`` (estimate a piece-wise linear merger rate trajectory) or a floating point number giving the time scale of coalescence in units of divergence (``Tc``). This is also called the effective population size. .. autoclass:: treetime.Coalescent :members: __init__ Parameters of the Kingsman coalescence model -------------------------------------------- .. automethod:: treetime.Coalescent.branch_merger_rate .. automethod:: treetime.Coalescent.total_merger_rate .. automethod:: treetime.Coalescent.cost Skyline Methods --------------------- .. automethod:: treetime.Coalescent.optimize_skyline .. automethod:: treetime.Coalescent.skyline_empirical .. automethod:: treetime.Coalescent.skyline_inferredtreetime-0.11.1/docs/source/seq_utils.rst000066400000000000000000000003101447636507100204110ustar00rootroot00000000000000******************* Sequence Utilities ******************* .. autofunction:: treetime.seq_utils.seq2array .. autofunction:: treetime.seq_utils.seq2prof .. autofunction:: treetime.seq_utils.prof2seqtreetime-0.11.1/docs/source/seqgen.rst000066400000000000000000000002041447636507100176650ustar00rootroot00000000000000Sequence evolution and generation ================================= .. autoclass:: treetime.seqgen.SeqGen :members: __init__ treetime-0.11.1/docs/source/treeanc.rst000066400000000000000000000041201447636507100200250ustar00rootroot00000000000000*************************** TreeAnc class documentation *************************** This is the core class of the TreeTime module. It stores the phylogenetic tree and implements the basic algorithms for sequence manipulation, sequence reconstruction, and branch length optimization. The tree is stored as Bio.Phylo object. In order to facilitate the tree operations, each node of the tree is decorated with additional attributes which are set during the tree preparation. These attributes need to be updated after tree modifications. The sequences are also attached to the tree nodes. In order to save memory, the sequences are stored in the compressed form. The TreeAnc class implements methods to compress and decompress sequences. The main purpose of the TreeAnc class is to implement standard algorithms for ancestral sequence reconstruction. Both marginal and joint maximum likelihood reconstructions are possible. The marginal reconstructions computes the entire distribution of the states at a given node after tracing out states at all other nodes. The `example scripts `_ illustrate how to instantiate TreeAnc objects. TreeAnc Constructor =================== .. autoclass:: treetime.TreeAnc :members: __init__ TreeAnc methods =============== Basic functions, utilities, properties -------------------------------------- .. automethod:: treetime.TreeAnc.prepare_tree .. automethod:: treetime.TreeAnc.prune_short_branches .. automethod:: treetime.TreeAnc.set_gtr .. automethod:: treetime.TreeAnc.logger .. automethod:: treetime.TreeAnc.aln() .. automethod:: treetime.TreeAnc.gtr() .. automethod:: treetime.TreeAnc.tree() .. automethod:: treetime.TreeAnc.leaves_lookup() Ancestral reconstruction and tree optimization ---------------------------------------------- .. automethod:: treetime.TreeAnc.infer_ancestral_sequences .. automethod:: treetime.TreeAnc.sequence_LH .. automethod:: treetime.TreeAnc.optimize_tree .. automethod:: treetime.TreeAnc.infer_gtr .. automethod:: treetime.TreeAnc.get_tree_dict treetime-0.11.1/docs/source/treetime.rst000066400000000000000000000017321447636507100202300ustar00rootroot00000000000000**************************** TreeTime class documentation **************************** TreeTime is the top-level wrapper class of the time tree inference package. In addition to inferring time trees, TreeTime can reroot your tree, resolve polytomies, mark tips that violate the molecular clock, or infer coalescent models. The core time tree inference is implemented in the class ClockTree. TreeTime docstring and constructor ================================== .. autoclass:: treetime.TreeTime :members: __init__ Main pipeline method ==================== .. automethod:: treetime.TreeTime.run Additional functionality ======================== .. automethod:: treetime.TreeTime.resolve_polytomies .. automethod:: treetime.TreeTime.relaxed_clock .. automethod:: treetime.TreeTime.clock_filter .. automethod:: treetime.TreeTime.reroot .. automethod:: treetime.TreeTime.plot_root_to_tip .. automethod:: treetime.TreeTime.print_lh .. autofunction:: treetime.plot_vs_years treetime-0.11.1/docs/source/tutorials.rst000066400000000000000000000020331447636507100204330ustar00rootroot00000000000000TreeTime command line usage =========================== TreeTime implements a command line interface (for details, see `Command-line API `_) that allow estimation of time scaled phylogenies, ancestral reconstruction, and analysis of temporal signal in alignments. The command interface is organized as the main command performing time-tree estimation as .. code:: bash treetime --tree tree_file --aln alignment --dates dates.tsv with other functionalities available as subcommands .. code:: bash treetime {ancestral, clock, homoplasy, mugration, arg, version} TreeTime can use full alignments in `fasta` or `phylip` format or work of VCF files. For each of the different subcommands, we prepared tutorials listed below. These tutorials use example data provided in the github-repository `github.com/neherlab/treetime_examples `_. .. toctree:: :maxdepth: 1 tutorials/timetree tutorials/ancestral tutorials/clock tutorials/mugration tutorials/homoplasytreetime-0.11.1/docs/source/tutorials/000077500000000000000000000000001447636507100177035ustar00rootroot00000000000000treetime-0.11.1/docs/source/tutorials/ancestral.rst000066400000000000000000000057161447636507100224220ustar00rootroot00000000000000 Ancestral sequence reconstruction using TreeTime ------------------------------------------------ At the core of TreeTime is a class that models how sequences change along the tree. This class allows to reconstruct likely sequences of internal nodes of the tree. On the command-line, ancestral reconstruction can be done via the command .. code-block:: bash treetime ancestral --aln data/h3n2_na/h3n2_na_20.fasta --tree data/h3n2_na/h3n2_na_20.nwk --outdir ancestral_results This command will save a number of files into the directory `ancestral_results` and generate the output .. code-block:: bash Inferred GTR model: Substitution rate (mu): 1.0 Equilibrium frequencies (pi_i): A: 0.2983 C: 0.1986 G: 0.2353 T: 0.2579 -: 0.01 Symmetrized rates from j->i (W_ij): A C G T - A 0 0.8273 2.8038 0.4525 1.031 C 0.8273 0 0.5688 2.8435 1.0561 G 2.8038 0.5688 0 0.6088 1.0462 T 0.4525 2.8435 0.6088 0 1.0418 - 1.031 1.0561 1.0462 1.0418 0 Actual rates from j->i (Q_ij): A C G T - A 0 0.2468 0.8363 0.135 0.3075 C 0.1643 0 0.1129 0.5646 0.2097 G 0.6597 0.1338 0 0.1432 0.2462 T 0.1167 0.7332 0.157 0 0.2686 - 0.0103 0.0106 0.0105 0.0104 0 --- alignment including ancestral nodes saved as ancestral_results/ancestral_sequences.fasta --- tree saved in nexus format as ancestral_results/annotated_tree.nexus TreeTime has inferred a GTR model and used it to reconstruct the most likely ancestral sequences. The reconstructed sequences will be written to a file ending in ``_ancestral.fasta`` and a tree with mutations mapped to branches will be saved in nexus format in a file ending on ``_mutation.nexus``. Mutations are added as comments to the nexus file like ``[&mutations="G27A,A58G,A745G,G787A,C1155T,G1247A,G1272A"]``. Amino acid sequences ^^^^^^^^^^^^^^^^^^^^ Ancestral reconstruction of amino acid sequences works analogously to nucleotide sequences. However, the user has to either explicitly choose an amino acid substitution model (JTT92) .. code-block:: bash treetime ancestral --tree data/h3n2_na/h3n2_na_20.nwk --aln data/h3n2_na/h3n2_na_20_aa.fasta --gtr JTT92 or specify that this is a protein sequence alignment using the flag ``--aa``\ : .. code-block:: bash treetime ancestral --tree data/h3n2_na/h3n2_na_20.nwk --aln data/h3n2_na/h3n2_na_20_aa.fasta --aa VCF files as input ^^^^^^^^^^^^^^^^^^ In addition to standard fasta files, TreeTime can ingest sequence data in form of vcf files which is common for bacterial data sets where short reads are mapped against a reference and only variable sites are reported. In this case, an additional argument specifying the mapping reference is required. .. code-block:: bash treetime ancestral --aln data/tb/lee_2015.vcf.gz --vcf-reference data/tb/tb_ref.fasta --tree data/tb/lee_2015.nwk The ancestral reconstruction is saved as a vcf files with the name ``ancestral_sequences.vcf``. treetime-0.11.1/docs/source/tutorials/clock.rst000066400000000000000000000063351447636507100215370ustar00rootroot00000000000000 Estimation of evolutionary rates and tree rerooting --------------------------------------------------- Treetime can estimate substitution rates and determine which rooting of the tree is most consistent with the sampling dates of the sequences. This functionality is implemented as subcommand ``clock``\ : .. code-block:: bash treetime clock --tree data/h3n2_na/h3n2_na_20.nwk --dates data/h3n2_na/h3n2_na_20.metadata.csv --sequence-len 1400 --outdir clock_results This command will print the following output: .. code-block:: bash Root-Tip-Regression: --rate: 2.826e-03 --r^2: 0.98 The R^2 value indicates the fraction of variation in root-to-tip distance explained by the sampling times. Higher values corresponds more clock-like behavior (max 1.0). The rate is the slope of the best fit of the date to the root-to-tip distance and provides an estimate of the substitution rate. The rate needs to be positive! Negative rates suggest an inappropriate root. The estimated rate and tree correspond to a root date: --- root-date: 1996.75 --- re-rooted tree written to clock_results/rerooted.newick --- wrote dates and root-to-tip distances to clock_results/rtt.csv --- root-to-tip plot saved to clock_results/root_to_tip_regression.pdf In addition, a number of files are saved in the directory specified with `--outdir`: * a rerooted tree in newick format * a table with the root-to-tip distances and the dates of all terminal nodes * a graph showing the regression of root-to-tip distances vs time * a text-file with the rate estimate .. image:: figures/clock_plot.png :target: figures/clock_plot.png :alt: rtt Confidence intervals of the clock rate ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ In its default setting, ``treetime clock`` the evolutionary rate and the Tmrca by simple least-squares regression. However, these root-to-tip distances are correlated due to shared ancestry no valid confidence intervals can be computed for this regression. This covariation can be efficiently accounted if the sequence data set is consistent with a simple strict molecular clock model, but can give misleading results when the molecular clock model is violated. This feature is hence off by default and can be switched on using the flag .. code-block:: bash --covariation Filtering of tips ^^^^^^^^^^^^^^^^^ More often than not, a subset of sequences in an alignment are outliers and don't follow the molecular clock model. Such outliers can badly skew rerooting and estimation of the substitution rates. To guard against such problems, ``treetime clock`` marks sequences as suspect if they deviate more than a certain amount from the clock model. TreeTime first performs a least-square root-to-tip vs date regression and then marks tips whose residuals are greater than ``n`` inter-quartile distances of the residual distribution. The parameter ``n`` is set via .. code-block:: bash --clock-filter and is 3 by default. For the example Ebola virus data set, the command .. code-block:: bash treetime clock --tree data/ebola/ebola.nwk --dates data/ebola/ebola.metadata.csv --sequence-len 19000 .. image:: figures/ebola_outliers.png :target: figures/ebola_outliers.png :alt: ebola rtt treetime-0.11.1/docs/source/tutorials/figures/000077500000000000000000000000001447636507100213475ustar00rootroot00000000000000treetime-0.11.1/docs/source/tutorials/figures/clock_plot.png000066400000000000000000001164721447636507100242210ustar00rootroot00000000000000PNG  IHDR5sBIT|d pHYsaa?i9tEXtSoftwarematplotlib version 2.2.2, http://matplotlib.org/ IDATxy\Uue˪h d傖 EYV8eմ:q\&e\RKMmqKKDEKsEYTVe]/˅zQrЇ<*EQB!DB!K@!BfF@!BfF@!BfF@!BfF@!BfF@!BfF@!BfF@!BfF@!BfF@!BfF@!BfF@!BfF@!BfF@!BfF@!BfƩ;ДfDR5twBф(MPZZ۷on! 릮! yzzpś!|fBZ|bKu7XPP`& mt8K@!&Rj09ݱU-I(BP3p1G= !*БYon4 !2.h36tW B( &Rj(6ʜIEd2a4o3B4e8::6t7Kyb.j=1 둢(呝dj!ꁏ^jR|W +M(##jw1BBBu.s9O+)^݌&&&~~~L:jj*u놛ݺucetJUö~+MF=ztK.ӓ4SkѶm[<==9sa2rHK( 7o_~6|?3w:B46p9O˥\ ]Narrr&33s7nȓO>kƨQضmO<3ƪmTT߬u里߿?k֬:o[oE``k`2cSZ-\r ?h",XMn l6sbbbj={srq>SKu?̳> @hh#MII7 ~]K.%;;ÇӦMyG8r}ܷ~(͛@DDgΜaƌe6m^wo߿?'%% y.~Ŋ<3U^wٲeiulϞ=Zt={ݻY?II.@___͵ZVyyyyk<(;cƌaҥy76;о}HԿpuueٕq4&P̘1JE\\ׯgذaر@qyXt)m۶%<<'OO?M߾}-m[lI||\^y3!!(43j(,Y믿^9sĨQ߿!WRҭR)J߿0k,RRRhݺ5_5QQQ:t;SsvJ/-z!9qDi4zEصkWYPP`ٕzc0HJJ"8877j]L4Grr7oس7|kZ QMg_4}b)9E>L(a6ΈIѽ E}~]腣Cݭ,Ψ)_… y9s&DGGZ=+V6{lƏoȑ#پ};7ofƍ6k׮%66Hڵk˗?>,_>ߪ]j=z5kְo߾&A`XXXCwC!ꝽtJN@\ .Ecc(Հ=kb LJ]vرcyy衇XjU;TfCqXb_5#F`ͬ\jpp0+ >ӧȾ}{=ړ]vq=|r/_d=zT@!Db%ݼa 2s ^Ig]Lۋ8, {a0Ijg%&n[7tʛxUPaPsџe:؞bP!uPo\f}:# ? .E3_. !nsI7'mM5' !PS(ftocv͉L !͌`"1Ю?"P*VPQ(I #H(B4#Z 7z K?O|@@!P|WV=߂QAO갏%`$7-%% &'8p/ChтݻGa0T=1dT*U~FzJ/{ILL$22:u*EEEVm6n=܃mem ɉ+W͛7mڴرc6T9˯h2|UdḲ?s!r 3\~g6N;ͨپv>ۊli`547cu+СCeŨjz-y~!;vd޼yr-ϼ믬Xs,YBAAձ,YrY`6gȆ !::L+K k7Ǐg֬Y/ܹ&}ĉ={6EEE{ 6'Np}s*UW_/!읦Hj~JՖ#E+m"C `Lt{ۆ'gKͿ>39x%HHH>uٲe4@DD0sLKPXnݺ96}tzI^ʼv%f͚ŢE4im.]Jvv6Mi<#9r>}?!CɓIMMC^?99`رc}ٲe O>dÚ5k bʕ_zMNoyk|U9A~g9EŤQITZ1FiŐ6],S2rHK( 7o_~6_ --F:w'(3AUxx'<$%%Uym۶1tPKP0f<<<غuklZUINN= <<`swv ܝkCl6sbbbj={srq>2E)S<՟qqqSN5Uppp/ڎ;8s z}e4hCeժUff͚Űa8}4...ɓgeĈ̟?~B^uڷo? 3?|hNfRs77bHER4Eal>=6^ LRj18{,1h > ѣG+Vg˖-ɓ'Y`'OqMիW3x`ڵkgu\ /@rrrٓ[P2NHH9SL޹9KNNNZ"??Ç~zo Kl207ֱ:t(7ndĉDGG?`yo7zϩ_/!k:s2w?{sbo OkPE%$$R cZ-~:tʏ%W\ᡇ"44]N{0} j۷c61FZnMϞ=GQqXϊٳ~?'O2zhXgggGhh(Vǯ(SPP޽{3f @SO=??_M@@F"33ZϨ6Qu^B4Yt$_HW[W 1l8|<\x/C[D@HH 00~x:vƍ-E-[Z։Uѱk׮1j(ٳgjF^jnnn;xJJ cՖT#;5 x{{do\ˋ{a9d%//yze~ 0op6mdi`]*==1ck788;vw Pi/2`>c˱?>/bϨV3KhU7nJ+8eX]OAA_! X; aNxh?jZKHHډ 쌓Si@l1yINNf֨Fu1z2III2!s=),,^{rzzzhZܵk2kL&gϞ-4(,, JEbbXVhժgϞ޲e 89ЧO [~QwyyyʹsoUϩ_/!2DU FYW+t9UX݊!Ez#+R~<rsOCҹuҨ54 E=zL ={JTTT7TUL&&LCصkv[rʕrovvmu,##{3gr}V0`[wyg###5kٖ[l￿O(BHHH*c2ضmK,رegѣ=znQMSyƯWCjj?)Bz d6ΈIѽMɴo#,<J6z15"nP腣CݍVgԔZIHH`ĉz:u믿 /P'ܱc3gd̙V޽!C%iL&7nSXXHll,&MVW}r}]?hh۶- gϞî]>}:cǎ͍qǪU,y:vԩS2Jebcc4hM{qsscѢEYwwwؽ{edfT9 ќLfRs4h _AnUbɬtVť5ptP16l󫌌Ps|7YvݰCvӦM싆S/)f4?uBv!v'r.d qWOEԪ 2(Μ9]BЕB=:YWtkSe ]4##`<"GB1Yr<͗;˒=d]+&twR]6Vj-]!D &.h8K 6\4\M1KsyN n={ !L\ f;IR4JlL*2YS2z#*+pwi<j]P!h$E!@OS+i;vNn8eaR}\ Ж\ w'[ZI堐j^65P!hx)/fq1Qc*TP4Z#x & &3_1\دczӝUHf#dbbbtR1rHK~aou͙3ÇJbϞ=;r{/j&L@ZZZ <K=ǏWߎ;R/jлwoAXX^^^3fN8Q333yۛ{uRQ_(Hbv:#2_) .E3⫾X$Pvr>ӿ8ʚTf>A,~<;5$Xrr2fͺf͚U/ҥKt >6gΜa(ºuXd dذatX~=#G{lڴ/#Fh*M8pGTT6+M9r 60vX6mիWׯ[L&FEBB˗/g9rs ~O\-s!ixqVo`ul0Y3p9tKZ|Z8ݸūy)`a3zWW׆]IMM8֯__ny֭[qwwK.ӇO?Ry2e |>FU=rwX}n2cȑjժ/_NLLLó_W}=Ù3gpr㯴aÆŋ諯ѣ/ æMxG'$$石`?רB\x1Y>|GtpdPO?M.]ӧ?8p`i| ]vՕmꫯח,|޳g2X8틛z+W.ٳL8 ܹ3oY}|M}KfE_۷wdݴC?d ,,VZYĭnדk;v8::[jz~gZjÇҥ NNNtܙ+WָoV˫Sٲe <@~up vZi'Oۦ[n:uҥK䭷޺@g 1mx#1@ٕ{TkH_T49FW_b2+lLĴ5 IA~X0־yS%<6o̠A,̱c, >?W_}dbDEEtRF3Ջnݺн{w+1ر???zEϞ=ܹ]DDedQQn<==4i-r[… ,X_{8::2c ^yZ,I䄣mrIuܙCa6-#\v2gn6V^ͤI[1bDjٴicǎ-Sl6[+hjw^c͚5պUQTL:vV|}}6dee1c >Zha>'@GV}xQLڿƩ[ ÿ?^?UȢ]@@/EW~V+"#ּ?}ѥK]?q...nغuZ>}p!am6&M /3^vÇ?ye ӧ1q}ѽ{j%<-JӉl^2mT|e6s?ګxa?&l.$65p@K?NϞ=tl޼%IZn?~uYX64T'(ׯ .իt$O 5M\ٹ}^T* 2 fy=Noۍ=w}~j|׮]}n:Fv=zK.Xyzzh7;v,cǎQHV\ɉ'ѣǎ̙3(I({n;/ŋ뮻}?<(JIܢ&U>Rع(Eզa3N-pğ1'R{{57 zg?>G^^^|GXFdywx:u*= 3gdرs8::l2\]]qvv0 (xĈt:fΜYfvĈ|tڕvڱb RRR\k׮Zn[o%::gyǏ3`El޼X(Uhh(AAAUܻw/ٜ;w+Whݺ5 ))e˖?|/2sZmww裏ob6ҥ V"!!onʕ<ܹҗRVgϞn-[p]wU8^ӧOЮ];NJ|Ia,RRRԩeGwތ7sFTTP2_Q$VfRs.>1LZXߙax#JɦުDsn&fs#)OOO+´iӇ~J^Ņ駟Һuk^x[xb͛ǚ5k0Vw-/裏ҡCf͚ʕ+F.\dW_ٙcDz`FmuŋK/1j(Z-wfȐ!|tܙ?<`Ӷ}]7טl=YhnVkj`ٲe̘1{\zaYWl6c2<gDfC8/1g( &j;vॗ^d6-k:sMh:QzE]hxBל, * jjUH?%t(bK SпSnZ_Y\O@!&Rs4/1^)/?U[3|tFT<U['*BBnQ1XJYvSabfOJӲdO"\* jق9E$B!jɦxB;YWFMG/š̸8:0o{no+K3s#D"?MKSNR[>^݉hSt"۽}'`=qvvFRQTTd)u%h4ܮO$SSORrԦ]ʸOGܜtn]n)Q7$'x{{^ '''fRFCVV>>>S5/U*ApU;EW 0K;owIXqww'++Ժ‰hx)K~aTVA`iavg_ӳL ۍinS/]eIXT*>>>x{{c20/!2gggcb)9Esʷ<H1q1VB jcT09Ϊ* k;$? IRprrIB4F9EŤ5/5P<3qfUX#J! w%r.L%!-n B;Y!-x1 S &Ƨ˘P82i@GFtAֽ7 !hbYx\Ml;ԏChviI(+ARNO'l6~l yG8r}ܷ~(͛@DDgΜaƌӧOg?nތBLhKj1+ ;Nd@2b*=wRKZھ3Q(eGYT%)aDfS۶mcСVrcƌÃ[Vx^rr2N:>qDN8AJJ[w^}۾!u"OSLbVՔr7=ĭm/((B!jh&5GXRT/X;|[Ahޚ+EApR NEXN>G}?cyΝˬYgB!wMgbY5OI:]2R”A!WmߚspT/v.}}}+s<77-[VzPґs_~e~zA^^yyyFF#yyy *{7Ϸ|\xVO!D2 t$_HWEQu:Wa,T=XxX]Yg28{l;y?JrƵN"%%7/6l`رe^suuյq!c4Pgͦ&5eɞX2Բ/ W疮ƯA/5~ ###5kٖ [l￿󂃃ҥ ֭cܸqk׮{__ ͣ{uBTES\R`W2N:.̦EMf\з=Qɱ}P)mOmڴkri4 @:X&NH۶mktͼz*]\(w* WYr֥ syk#˗/箻bɒ%7|c[ !hB4\ʭ5Izd_ӳL*cԈPz++W,LLLdڴiiժW^-B4jaqܯIY鬊KAk0blX;'&W&%%܊B!Q Bv!v'r.L%{&;oN[srrرc -Bر{; ScT>v-\yz@GFtA6ydqӧs%y.]d牊"??ӧB!TCW(MzlP[7E \I`ђNXxzH'lf#> :|AAA%Cmڴի(̙3:tn)iUjIs5|/eCܪ$&V;w.CeѢE#FvB!H]VFTNQ?ɲ)qPy_.7_6/w}q}B!ؕB=uTգ6SKN䷴BZyaH(Y͋]BaLf˹ZuTգ/w= :Rok &3_1\دczdB 7lݺ~r_OKKfBFLg0q>QUJ^7mZQħb4+ eaDN?Q/l6xb ,@Xx1FGm![T强QSxiPp)JG_'e uFķ'3i!'{EY/Tڦ_~lݺVBȘ iZrѨu (;wO_ OSlFtpXN_ 4xkﺜڴlW\-B4"z9J \F9OBj.}ݙJ@oC4 hv'G*gu֜9s6gΜe˖BF"_kRs-g2+l>v89x<g; 5'G<\hv56  W_}ůJ^ʼ/?l[ !h`QʵJSX; WŴP늆䀟 -.vfS(Y믿ҷo_\\\xWh۶-/_㣏>`0prĦoooj!D2̤hvl][\:8 -/w'Z{¥qn`s&)3\R36tWD+$)6᠂;29K^{R3=]ϖqF mB4Jb#9 F3HZ݉ʸ@[wQwgL& !  ZQX~*?VxjwZV*J[@D(,$ L|HI!1!̜q].grH^|>x1nPR!Q ~kJ_?8;}r8PsF ŷ2f٤_$ Y?~<_}U3gyf{=f̘AQQ7ndرB y5N7Yִixm[Q I@us$"^/!FjE.ZBڟոQUYfiFcc#wygn)C/%:=UW@T|:߅^| N,FY1Ih3ɟIR;5Q__OBB&S{}]v[XhQ(nB٤Y!SQ߆?}Kqn%!V;/d{pt)ytx`eY/KYcl{bTT.ci6-b Y7P挐i{̝;ٳgw{̎;((({ mbH.S1^;vsM'!Wع/5Z3f 5xxrG  afŜ<&g'j"t::jIүӟxg8vn'BDۛ}9. * S`əYvVA0nb,TT`0SUU9٦bȄ 7ow}wn)Qm ;[gkoeMA1EIss~9Iҿ7d:[\v !)^u8AEgKk/2lM!T\5# &ˌS:fkǐgKKKb (ۉ-UWv_5T58;'"ng}f5HgzC̀.++7bd֗BBPUfOXڹ`3;Kygm&nˌQI0l+];4%";*]aĩ˩^hG nclz(|vկꫯxW% !$UUqzk%y#A@^Dzi,4\ Evmf?Y EQɓyCuK! ?HECm\$_V;YSPL6&eƳb(a ];Do,R^^7l6sgwve{bq}TF’kYU1t0f&.];ķ Y<묳زe : 6mdddBTUX7CP^q(,53spHy)$J7! wy'߹袋 wyg=,Y$TBwFo]' ~i=qnRv Iv3ҵCɓ'{nK2m'seB|T6 {$'TgU]@SxN!ɠ#9Lt0(Ц*GԷDo~-K<W14z9"S>.om̼$~2+aҿwzRҵC S^t(BQQcƌxUUQ@oE?׿=]||L2sǏرcٴiS{/>ZZZHJJ;{8e X%T9袱 6/O[u$8grg$Hq1IED+gyEQHOOg@zo0o޼!nw(**b՝޿Yldgg\͆loBS8\߆;=TU͢YFǏNggc5& `:|Nw,ڿec1c(**<(** `Z~ߡ(ʀ~.!6oP%ʆ6Q'6n0,(J{K'&:;!!!ܕ+WCoA^^^x"2r={vo |z233IMM ~zG(quy/pR.ݝM8 :^ϤI=l6wu,.@-Ҫ1zc i,1EOio۶JfΜe]OVVV>wΝ;M… Yz5uuu$''k¢E=/''cDza.Ҏ_x&L`|Q<^!5}T6oگ}5$3MyLȈ Ȣ.d-[FYYwӧ /Чk7662qDihh`ʕL>͛7wwײvNK/K.og֭=TB~ U6hh.{J/g̏gc ȴjғ0Hw}ϬYHII;vc0x9sf(nqdPmvn^,Cu#PvnAU_TvW:9egeI~Hq1IKϧw}}D\\gqf͒Ma9銮~[YSPLQu3S2/${GmX Vh]B:8 㧢 ?zy6|POXzҥ)RI5̩(;(HUUjkEӯ*YSPLUs~(cCѩ8Rf ~"IBD5?HECmRDg2#w.o8=506VXl"BӟL0?3^|E򗿄B(*5Nu͞pۼd-֣FHÌ(OHqBMM.G\E`M3l+ncDBLGy$ !Ā U6hh{(G `7fH;.U6y|C|X ~BDƯ7ux7o^n)Ѐ6-{Js_?o1M߿)J{j'31FŸ.d3۶mcܹ=S^^CuK!DSUfn8%$ !zlhգέ?v*Ta1p\x8 +8cD|G>1FcNѡ_@Dg DD&# +*. `)\fܾ/9G`39#Y0! HuX$ !U`EEf͢c2{lөzs=={ ![% IDAT!Tro{(}Qyn+̼$;7D)#|X V?!D,^Z}Q.%x nF^zPVqʭ;J)28 DhT;k֬UT3;h)p\qv @vTTb(M L8c&N?PRG.o6<>mU6Ϗ:Mqs~Sc|SrqƏϜ9sHMMB v<("]RT>tzTUCfZ~U?Ō;7YyICդ#a!O5 `VV;wg۶m|c=O7<xSjgOUUv` O= ~B3 ***t OfŠ7xJ,̹ jǶ d&X)? qa0uĚz5 3_9$a 7ݫpf-l{9ĠSX:5K&Ég2Bzc~`0 !T˾ߠbjVg7kYq/*21?<Nˊg4(d[j'f't!KcқXqbiaW\/OTn6p̑|w\j!N!af>!D t\]]Vu0o)DTR)&>)>SzǶp1\;+'} 9L͌n/BD~uuzw.***Xnݷv B Pi=,[:j<೥њ6- #쪾˓y83+19;!#X:]{$yHBD~tZ8q +{s뭷RXXbaҥf}ׯ理\..8pGywy2={6?ٽIUUZ<:9J B`$*v S`əYvVcnN/Eavv3(Q1x"f> `k~E]8^Obb"3f !7551o<222x饗gʕ+xM+/~\oW\All,/_۷o?1&MiӦ駟1 Jn_ʆNu9px^}-ʏfƤڹ9?${X5l&RbQEm!xWdɒPJ> )//'%M6q2eʔn?~3;ưa:f>|#G8ePZzت`pⷦ/dÇlPjslˠqV# &?!;18x ͛=v^n`YYEEE^_~9˖-lErr2G \YoӚ1cp-U6&7g$rQ$ǚ<g50G" د=!7n\ cƌ.?sKjkk+@ Uk!\>~s$LyX~h|ԆX;Yb$ !4g466R^^k544{<r;7 rM7W\=C ?G]x4TU:~fXxZ:WNf΢1f=iK~>! Nncǎlݺx.B`Px7C鵣.V̾&c9?դ#aa1{(Bo 466vyѣGxF1y]oC=ĺu?~;Xrek)=E5}itkK/O &e2Y2ixT<1uZ'{7ƍy@ zu|N{6';z\=l6c6GMb*G]4=^#Ŕ׷0)3sG}~X 1Fi&:W_MAAAHpB x^Eu{^NNcǎeÆ 0aB"7noo4'@hr8PӬC+R^߆bý'D],|'5D+R!XXXȑ# JKK={vĉ說+W2}t6oqܵ^ڵkK,]o?[i&,Y92e ;;99QFjRP|_ HU&6Wr' Kom>qC5Dm"҅2gl0??{c֭[G~~~;#K.[n?ׯt\  tzK/eڵl޼ e֭[ z{̘1>WorY3ᯮo(_R%=`"? 'ڶ}'5TEŸbH NcժUs=s}zN3tDfx4h*. )\!DDWzg}3<{B @&wjتzsYTó;h)p\qv6VS ^ N!afB ك0?яBu)!4KU@0<뽎ҭ^ m)(Nrmܒ?[Sz57c$褜Bt+yl&99;a(=Je+/0~c G֎| /9-/|G :9?^:К6 -O?赥:@شZ~g!Xt)7oFUU, vQK6DTUCM}؜Eu{iSq(R^DЄg~ 컀FR̘ E!B!";/W_e̙ܹ6JKKikkc׮]̚5͛7B 6jT\-Nc7 .cׂ :8s.:ﳥ5zF#O!(d3&Mvga4v-81ݻ782Ajo! n9T^Ng*,?'q@.B*b|݁OF#yGBuK!\SM.*ݦ`wa[pٱpNcBF:a-b4(ZHII!诐@DkkkǴb27o<Unݑٷ ck5 *~U3 b\X0̽R:]$BP 3gy&7nѣ'zUU7ndɡ!*nִDl@j*s{/DžatSH5XRbegBRfW\E]ԩSۘ3gN.m۶?zV\[ R?G]}Q3<IWJ G w"gVIq^!(!?_N﫪`w?Cu#@RtN`Oq^±F(tqbö9#lf=iqbL!T!F(sFH @II ?<{tp883 "@ w'od!v:@̊9yLNlԑ&;{G2 8#@PU<6oKβ9`+ĚIB" Z 6{8bνU~5U70:y&w-I^!{I꫹B};!z壪ɅϯA>9B b5rz6 OKGc$-΂Q-!B ppd~'5T58;'g"9摝:@zEKBN X^PUZj}Mǟ:6NUD;/˯l3ud'Őd'BzFfn~mSUx~`i\9=Yu !@^&7M.;[@vb 7cl6PHI5kYE!f XDUUkP^ ȫ*:Mdɤ4A">HÂɠ !Px]wEFFFK/`1PZͣn_V;YSPL6&esQd['g4(9,̾Bh!28 ޡc<^XB}cSffڟt템lRY!KD^RGU[S˽u(<dYX#c8z88+CQ9sBu)TUXf7AlMY;_Ю9<3tdrBГ(:ijr {(DUU wKhvQsllfmuWH5+˽B!6~"qil{(hG n4GG{VYB1$qJ]c-MnM*~r?bXvV&KA#{xsB1($QrKmrUoM5m#S^xVEzuG|JfRbwB#pjrqDh!gGVwZזNU8s.gr~V 8,~|n.s$k9YOFUSBD C6x8J @YIck5Yo@G,,, )\33U˧zBFESBD C W*ߜSP97y @Fy1"~Gz&B$F1 H]-ai6_J+V \2%S35[jґo%$B4BZapvy`6w~>u:3af N@BݤgBD? QKM_S~෦tK5gӁEK^2;Hk[8'"H.5m^[: =.u$+Mli%a"B435Q\\… $%%b Z[{7~zƏba<]8HHH@QmO00ܾZ);֦[~IB_Yc J{wNZ0( $Ś+O!DDDljjb޼yK/C+pUW}빛6m+ /d֭,Z+o{'pݜwy1BRQZp_TU_y*-y ?gK;FIϨd;qV),"ib '?eA_G}Ĕ)S=WK, ??ŋwwat:wfƍAk;{MeCk d&/j}k'pNl0{(B!Di"̛7#,^믿m,++իWwz/gٲe NPյk{GlPlqY,>cxG֌aedBDܿ^1c(**9B b5bz6NKŨcDB V6f)B PʾFSD=XmAB!H=jrxfg)|Y @s;L3Aj3"A : !'H'*_%4(sll4(g!ɮYJ!bh'TG]<}Md'ps~c@ Ob6ȬBME ȫ*:Mdɤ#V5ִi A0B!%PeG )o`Rf<+"=ڧ8J{֪t™sAHMvVLi&BDnw9[?B%;}(J7;[z|@BNqVlh;'B!JUUv:Γ%Էy?6kf8~W*ߌ ** W>/D-B qfOz2,|M[N˾ߤbjV֌|:x 12'B!$TgU]SxNssWmHj #^fBS%p(=sqiܔG0[H﷦Y?!"4$F9/ {y*Ę,?g$ & a'ִixm[Q ڟ KœB!BG`GS0s0~rn驚o@EOl @dO!= Q@Iv37eZΰ3K@-ʬB10$FUUygvS3l̹gy"uB%0JT6Ϗ:MqKhR?KH]?!bI8_ U AAggu1t:H(~B!Āa_mbMA1 .d'pQ:,aYH_!bpIԠv5\f%o8) YfWB!%PCTUe:~6 &|HmQƘHb6 !BRV/cW]2ܔDŽ0oRceO! a3)mWX:%KNYILj,FB!IFĘ 6- RG 9XS!""`H$8P(: #""5lG(7"""G6䔾!4QnDDD uIQ!lDDD~?թS} Z5'u&""+lɁ:@}jDDD 152AI@`zB0rz"""8 °T39 T(F(FNBDD8@AZ 0sz"""b @ u>""""6 aT#@ o ""R:6~NoKDDDc:MÂ`e&""O9DDD6~& cs|Sl!Ph: KDDDcng{Tqуz]DDD(`@ 1DDDsl}LNBу@n)HDDDD Ha||2a4lܽ{שmك#F@cĈػwC7|_W߿? &MoADDDu>!11(((-[pA̛7m:s"%%GԩSӟ]]NNn݊+WCHH}YvW,""""Px$a\׮]C~>mGaÆСCeӦMÕ+WpMX,a{aРAm۶9u E]]L&ӣ%"""r>',..Fbb4qFEEEnwU\pfͲ[>g;w׮];v O~b1 HKKrDDDD'cv4  .tmGmϟ?pڵk@DDD[<555ӧrٌ.భl۶]_DPSS hllh\ɕO4ڵkj*^8""""Dh6Q[[밼wjkkeuJe^y,]VTWW#<<*ʉdѸ~"o~a~e=`~g~oo7$$['Ç;\҂/bڴi]n;10?3o'5DDDD:l 8p鈉`@\\7=zcǎ^Gll,6mx B#>>ǎsihhK/F$''-| ~aС0 Evv6ܖ+xΆJ… ]'̙3HNNFhh(F#Ǝ |FHMMEdd$L&Ə%_w\wRSSѯ_?T*ڵcL~}!E0a̜9S'VU^u2o<[MyyhZ*k׮Z-[nW^^h4YnXV7ot:ORSS%22R#2~xX,R__y:NN|ߗ۷Kii;%C{,wom>c $YYYno/++^/3f̐"9vlذA>y:ˡCߗٳgJ#Gx,wW0a?^y ;w:9ߟ?g_6acpYFHee}_մȨQ$%%Ŷ@ mn޼)|tWVV&d.,OonرzjX,^=Y $3fpWt]v r]%33"r>pM466ĉ9s̙j:u GfͲ`֬Y8~8 `GBBܒ+nܸ`Nt6o_'N@EE/^XNt?* F W莿suߦlɓ'mbWTTؼ6m#=뵯kll_|a2djCÏwxm-_YY_ؼyã{woЀcB &&7ntkpg4K,_~ҥK޻!Y:}=Do|gBc˖-X`L&jjj8>8$$jjF: vu=/l6jv=,]F”)S\?>VXHHHk֫ '߾}߿?}a(..O?:?l W_CSSJKK uoiiAXX vվCkjjl5eggGȑ#ݒYʿh",\} ߬=͓ 11n(((@}}=L&vS7l؀[nvg}W\Q^^ޠߣYm5FL>W^ᅬ 4:ZioGu:O<ŋ|?k׀x2+V ??{qh<͓?3l޼fuuܹfgϞu[x2\\\ {"gcc '_°al?`ҥK $Ww=o㟳z{hnn41wX$ƍ ~ɒ%b6QDL*999V3fL:ն\yVYY)qFW떧 y뭷ܐg<+22RRSSsy:[DՉdddHLL+9_z%c$$$H||+9Ujn*o*\VV5kG}dUWW'""NF#/EȦMqFj~zZ)ZVN>mW7uTye޽R\\,'Nhh")((b:㟳ü9T8":*))ѣEӉbtҍ7bN'GpvzY``$x"v333;=ʕ+ݘcx;:o ,k֬j2l0ٵk"vO<)nqlbWkX~>?,, _~e/^ xqp႓IH0 /`Νwt466b8q"l8p 6l؀saȑQTTt8pa43jӦMÓO>$Xf $X,ܹs/_FYY^u >ܓ"Qlz ??C A~~>|MDEEaҥ1c]h4aZl28q"1Çsu\]]ÇزeKB@axyy?TYII ֭[5kAc "HyBwVUUEEE?:/cmЀk׮aƍeܺu | WѣiӰ`@>}x!D 0m6dgga!<<\o|[l/ ooo6MNɯE"rEAQQQOOO=W^l۶ O>?F !MPH:#G\gggܾ}_~%?SLAZZ󺺺-1c .sssaӦMr( :) :!;v 33{Exx8z@_Ty}B($#pkXr%|||,UW(ʔeee?ĉE"&LM5 :sssxs劂t 9r$FP 66V*411A޽U^!) I2rHt7&OKwڹ[PPgʤci,A!CHAWWW*q $wBi) I兵kwŋk%K:: \ٺuPQQƒ~:Ν+U?Cj0`@Bvt(^^^x9 yfuiݺuڵk!pe;v cǎٳg1k,z!JKKg8::bĈƍaÆqup066allx!h/ I"ɍi&XYYZ?fff8r""" ggg9s2e """kٳgc֭A޽j*,_\|7|*jkkQ\\L !cAds;RdWWW#33044l~իqAB4Uy#@NPXX[O# t?WvQhfIq9?Arrr g{)6xmcuzvMkqAuW=x011 .]ϟСC!<<]?'On ~G5 þ}lׯSHHkBBxH>!ZS8~8|(msë3g`Μ9055r@DDgw?q͛xI[YYH_~Add$~g$&&ʤ8}sl<ޕcҤIhhhha!]H$Si&ƀwh9h7 |Аse111 zҶ,88Xlʔ)lv=ٱ˗se2?x RSShM1L*!s{9u}{hLUlN|{\Y`` LLLp)p̜9S|ٸ}6ΝC}}=^u1N*u~[[[>$BrrrwqB/7mEt0##RepssÝ;w  0%QUUK.^z%B899BiFoivtXXXȔ[ZZJA^;2m%I*;?c %%%0229HL<ÇC__7p9cAMM \uBxw 99:EUUUaڴiſ/c羏;x뭷mٲ6mjaBH$+ ũ]BB"۷:%JKKeKJJ-B2״dfPVzΝ;8{,XJ1c(|wիQVV}=zbc5K_ҹL 8qN<'p}5n@mgSsvvZe!,, .\@BBѵ4M#a``333믿{{{bĈHIIn[cĈ044Dݱxbz-ɬ!6TꢨH>%%%=HQr}&%T&*?B)i&r;qPQQI&)lѣx׸#G`pvvL0BGZUU8Lkʕ+qQbԨQj_Ñ#GÆ ScS`0* tU|Į]Э[7YK,7xݻe5֜<;vŽY]>}70`NcL+9oD8_B:Gh"| QRRpaС\ b6oތP8q";!Q&xGGG,^k֬>zm۶Wo֭/tRܱ޽{s AA__?#oߎ=SUo+c?޽{QXXT.HOO޽{"v7rJ 4͛1p@|\cmmӧӼfϞ=(,,իWFFF>}:]ƥ*x16mڄ/Wy,"33...J&$$`ܹ_CGO oTo`L)9lBMX?333`Ŋ:u*:$UO$Ad ^qI#..@ppTm۶aٲeܮR,!={xKsiۇ_SLɓ'zj'rc qqq>|xo!-- smjj*Ə/55aɓ'^r&L)LLLL}k'wA`` ­[0e۪{{%5rQ?Bt@pss0E$mj޼y7oҶzzzزe l٢NRR:C۱}vHO+8׮]ƍQUUc˖-u1_P%CAGGfx BKA _ʮ\ѣGBCC6mڄcݻ2h,##CoEy2Ϟ=s޽{Ri}JDR:%>666 ֭[n8#5rQ?Bt&ܿѣqUYy߿oFGG#,,LeÇc̘1ٳcW Reiii`I\j SNAGG<1?b xb}'˗/Gdd$푕%|MkɯE"Mfݧ#@dnnزe RRRpU4H3IrO Ǟl򯲶+Wą 'ׯ_ǒ%K   ECCQ__[[[ 4W\c+Wk泩>XrzӧO>Rڔŋ ǫ>soS> 'OVZǏF.҆$9qטΝꝯ -Wfo&B K#""X޽jkk?LVWWРe˖1CCf`[Yۆj*0PV\Ɇ |}}c=~P;v,KLL*svve2}{zz3f0bĉ7o2l޽kWTTҸO||<ʋ6Ge1ƔWUI{_u"VVVlҥJ봅szX[Kבd 5KH;Sh.'==]fǪtuu&k GŔ)S4ο$/ڵk GGGښ{=ȜRI/E*˓)DMM/\+WDEE[kkkdxРA w'$$ ?R pO#UsTiӀ KAA0xq}@uI]Z&] ø~L $2UquuUzGQQQmkjjʥQ]]ݺuȑ#믿*M@8Qc|饗(.//3g1~x.XH3g`R׫h(O#e67VI *Oߢ*ecT1t>Dii)GGG1ظq#t:kkkr8p , 0f^rx饗P__cΝضmzՋ1g 77IIIChh'BԒ=x+z0^ ?3={'6ܧ#@4gbȐ!055Ejj*>cKxכ}} hE:tE<,IVm;v`o`FFFl,**ԴZϞ=clɒ% DGG3,11Qׯ_g^^^ԔÇݸq1KKKf``zXFFwgʊ-Z={LiL9rDzrGDDp5%1飏>bdLWWRHsϫD5$&ߦ>!gann2ϖUWW#33044lk8r$ׯ-[rw1is+HsW2@ N#I <͌.=H:U&(  p= HQgꤙ%tׯ_2Ӧᆱ8`srNk qBzKHB@HPPPC tvg)~#HTN43t1BD"9nD8ؓةJ3CHCKB:?Uy#DQH!S7W#Ddeeaƍx8qLBeulܸ?SUrJ 8&&&prrٳ-S7??3g΄91sL0^ `Qx˖-;LMMaff_~Ç sss w9j llltR<\ecǎ!$$NNNظqz|&LKKK$%%iicӏh tR$''\FFF:u*u]3gfmHMMRjjjyfzzz3gD"~w}\p  E}}=7n*++qmp!""8x `~˱b ݻWiŋ .Ga…iVV>XpTق Ο@H$LQ`B4H:=z- IDATN%%%\IYcݻw@ k"77^^^r8px{n[#FҰl2呤]w}ںu+v؁`رR,--QZZ*ӦqԔ @\ݻwsecǎŋ ;6eo߾n!t Cަ KKK2yyyIRPPw\rO/1رcseg8ruSzE_Xz5~%qU K2d+* p`ƌ6m~7t aàK }}}ȔK:u 38ʳgϸ̳~"ߗU$ΊI;wH=V]]8xϫűcǤ=z;nÁ9>|8S_IR\YY)2ӓwܸqСCe>*ԱcǰdZ r ##C*Pq޽I&iܧ>^jv @bb" TTTv!= x l۶ SL~333DEEk׮ MaXK.ԩS]!!!4hPh@OOO wڵ Xn~z,|7pwwGϞ=~opwwG||<|}}ѭ[7}Exx8x ܺu #Gc >D\\a``ӧ>xE̝;ÇԩSqe-z >}:^|Ekزe `ժU6rD͒%|ĉ1c ggg#..֭[!bܳϟ?Gdd$Fnݺ1e̞=[uR]]scmE?GPP֯_#((H bRQ222@Q%##KHHWŋ(,,o}/**-ƌBZZI mK=|֯_?DzYHH377gW^a.]gֿXDDꫯX^.SJJ :t(g}aI\PPBBBf-b 2 '322IgK/1fnnΆ "## ;;;L̟?_nnn. eԔ͘1IՑ$Ζ?33={2}}}֣GN<)3㨬d*a͍mݺ*NP:!!u֭ʼnݻ1b-bϞ=3|>46fu>w{BfL-`uD077GYYdWWW#33-ʕFHWh""66;'D 4AK.E Bb B!DPH!e($B2B!h !B B!Z@B!-C 6ne~RX'++ 7nǏeV%!mB |M\tni&)))?~|;BHWDo!BϞ=ѳgZ[1bDO!k@HJW$j-߽{~~~022 /;v`pqq۷ Bnm۶ oooxT@?ׯ# Q]] r &LSSS ((R={ x뭷PYYړ @ @  /FTT`ddRݿ? cccXXX_ƩSBv../0k..vP]] &LjΝ;qa>}ZnٳgW^A\\Əp;w;~57BG3f ={&u]v!=={ALL p=8t}:B`C*++cXYYUUU,##UUU@ Ĵ"##/dݻw+{)366f\Ytt4mƕ3ore^~]v`;w}zC2Hĕ=y/1XFFlRm LןL9r+svvfƬPZc}Ras-3#o+BfT@m'o-N.@jj*<<<ƕYYYGn}BZMNNFPP2'ds@(r߫P444ŠAp%bBBB7}to >>>WWWn,CEII ΝgϢ1T[U HP%'MvJa xH\ V{r[ZZJ}ɴCIITY=C$>iii?1HfyG [dffbɰFpp07VBZUl,"gKN@BπzЀ"m)y!??3fয়~ӧOqAa޼y)tU"@m(`O ܿ++..FRRR퍸8pe7n{mn0rH:ţ_~aÆA ĉRcbbTOj2IIIx)===>|L]sss"44jf렫 iPy{={f] W$-,, }&O>裏`eeݲvZ9xwPVV5kaaa*GEE3glll$!44 ヒZ@NN󻹹A("::СCַ?֭[JYz¬Y(((/:t&LP,tU"fP!uOzmΝ#ϟ+V`ƌ2dΟ?b1b.^SSS 0 Xv-jjj0h ޽{c̙011|666صk~'=/'O̙3|r,X}===n<+0~xl޼sW_}r,H]U H0&oڇr fff2ǫ WWW~ޡ+~nҍ86AMM Nqqqĉ)BܷHWժBffÒNUl Z&bӦAArrs:n??ؠW^(**ݻXDQA"@F P(ȳuVL'($JdH6!=?'ym[㙽@GG\Oqz!mثʺuƬْ%KXEEZm<ݙswwgS[[֬Y홑5jzT~͚52CCCַo_fHKKcFbFFFޞ]թ}eee +++S !h$11^>}%h>cwEhh(>}pw'|YVV???رcbbb0o>^^DDv܉HƍٳgJKKgbŊ/1i$yYYY;v, 6`XjN!&7cvZD"ttt֭1]]]Gi|?|,&&kݝKM2 8tuuَ;ϟ3;;;|r@dXjj*Wd(rssոb$$S3۶mDZh"wߕ:ޣGx{{̙3Cݹ@ԩS eeeΝ;9sTٳqmdggΝ;z\cccL:U2} 2f6Ϝ9SJs֬YeBH?çhS@>prҩ۷/2v 333Lϝwww2]]]Ν;Ji\ی X[[Kz٨RǥKDvvLvvvR:^BiSB8 JNV@kkk<}TsBJikii \[egqi*//}:7I*C +W2ΉD"ܿ_Yȴml;>}BzRe!,, .\@BB(զ[nxdGqqLC!x j*|wpvvFTT{pssCrr2֭[???D-!!4iv߿?=*U~ 0 &@(JիB\\W\Gѣ5jšZO]]]L0A 'Bi -N$ĹsX`` ѣc, ={,))aˋ9s>|уI[` ReǎcتUXbb"?Xz˖-clϞ=lҤIܜeeequlKO>dl쫯b&&&V) !B364wgʊ-Z={L󙼘v_~L__׏8p@Nmm-{344d rT1c0r?RuSSS+ [z5Uz)$BHc|ÌtB!o:u ӦMÓ'O M. !BH3ڵ >Į]B!4o͛71|pu7n%!Bibw6ecc"$B![hkk{)s=o B!mpHHH/"͛71c%!Bi/6lbpttDNNΝ;(!55.B!1>c^`*gԩSKB!u o> 6lϟ[[[>($BHc:$B!u7B!A^riii(--H$9.~z%B!jm SN? erC" !o3駟gϞ}B!oکS0l0\pB! GB!-|饗!BH+-D||<._) !BH+"..YYYXx1n߾H$B:/8 kT>q+m!~B`` ݹ2c###|ppp5kB M :!oZ4<ũ^( iU-W^w===TTTputt#G%!J"y'M @@I`7@W5FLݻngg~MNuu5*++B%:tw۟[|FeZ>>{q_y;w)));wرc߿?_]Bjgn έS:S|&x 'MK.!77j*00j(bРA(--g !Deߔ/I%GH#/FNN/".\'ƍCBBB_IiI_SL$GH#==U9O B!|$ $Gy@J;mp͸t:ؼy3_]B$'!I64]Fl Ɉo+fY3nzcP&IB:::ظq#6lؠ·~ 6@$%Uann2p!  gPz@ߦ|@} PUf;( qKeUZʗB`m xTGmm-BÄBx*0 Y $|P5z;&ũ^ZF3 (Z޽;]BvSD/# .,!j%izHIvV>8rl@PiN^w?`۶m'PTTjokIBD83YE5EU0M[2{l.}50>AQE =G6ؽ{wkصkɓ'ٳ'"""駟Ə<ܺu.4$5hjfugx (|ί^_4qurM .]@ )S2OOO|W|uI!]:䚱hHHkf3fseUb=z@vv6~ΕUWW+}[!F%g9"5oIzo y~(-|SNG/ :pppKBxIZ5 o3 E5(xFf͚5GPPQ]]5kpkjjp%AB!JHr)$|}m}iK ޲:/xr fx˗qA@hh( ~:|}}1k,$iJA? me -᭪IY*kT$Dv~.`BFVړOY<8{3ՋW^:.`B!p!C ^ B8oUֳ'c0mZt/,WMsکaۧ&QC~y5^jI}?~KB!/$2OA$툪!&o4Xh~#A,sj jȏ.BHD?ywk+ " 3Y,,$iGkFּM/MwV 4KAAVSGD 7G5m mKlG ^Z?~G~~>bbbܹs{W_ř3g0g"0?@#""> {?O77o /#G0l0 >.]Rӧaee} :kqڑkkP\݈[kUunʄѣe/ prrB=GA$a كB\zݻwav uO>{aڵ\|嗈¢E#GD޽駟? <[ ===aggUѤ^s|_6oC[]Tyd&TI6A؟Alm.wsˡ+ܨBZQ}<̚5 >x!fΜRUq8s abbSN)l;w`̙Rg۷󎏪JLfLz!Hh"`,(]Ttuյ#?UEDAE\4A $$F7L3w&7pޯssgBsy`l6چ6L8iѨX\u"\A嗛eBK߃Z =*@+As[FD!cxw. `uu5yf=z*l;c6<=z4vm]#Fx׿œO>قQ m+IZȩçF{ƕGc5s0QVUDzyڕ㾝6(3R k-n.>6n 6d񔔔x]/..v˲\t7$Id^s5>G(--msС&)0bL|m2pz߃+?a&l*km,ޒ˟;BAhl>)3R[5>Aˢ SO=ѣ6l]vCC;vc2?ؽ{:gٻw~jy6wQXXHrr[L]X,X,MD]+TxeldJm{# J Ҷ¬[)XXOy,z]LIxq4E78tPV\mY|9$!ڵ+ {ɓL0A_׮]իK,aʔ) /^YgEff&cƌh4dnX|9Wtș2`zNN@4 {ۺVFryUadhh;zwK~d,2/-Ve+gq\d"%6AS.{r=~zÙ2e /QQQ mnF,X--\~lvc=ƴi1k,ϟOII \ps:&bx fϞ }ǪU8ruuutڕS2c ۼB 8땲k9XS[EuʫXEvdcc]x%/GrԹmqt,qɲ̖'xoS*cJ\JQ۱!.<P 8پT+߂jxZZ;dJ^FQy^p}n o?t%1=X-FۉKI'k#`EOm@@ 9JSͤWQeYDE-%q<D䱟5Y~/M9zsӹo'G@!çXsnƊ,uVS]zt3 u[ SmY<Nc+W6g+gMKRү3sPоP _}l>|zuͰZc_ZMYUcR꘦eGshsݳ2ݾ#4ђ*ߒ˺(eFJy@@@ h.N'>UBUTCXy5E'kk wE5|!ޕO}6H⺁t#@ 4'Ň/C : նH55}%VDFΚJE*SpC$O/aUL41>[<ʜ2~`&=:DylfQ^^Ntt4&Й4`l_V/ ը^Eڦ>?dIuΚ<_tjM<_X]gm'kݓLԅ3D6nN<رcٴi RRR(((`Ν<,] ժ״@ hMlۆE(zO >ǔvKay9?'1٫XsNd2p[(CEbW-MTeIy,1JEv (@wقk`֬YlܸS~8ƍ9pkeÆ ̚5K)@hٶuڿi@zL&#+T8m .\S5,t)ք)CFsa$!͂n+~!z.##Ew^,Y‹/״@pwP Em,=sR ^g\o{ZƐeџlSW !>2kg0OmA&>}6_|1skJ@ 8}ѻnsk(Zh߾};|w^S G(5wK/o;@YvZ}Uv骧d$jiʹ=~'VuLn+Wf3l\n%B Z]WGE~:thCYp!cǎG[έE]W@оѻnN(V/Hc'۶} tE!Xi +UvVakI_i$|˫K>'Y~;;F\m>&]:]J+z#ɲjTP $I9k֒k:(++#66RbbbZ;@Vؾݕo)g-1А1QHmjDAUu? ʪ)h>jXʫ`!VC 6ri] nmC\T s(/S8k,.͍^5wu^*.fV&e|,GP9FQu [Dv-sK_qe-tU;՗3*a&C&gϞP@4Z%xB镧%颩϶Zk5JZmN Fmʏ2iNYq`0r?f/G眎Lηs%c 3e!.2L,&}ђ(Ӕe.?Z&~DZP(k(JӘ}8W 7Xg05Q)QLԅs;`;-8cI!VN7Ӥ@ h?8mF<Ŗfd׊OC\GC~=&]_ su~c+(]}M̷aڗ6nʡNFB$ W pF :Dd+ݓ;M y[nH7|C׮]֭~$P,[d;XK\gl`quh9=_]tG2dۇ1vGH 5&f0d"`$oгuD 6"h0p8pu8Ȳ@ A0(m"B+TP0plv?8ߪغ\eV}ntJkx7^|F%~:k:k*F !)QtNO4a~ AJM$yZ"`cSVLɂ_|_nRm"]u1'7hTVds %w r4`X: 6+YzB-c e!j$j <I }В(1OsLrzWT$l6Iv-w/XtN͎^<_w ?gE%`Z(HhjJVA(e!j2)8zԨQxL>]{oͷ~ǔa-/gGkx\ؼquny&V3a+s$VEĉ>W齅/mQnnj"<OPsIQ⅕KMA]#Fmה@HKڣx]?V}K8A_Oy,+~|fS9g%qB9FgR{:>c=Qɢ9l_ 1O LbJG*C-p6SMDi- D@ h&9K}Юc$@+eGI=u 寊FH&K,i[Ia֭ |Z~Y5vϱm0dIjl.TJH:64I=.))JCl2tҔ)?-i]tn:ѣH4wr6_ <}R6?E7ʎ뻳ßƲm%r 2s0h)l'AIK. $Ibܹ̝;W,a.qkW-b^MJdo u;AqiٲFDR(brI+%8 -%dgg5@ }nmz繹_rL֕aKi5_w*klDJdh"v%5eCϿPW @ld"^]Atx 46(L~f ~$hY|9ovs >S`*N4͉?'#} 5U nc)~3H?sq RpES#b5ZfB]!J mPS[A-'*gۦZ-g_ONh}s%PlChr]-Dj `ALr V)_~θ356 $EI۬@DW}qw?GͫJ=]#|O3zʵg\(4$*j Utjps z]6q|ڬG`x {ֿr^qؕ⃊sfuQ_흪c1Ry,(Uk؇ 4޺%|nǍ4d"cazߵ='h@7x!ϱcի]tiiin:vMJJ [lszLٮ4$XViiQZ,`Z}z?kQ}oW a?!5y\AUN2Tf2J;U=E_ f7U-{Xy5A;윹day*cIo㿘 mROW_o-7;[n7cv)Jf֡@Z,Y]'!CN5ރv_[OYE]ӯV6>y9]:(Cj}8:pIэt[yMnme -mRvܙ?˗4i[nzLٮ4T*@U2d^ Biܾwؕ3Ko*-[M@2*UDN:gi6*]X98$+0)>2.7Qo߫k@ސm9%`Wg_Sd:mܱc&++/R)Z^T~XF}Zxѻ`T4?,W~hN$QݦOjdkhkT]{Z@,@`rr2vf׮]$''5@ hkwӒ8Υ_[ Yk\+n2y5*w a(H5M,ZLg%Ex=!OG*"]>az˃426l#GcG6 Ǝnpر̟?z[n~>oQ)A{%\ u.-NᕤA}nq;WѶ:ylr@$l\ŭ/*mTa2ܮ)嫯l,IQfgJJLr1S>\(S'; ү_?ӧÇ'%%֭[Ν;IJJ⧟~Yg5ZQ@ AY=vhȀ=,c]5ձ$#e&|>X|g?. xp?P&qC&:Cnme@a֭ |̫d 9B|+%?R"Iti6svZFkFϞ=]#GSJp04'[&zuhI窐1F-qgLw%ge+^^m-/cx%.h/߈GᢿRm%U6;y2{u_RYG[r{z/3i24QO7&g_@X+pz{xB5MtinJpu}:Uxh60Fٳg3sL6O=O<6M@ aWV| /g(5ok(\y>Xĵz- 8zΟ)#}Fvĉݚ"dOwlc>(^iPQNڦٚTbHwGHFr0m+HZZoft,e1Q,8 f!?ߦWuTǟʛ^D*;B;f;gg,EtgeχQ!]8S<*cÚg呆v[$GY0 A#86L9wHI :)0-^XXHDDDKN)Nz,P>ZjsܫHPʢV峏DEdGvfɗ?QRY@FB$ɠ xCAV IQfLF!!b4 /ۼ`… o۶nСC,\0`@  zQ)JgtV F";ڬxRu/EFruOCyV -nQ┕x'uxrQfO h d Ν} SDDDl2ƍꔧ " DpJ5XZW[t -NOb:=|'h Hq?ek77؜d"ml[ ;nK̡5 }ė"f-1}Tr̒( 7&{i\X6"cMIP2uԆ3f(3f B o{aff,X(ofL4ɫh$!!zB <ح:/s4dۂϪ fcc/{qU<Xs9hq &ɲ_ΎZ)E&$dAT1v}v׽D`L*=6Om $G[a,Jm-DFf@Wn&.r&Nz MJc`Uvi3X|>7"Nx=E:ő$YQ0qv-ev):"Œ\޷#I'\aע =%SM0Q4X^N4/ |fM;z %2حh)}:3Qo۸aG}&BqR/,Rc +9qFw!7>W))VSTp2c4M9.sҸNFa=\k&ݏ"%F .Y8aiDyiO C|F{klYseܹ8pA0v+C7|xhsS~c'(HR/PWP6B9Joh'ku&1QliumgBD 2|fb^OmgU ݻ֯yl%%%6޾}?~}O>,ZȫM]]=DFF2l0n֦{wAO?İaÈ$==\` ح5[Кm.VӦڥqȑ_ngLsͷ #L=h փ0)!-]wwO6)aTZZʨQ8q}seٲeL>=`ߏ?iӦq饗j*&LGVXW^'`ŊDGGsȑ#,^$:=z4111XYf/͹$ح5[Кm.z PMcr,OڗXj3oj_Ùkuz *24,OQfZfxx 駟AAW^֭[ T>\~wd3~:fl߶I\T2'R,y/BǾcoazt#c=1~al'uT0=z޳{> M砲Qg?_y{Jov))Wo&FXv5LٓݻՋڥ8z>}ؽ{7ڵD7loPUU]ee%999^s7^DDd#J=@V0V(m!@v4>It >a_`ߓ@vs[S9&Aůݤ)6}sh ˼d,b"vfYS̘w5ovJl/be <ʴW̤^{Vգ"uP+z 2vDc$$OIg)p}E\n]t!##L233:tl.袠...&..z||<'Nxe:ͨ}/2Śڜ⭩qYYVDE|tsey??@N4.8s|Ӫxοag߿Ro>'s6U>eGO~LAUKbr06NfVW})5Sq7fw|~I0u2g2I2ˣ7U䓱߫}~(z ecH(x{11{&GO>o#b:W}/IRP+#PZZСCZ`Xe~۾xO`\Y$;Hܽ=YfK ":Dd+ݓD ѢY;Aݻ9޽{s۽{7YYY =ݛ" INNvkyjoAA'N:b`w{)DS[ۿ9iAoAsyꯇKX1=D\ѷ#N9>{FrE m& o~v:ĺugF?'|M}g'љ-(M9l;6M./ĕP % "g1 'e$ϟoIضm۶mV$Ϝ9sog޼yL43gR\\l{̙3Jz!X.] ;ӧ!bѢEL2}1sL?vp}o`>|c9}iӓ/곃[iesO" m}t^#g0;g0AbY\ݯ3 VswӯP 1LRÛH:>,t֍{׫h$>>r{{a3e^xx,X<… yΦk׮IXʈM}]p|Ea;Px;>>3 uh 5P<(k2D ]+i} l*{'%5sVX"wbPk&rxv%:"#a`ę: Ԙpp5[x/)Q~I2h5c󹊕{$FOm$ʂ ۷/sÝ(hvPk^ XmLGo7McjU PöI2`g?JIe>8=)j>{UY >r[ͅ~`&"59V:6I,L&j`X" BM @(hqia8krhc h+"ڧpiG)͛5⺊*+pE$bLZWZ^5߰H58 BQ>&U_t] VGT 3ѸY~}v}v@Dڴ\hg۶mC߾}]#E ! eyս:k{٠|Q>ꔭ>i1LIVG?. ;g.B}^(1H} &{=,4 7|.|&6nsW駟"2ᤧSPP7|Ú5kXl}暺ڗ.y]< 땤 MMPWW>Ic9Y=ZIddeL.ȈSY:1}MnJW^O> //dggSYYɆ :t(~):T-ZpvR V<VwR^mc\ŜkΣ_f&}=DlG Mn+ ,gϞY+uРA|7s9;>3A+1[?sh/ Cf92l[rg0W\Cs%&D̛b$Z ޽{UmN¸ה |! 'o"ϖŤk;@ /̦)b|MΌ=+0ϒmZw/\vآJv,qkJYv F%4V,n]2"1tf m***01*!"i!& {܏D IDATت}?n6fUisUwCΙ7hvPFe~9\I#We_)"yǛHu;]/O#igk̒V3Q̦&3Qz e9;v/|^^sg}6~SkD@wxAӼ"A_=6XNK\=4t+aümUS﷼2ݔïG#0};e{xH^9Ǯ1 `5e^ml*jUc.,`l> Ç'%%֮]K/ĉ'xR haWOS/Xd.1-Ұ?68!^# p;ʶfF Sn`x\dJjwսT>^Au4$ƟUt">noşo_-qzAM&R$FY>_QX .^x3f9Y1L \z(@/X<[ ǹusZGpcb3S]G& eGg^ђ*me$;kwCtxސ{ CL5%MFR㭍U; ('OfѢE^F]wݺus:@`ښrfٷ`chAL8Fay K~8熝u2]M syNQ'# )ڢx}֭3g{X@jkuo|:pA _jVOX#:e3mP&ݒ}mGmtf}ԐSuK t W[H0cV?X25~O<><깊WkM#")|uԀ56>vێ6m;+=郻'-E ;nl* d[hHNNb}8J*#اtۗ*_y1a ɫYdޞrN: pni")<_žk6(azt#>!q's7\Gx:;= =yeIW~F¬[]+oT tU ؙ\]]$ILya4}XÏ`0%obOzlQ2XZ%+r6bvոlT֒_VMNegBy昆`kLUǰEtw^Eƚ;,c(/ۮ䰬R,>R&Qe;Ek% S?S`6Խ=mRwyTWW}v8sX,l۶M)5B 4YIFx,_ ~.6%fWnF^i5Uvp9s*nZ\x2yvNt>w[3{($\\rEY%zjbĉ޻w^S lWVvϾ uyUpB(yf  "5wyP̤rW};G9{L3}IHȘ+oz{}%H23%NB SP=j{ fU{V Zkd횩R}-M)2h)ﯭ׺XOƕbZIְ`D(3&˵ : }c9R 8P;g_|RS;b2PgMd1-CPcUf߱99@fj;L(o I]M S_1*[ {IF%` P<ϯzX[>V]+#i"uf?W_C,^ӵkD zpBk/=F˖=\۵>TxF<}=e [5%s"\,Q?LAz\[/I˄; X!w>N&IQff$I?@6(4d˺dvO=O/=+>Vτ *}ڼ Zs˫I,_L]& q`&]nme##VS'Fct0-F '4Ӧ@J5nWoP dPUXŮ%J_M0;P]ԖŊÎ5 ѹI Q&GRޱp.HqXX|LUElZ6k|cDxFvK t;h4kYh^C ٲvYtx`tɏo&|h$evbK|tg"G#郩H^N9 ߹n 3 }z@MBf3ZZ+~8d5 F3v~Xy-E'kvf07pID- [ʻr>T# 71_gga65o% hl?H}Xxt@ het6$'P>%ŸX=S)b'9j]6: ʶ 2P}G@-$H.RkMc)W*uDL>#K'Ҭ>$I("S@ HJ 8پ0ǘeۂ/I||p#R.cpc[1UcGU2ͶM@9fI㊾ifI(3IQ\LT6lӄF*\}c %>dK)`\6P2j1}R_g,!ǨrmuP &WAlM\( iLoPsA$^Hr{ΚﶯCtf:= gGف2H oR|0$$Z-g Ak!@Кŧ%41mXs+gūBwKd&Zm*&԰gO 3Z4f6oγuљ^<(^]|XjPψ39#%Z|fH`5:"@КsA]'*+ħ `Quua@E ص>WxQwmZ>'t'`0MjN'l((̺7X>_+>?RXdv#.>D'(zIh`Q>E& I݂G \SF4aCs_۵>%RgwPPVMqE8t?s[tG9Fg*۾Ջ]19+ɑSH2sc:.I>ThHh 1V3#(4[XF hoeumaWLݗ3#cC kK9.NߟƆm_Ym { (n' }3u/æZ7#b‰\^;_z!BGłG !@zPF")(pGbDi_Y'Vj\S É0X55BGG@ A[ s(v4`2'>_,ڜlE67~]t*R4)v'atWbS^ g{ (4E,氃$AXUHpߎxɕՂS!;ݿzlkg_љד ;TW=۫m3H0c->D'8˹;gNpޠMJ$E%G~N ,t2P _nZ䲹"/V\̨yH*x]2Qy41_{/'06><;G y|Tם$d&! Y B5eQ HX*_mE,V+mY*RvQKeQ,ZAIdmf!C&3̄ ɐ9w7t vTשX@n.i&B >zzo&X]Ž HJpPBīq؅Z}mipk[3HieMH[ocZ?Z:ǚw@YE *35b!D'20foa߿1hu4uڎ5lzҔnElV_.#ւ t#u8I[[}dЈ5VwB$ ^T﹩ vC&czihv1T @׮KNNqqKTW;`ΝctRSSYzcȑ#9z({$%%ycp9:w̝wɟ'/_θqسg={믿W^\;?'77FfO8oڡ8rb|['+rq<={h^ڳtq T3հt[P6(A^!:bF"C8]9!^iu8p#=ęL&֭[1;v3k,'Nd䐒§~ba6aaa=u9`VVAjj*֭s@D܍,i:ٴieO}ӣt5l֞M)sK}ωrbƒwm{FG0V''1%-4XG\cPϏ|>~$f' !hg?sZf0ڵ+ﯷ@ZZtOJJ 8̚v_)//'44luմsW_}5$%%1af͚Ehhw-yY[J4bGr\=*b/ϥK r;e'l4pW 2J'."9m7pB4EEEieyTT\܋Wӷ+(**"44"ѿj.'$&&һwoٸq#c|n KKK=WSR]~i]޾%,ޚ\Jh1״cIG;4XO|DfwY l5 h !C DJJ > 6m.}fϞrZR]~i]US\}nudLΌDWϬ|BњD(]9Ͳup[32XӷkXOc`ܸqرO=%%%Ǐ׻V#F3Ҕr~B/JxK(M >|_x?dg=x1zư =ɯ/,DOǶat3yLs.#`ZZ=vVC9rqñiii>}bccڥ8KKKcΝ.ΦO>^!g^;bk3͂5hܶPNj-q-bW`&_mЀve)$:?=qf/Gp>G8E"-@@Ç3k,pY233=ԩ,[˱|ҥtޝYl<]oi?/^̾}r8pcXt)_qv[h IDAT\C}ir7؏j%$ʥ ;ɷt`rtTc4y.H̚u艏0b G'อB" ӣGoKQQSNO>{v<-b8Xc2c G}K/ի3f#<ŋ_yKkJfϞ AL&oߎ^oCY FԛX܌}_nK"_-@eRiO}ï ˹Ju\؂?-B߂_]uGSUQ!Z1fcF.ΝdrXhuiѣtԉ~I&9w .^z+pu9磏>죂.7W⣏>ĉTWWөS'&LO>e^ nxUo#M6+ڣIF<xVhTٿ_9ڜUFXeg C;t2Y'pp+&BxAfPvpeYy ϗB/g[%.j`=?cB!jH-r7p9OBjQ>W%VN_;XmK[&NCT_ uBHEm@3>ZTޔlZ=k ~ ko.UV{^)Q;.qV`qF"$ ! Yj:ϺuOw=O3{&0Va B_Y! ,m9Gʫ'F)tO O!DS(Z_)o^ڐN]ke`*TǾ;/g*-t >)JBksL5k6*O!I˺|NC1پn֌VU2Ҕg\ 惲_֭Rz:wSp >*{zpC? G.AfNB7lI)!MCh^gs·G5s$"SU訵WWя6*yr'ǕPnƀnqu ~5I^u]wzB!{D+D4hgw4v1*"ѩUuxz _ S9,q#۬$nRO1jSp\іbfYҭE\?iB!h^ޖ}w }ѩqqǡ䏿:_-w!KCH:Ҕ +ncki[Z @$glU9^DI"nf0 !"P4/_yYIy5'K+UuY_EχR~^ s[ qf#Qu) !ޑ(W N 4\` 9SQM~i%U_6?͛Μ" ` kij5udЈ5l0bN𮣟 W !IͫAUZ/=KYpHΖ˖X6@zܥ I Y\s!F9W{5: !~$P49<T|~i]wz*<2~P1n֛b#t_auywf }fͺ OnHB!hJ)oKHJJJhݹ4>yoЂ+'S(\Ao9 V2eKPQ̨ WZ58BO2=4ښi>vD;{Bo6BhRjc,AnZك8i>[YTޏs?4\oڧnR\XS1جپg #B!\3%`21FpYugVT[Yu*o 5”vGq94 )tB?JRE!%%P4;FE>ٓ|G:Nj:D1O }R"I]>MsW{1`bM!RO]!D`(զ(8Sɩ$T[/:Z~H0rwdn"Nk6`C%?sAB( ⒳VRp⮁k @_}iVMi|dyN%Â}nIw j-1vWJppP!B%c)NUQp;KxW(8oWg*&U̵A6n'dL$:pa~ī% ! HMN aŅ}ޛ ,!QlWeCNw]1lO m6c_Y{))""Ir(\5'TPmiB;5.N̵sU;yS/"Í:<),Ci,1XOQvtS ^ZBBKLʪ8y*.{a[/[" ΐq:C6JӁ5<;8jBqII@b&Lվhq[[^jk?lа1Z~eXEv,QDwrI^zS/wpB$ ()di ~6+۞@Ee4ZQ}tn +iVJ֙Խ\ĭ3b(=a6ޕYBN(W^uvhgo/B( 'eJ+8Wy 5lgO:XFq` U׆ }Z*NmE?r̤0kaX:i0E""I^9We+gz[\b1հ4&9&u ƟNfH)O7}/J !O׹* e}6]Us8H4Vs 4Bu&)39t׋wWA鏵8@L̉˾2'2 PU^e%3~ ~J)v+bɗ|wvє=&cԪn EpY.-:'O:o˟pOՙRQ{ޅnCBˊ@ᤢJP9;s!?¤Um;K1D!r; ek>%b LBqِ({;YZIIyG:nab :bF /tzvG7HIg! \E3_9];r]!Ɛ ѡz–E5xOܸpֵ!mc 8Kg! ԹjFNd|fi7t)tsi_iW>H/m5tW哧x*KgE!"@HVR^ͪorڃ\Fr%_я6 #Z++umTk/kB!.3UYXG}iL•"lu&\.zX3bÌF$Ig!% k+Y{sYG}Ć3O <=6nJO4#A1g˅'t Ƿ]x-B\$Y6?8NaYڄ2w27vi΋WP~vog+#^BGVo xw 6ǚCdtC>հ{7]Ɍ]!^ [/<@  u^wYT'T׸:6G+3vBoHJ)P⯎ɳ#=LtzJ<1YYnf+3vBoI-[sD LBmj >ˆ]P |g|Bn5ĥB!$rGOضW&rgDea!z"a˟y ^+BxM`+s?~r/-m;g66; F"AڬѻW^\Yf !"f_]іO}c#ؠ#>"6Fs8_سB!< ]M)=SIǶ ׈3(5mg!B%JKGo{?wt:5ڀ )BR/&ZJLECӠ9nf" ?OֈH$ŞBF(MX]$Fb0NCN= !AID+Mt#oCIg!"=+..Z~>t-\#{B! `F>1Lmۖ)SPVVUwytF#,YĥMuu5O?4IIIѯ_?v.?? &Idd$&Lɓ.vI~ #))gy73cat5/3yNowÐ?wj?!bĊ+(,,dԩjժz^I&1}t FVVsf#/iӦ`ΝKΝy嗹[سgXV FYY .`ƌdffm6t:{>v ⦛n׿y5͇gAxp< '5P!MC9s(ѨVZsz1c8-T=O8 zTBBzG˖-[gDz]v)@\ұ엿JJJReSAAA*77׫c.))Q*))񪽯Jʫ7Nj]wD,PVI+Bg6KYYY 88Dz#Gb2Xn~ǎcL0iĉٷo999|X,Əhѣ֟Ezz:={t, 55եѣ1/@45-Lًz~B!XIKKsZf0ڵ+ﯷ7==7;;Y.''rQӮf]Ν#''ǥ]BBos4 [H#z ~B!e/ ,**M6.ˣ(,,7** ѷ+(**"44"ѿ[6J*++KJJ(--x|LE58ByYʛdKB!fٳ5k:4!r0**bEEE\q(..}N\i׮f]5# 멧bԩ6Bbbb4.˖ҡC?NDDW}Ds<9WAQJ`6/z]\Z:tȩ~`ׯGu LKK.%%PG;wl';;>}NrrSXXBBBB썈 r!*0yj~1 dlܸDz>gϒ_NHMMeٲeN˗.]JIII`zv]iÇ';;}9޽[v-N4 <B!]t!KHkNWeee%Kx5j(vN˖/_5c qFFjN~ae6_WgL;hS]]*֬Y֬Yv222bq;r2jĈ>So2LoO炦(GU`8\9O-G@@:x2d Sj̙3Nm^..ZHuMnݺŋRO>JHHPFQxj.rssرclVfY7N年۶mhT ꩧRUUU 4B=쳪I#. )pȹ rZMw !BV! B!#P!x\1cƐLXXݻwg޼yTWW;h4ҩS'^yuvmši .lpSLA4z! >D۶m2e eee^ tt6mڄi._]<5MԩS o~~>&L 22H&Lɓ'u&ձc3L>@\} >HL&lذmͿ! ^ΝKǎy饗g˖-<3|7,Zm۶1rHn͛Ƕmۘ>}:G}ԱE"33ӫ@c/^uͥHRR+VSϪUu$Uot:,,̧Ӕ)S4iӲjvZV FYYc3f 33m۶]sU[nq^mj_r뭷2rH}]ٽ{7Νw_[)h (ɓ']= p"6lիl6>vAlZRɀZ`ZV{9&OΙ3GFXj*;w6?ҹڸqW_}]6<j>eXk.+W@Hѣ PK.obΝ;c?\lAj?aF^d7o'N-[82Z~x'++X6rHL&֭z=*Uk\1HOOgϞeT ;W٥>Oׯȑ#kk=Ԍ ܹ3GQq.F^^< cꓝ]6j?.-\5jzx|A }^堩/c61b|M}LLsUG`0i> fz}~O6~1bO&**U|"##6md2m6fϞW_}Ν;&ե8O&MbĈ$&&rfϞM7Ď;֭~EEEN5ػwZ ᡇbİw^^xnvvr)//ロiӦ1o<1cL$W_%**uq,X@TT=MKKsʡC|ޏ@(>oҾ\]T>kw?S5"?S-\5U@q)SUOW~O]< jeر,{PBBB8p ˗/w|,](6nmƍflܸDz>gϒ~@:W|'r/\N^^6mj>|8Nẃguٷo퓟)?Cg}|$''{ek=Y5Ztڸq?ҥTr;vj֬YeꪫRj͚5j͚5k׮*##CY,&_ SS+V 6^{Mǫ:SN5'ռ߾3f sϩ'Ph#K$%%En6nhjRRRܹs]u]OJJJP7T[jȐ!*,,LEGGɓ'3g4J ?Gl6+:v쨞x U\\|1A@W}U`0X5n8uu~g檱c*٬f7n.wիW/զMe0Tvs4Ms|-\Щڵk4hQQQFzܹsZMvBahBу>?:u?LEE/2[lqi;g>L>}3f |L<2o<:vȳ>ˬYHIIqHrW;SO/Ү];nv"##ټy3ӧOg۶mXɏ_ѲiJ);!M61`*'9u{cѣtiÇa;iOS6m Çټy3IKK(M`tڕ?3uTƎM&6l`|lڴݻdQ 6`h߾=={#7|3:ׯ:u̙38q-B!he@!BVFB!D+#P!(BHB!he$ !B2B!Z B!@!BVFB!D+#P!(BHB!he$ !B2B!Z B!@!BVFB!D+1Hh=ۮIENDB`treetime-0.11.1/docs/source/tutorials/figures/ebola_skyline.png000066400000000000000000000232721447636507100247030ustar00rootroot00000000000000PNG  IHDRZK $iCCPiccxڕgPY<@BPC*%Z(ҫ@PEl+4EQ@U)VD((bA7"Wy?g=8X'& 영ALi)OO7z? xo"DDX3+=e/1=<+]fRK|cלo,]z ){T8بlOrTzV $G&DPJGf/GnrAltL:5204gk!FgY߽zس {{t@wOm|:3<@t *K`  |d\ "U4& NNp\mp '@&+ <AX H Rt # YC AP4e@v*: :]nB#h >Ll¾Z8Ns|x7\' |+xa ʈ.FD!d3R#H+ҍ!!2|DaP4D9P|T*j3U:@P"4-A[y@t4: ].G7 { 0fgL&S9i\ b1X,Vz`ðl%v;#pF8G\0. +5.py8^oG7K n~ A`86Bp0JxK$UD/b,q+xx8FHI\R)ttL&kmtnr*MLO'!EZClH5OQp((9rʌ8^\C+&YZMPC"QXYKՠ:P##ԫqBSqi|vZm@IR%%%%%/H Cc$0J8RRZm# ۤ?0edet L[MBjFt'}mngG StYZ[6[Nb\հjJ*̪Jhʹ>l-Q ynjah;qNp^ M}ϡᙣccieg^k\\6\}\\i ܺaw}W'<}O=Yza<^xzz|4-}Oo ( n $ n ]fkYk\'.a݅aτCBC*6,b:*4r2*4j**z_tMLyL,7*Ms\m\GńD\bh$jR|Robrv`NJA0"uH*hL֦uӗ> ͌c֙ՙdKd'eoްkdcэ=ʹr6q6m6o٢%VǷo- 4 [w8h)+Y؟vUKaD"b~ yqwӒC{0{}e̲²wYn\^{p 〰­RrOBULp]u[|ͮjU-t8:z##G^47emjm,j|,&f%eDȉ'Ovֵ1ڊNS^˃Ӯ{ΰϴU?[Nk/:6t:c:]A]\t[v/H^(HqRΥ)gD_Yj^\ݸxj oZÃ< >x8(ћǙlE>ZLYZ M<2G //'&O;N}īW3JYZٿl&,]Vwzf=gO|??WA}>Mg-`*>k}et1qq?.r)ԕ cHRMz&u0`:pQ<PLTE\\\wwwGGG666222DDD)))UUUfff333"""[Ȉvvvsssuuuttt 恪P΍w+}әDhѥt7\m,~JzzzWWWppptRNSYbKGDH pHYsHHFk>tIME}u~%IDATx 8v;xĝv`$N& chjP5=D-&ٲJy9GNJw0NHH4E)$M$i$IS$I"IIH4E)$M$i$IS$I"IIH4E)$M$i$IS$I"IIH4E)$M$i$IS$I"IIH4E)$M$i$IS$5sՠ%ѤÖhSJVL4VK45w]W<}7?T/DG?V/D󧟺~j^$&Qy FL75pI$դghX1JY_VoGU6iRHsNwCu6PgɌ&̚L)(YѼLQ&Lf:ӴԩhkxG3kIR!Mm\ߍ=;Ҵ#e)Exdjk%ih]>20h41 j*=Ȩ?"g%iOә٣!d{:I|Ђu1G>SAP?Pkc.iTAP=&TQDh)d%hNFb`l72F]'fJxڐ~> # 4!5q"Sqkhݍ8;B8Vn4gž iUdې)V:l0ʎϭ8́m#ӅC Ҍuۆ-UM͟V{Y$J e` RkxKf#;_K5ImA|jy i%M+1?H%%ͤtDSf?I$凮@?1F\Ǖ4sk@ǟgrhn!` 檍7޻`+*N刦kჳt h o$(N6 vw|8MY|K .N/lCsg8.́u KA5_Cg,֌8ɞ3=i{u6Ts4A"t;6Go{qaOƸeA.Fڃ@d `{[]&Xo@do;̈ b߂4 fu g6۲M;9&6X8B# 39yqj(ʛa'e&8Ɖã8#׃gz0g<0COii fG1{,k],7Η l70lꎼ.뛟}\yrűhL]+gy9?a8uqJ؉niQ0</g$[ڮUH r7U9l m) |&`(T,^>JBK1f^CM@: tIs3qifv[.k"s{tIhˤrԎ6n4lʷG"TKBosoJjT5fB8ZOq8: .4ҖQm3> ;5M]ցi>dfIhz (#&gMu4!{4c-ISɝmL3m%t虜G Ѥed+$Ģڹ3:*aعiMhCJ2JBԫ+r_x&.k4M 'Lڹ:PMڂuY{U4 `N|^FitR .|#ɟmwC%=|tv.j6L( 4n]pZ%g"lrHJgqOj:NGcf`і1RcxYLMiRL-e3ɑX)PTdf369I7MJbx܂lk#My3̓e}a#sq@+\;Ւr{S2lHy5fJ!D@yDg2lH40]1F \ni;W,8a&he0̓Yೌ p$OqMP(8aK6MO#y,I(0ÉM.i6첎&-K*8g`ĉM.i6첾2e}bDs*i6겎{l8sy[TIj3 |\Z S+Δ‰4͍a x@6٤:nU4;aeq+.گ le]4l 8!ϵ{26Y!PfkuBY;e|169YX "$$Ҿ,Nm !69Y=d'=pZ $zē96TH3nWj&.I}+mw#HԸE[fѓsEz'km,b [24k5nw vz>bDeT⧧pw@^PEl`PcaYrzyi;4KnSUѐUQx|߽}~~ wn;4mʶYWonP}D:9!}5*P4 PnfPW\4CݦY{LjjPh&EӆS07׎B#mőϨeZqhҶh.*uV9U| < znhhL3TW+=_n*&UۼqMCMEvfli#Mjǭfgw]gx9-PojqJ\+hҫ@QIi<+>nhRL&,lڍyfbw Fɛ{Wɺ1^LQ}5giB儩݉tA_Z7nhR)%a26̀gyژ ƶ:c0wMZ`cBh4`xXjدYgvͳO4hո_6xjym|h7k4=AܔKk k6M3YΟ-4ar`|-  +EqӬkQЅU4rTi.*kaQ^|%`VXQV =1ҟəLK`chwj7 ;mAoe592ͪӷ;?}—,'T*Z]J/ |[Ed2YLhT+Ӭk}=EA C-4|L}ޛdSb93ZrFepOnF*d(D2ܘe83TZ_o9y8d2Y4iGPoo+E kL&?G]y&Ksk5~uU ES*x5g5"0n}mA&h>:JS_[dH }4.צy`Bu-Av{BӪJM9qbO–CHs[Q*ӯE3ZfSw{ƻԥrP@qfbw4R sJ_6CUCMe3ԶJ'6JEOe3TG!<+=sKۘ7P&qCh6ݦO}:i}dz#9tͦVRqw~U6C4i{V scUloP]4d2Yt=R 2VV6Cڮd2Y-M[ [fy΂L&=hwl bO@-wtd2YidB,dfv;:sfF+mvtd2YiՎ΂L&5C+i!$)Yd1n j^G'vgls!$iYd1f:: 2,4:$:: 2,4ljmXA&ŖfoeT!Y@BT6C/ej(}@Ǖ`659v'pbn 2,49_[iCzhsB#B1dLRuֳЎR<甮d2Y i.A 4Yod2Y inAynE.n‚L&!~,֩>6]np)da>vʊ(Wu %R*pd2Yh 6#y @M7ؘ¶-%h+²)ݣqYhB͛v=(4%c땔tEfu>\~Tt0&f.KKN4'4_!lƵB!M%LN4'4O_#l&e8ѝAd4N't͂c}|g|WDKLN,4۬(H-6ki 6Zz I4h%Lݗt2:zDfym׭Ҍb+#5Fq JN$PtE+CS J{c&sMAmD1e(7\cJ8s* vPM9+ŧ+aZ\ aNhfBdʰYIc~(2lVSøuVhʰI_< (M)4E)$Mz7%4W׼T-Q&uyIQ}mtٲ I]^lAiv_Am3ߩR@4n q*DMIS4KW?a@ T`XI A^O8O)վ$M$i$j4#Ջ^ PB4K8SQލ0=T^BKUQ=wxXOAN:Q„Xru = &s!xD?ƢFSUێv/h:$g\Usu g?V8W$L8C~DOAfBm*L‡-T5ME|J<~~.]:37MO;-0<{[|%Fv~‰ӋIP&uP}Eϑp*-?VPy'QB}LG/0$3~kjUZ4ij[ ez<8ȴz龜? i.Z"aBb1MLn%Dw@7i.luB'XpnE SO==3QiGz=YcOFMĚ3{% Ʋ= fiͺ3%JT \|wbLAh"z.ݧSm"Iۄr1 Y$mS 5y=$fJ~.M?Ä{ mOBVA@)-j4=z8P`aqqihG/FX9H \2F0P9-VaAVβ >%z U%j ?(~xa*ΛmA"IIH4E)$M$i$IS$I"IIH4E)$M$i$IS$I"IIH4E)$M'!օ %tEXtdate:create2018-07-29T20:29:14+02:00W=%tEXtdate:modify2018-07-29T20:29:14+02:00&n$tEXtpdf:HiResBoundingBox460.8x345.6+0+0/2tEXtpdf:VersionPDF-1.4 G:xIENDB`treetime-0.11.1/docs/source/tutorials/figures/timetree.png000066400000000000000000000161621447636507100237010ustar00rootroot00000000000000PNG  IHDR5sBIT|d pHYsaa?i9tEXtSoftwarematplotlib version 2.2.2, http://matplotlib.org/ IDATx]u ̩V0 Y"S.1$+o/E o 1\z5&ƄoyZ.K4+BH Ϝ/wB_vϜ94Ιy&&oϜFYe96z?˲,ZVNS[Vnc8 <"NsqokmGR76 w###########szënGݎ3 #cڴiS9??}6Wt:q=q8G}4FFF>qy.N1###M }TŪcdd$J9::ZzTEEQ=;6۷=winn.ɺG*NgMۏFݎvKKK̴###QE,..~,T0xp<{{GL#X:Nܹ1pLOO\:>>PXZ]0ltdYsyf3n[|׃VRVInyy9FFF(X\\T/dOBo^Ue#PKP(b۶mu@2N_DkzXZl x||P?HeaC|eY4<FespjL_eY333u;Tb޽^qWY=p ##########㳀jtNhh۱T,122EQba@޽*733S,ԤΝ;H;C`zzˤ111 .EՊپ.E ,ˎyGٌ(V:Gٌ<ϣhTv^#c ZxEU8RQE%^@j155U,K LeC@n޽ q1[zEQd%3@h#.xA=0@b @b @b @b @b @b @b<`_d?/; +/YH;C`zzx >/HY7}4O#######AP((bqq"FGGnGݮ'R?NS<'"fu@b,C < QBNucccjbvv񘘘ʖNS?NSSSp<jI.˲h6y4>O<ϣlFQv+9%`ĸEQ#^,*;P\tEwffղ 0:Nܹ1S;3<EQTL #HHHH7>ztt4vXZZyx 2@_T8J) I;qv v{񘘘5-#X|]l6(vN%`@@@@@@@@@@,` nGQEQ<Q @ b˖-u", ,bff1S;?j xrrrst:uctt4vs(bqqc Gn;0@b @b @b @b @b @b @b @b @b @b|T(u>˲>M @{Ojϊm۶=;PDu@Pc  1 1XNS@ k255U: @N(˲;w=Jrrtt4vXZZZ>&޽{Na޽`  =;U??"=xLLLQ'''M,)0@kvV8 )0h4{||<&&&baa%`N \e`l6(v90D<'`8p8^yNFoβobc0䮸⊾offc C(G ;cՒ0!eۣ,$F$F$F$F$F$F$F:ϞH @@@@@@Ĝ^u:h4}ݧGˤM+ϙ0 <瞫{ NQX(B fywI%`@@@@@@@@@@@4ʲ,q 1 1 1 1 f\z׾66o^{md\}Ցyl޼9nXZZZͽz׻btt4Ğ={>=aP{F?y?gK.Ѹ⋏zo{s=7Tv^ߠOu]w155o~o9Ǐ΍cu?쮻ZK.9 6g}+˲,_x3(o֕mfggˈ(WeY(O;СC+?(<zq2H_W}~jV eY~_.wQYVU]r ?dC׿guVDD6G6A]|űu?>zp2׼+"FFFVwUWa\sMl޼9.o~ӟ7Ȇ7xc /0"":###1>>j-[סCVEyTr>uv[vmqƕW^_>-dy/zwA=6m~q뭷kM*O{8Y_}<#?Q*;bǎ+_={,nTu? _ח^zi>N+뮁/eYsssO~[rW /[l)?hm\"P\K$2 Cm3.V.ybW<_qDB\2Mo!,˒eYcܜbl^q4U7)L.qhT.x:<b,+w@-ƿ\5\5\5(FOQ5jjjjjjjjEQ5j=E4s4s4s4s4s4s4s4j=E4ziiiiiiiiE4ziPӈPӈPӈPӈPӈPӈPӈP(iP)        QP) S@M#>@M#>@M#>@M#>@M#>@M#>@M#>@M( S@M(F|.$>ա庮`98$>0 r9aDF WX6<ؘl۾j|D"JRr]Weuݫv,( irr\V2ϧh4t:-۶yM]F P8y5u `PXLdRRI㈛.DT*T(8ROkY *Jr]%|>AE"  _B$Q2a?@ OQ|߽{n6R?J҂ؘ,Zi-;TJPHPhŜC-@ X,P(IyK|JRD"EqRDD(<'2;m[\N;v(\9U a Ď㬘UHDZv-Ԭp8\SOS$YYK$q+*Y,g5* )/¨eY:}_\ɲ, ??ta\vNPxoooWU}_WCCRO _nw߭X,ijy*[a˰]5XmJE՜,aW<fǤ(9Y =zT۷oL&/9N뮘x<7./_Ť eDžB!b1|>4K$wVP(h4h4J.VzLەiY*8_H-_4Q4z(~5oAOQ<|>qmkk8*+ǓW4ѹbQԾ}40001+Ms\]P[;w?֜Xm,Sɲ5UTٮ =EWJqs!+ Ţ6rY}}}m*ά6E *%ɱ*EXLTj~Iq V?5nOʕ-͔mճ *?S'O\жʲ4եZ< Ê BWjEMMM]5J)bx7lʖ#填񹫈-ܢh4yog_*ήTVS~Wqyy-z7;htt]O}J۶mjs`1'uU2ʶ-ˡjD|*ޮX,>BA{83\MmkllL/T*4M={Vf͚LƦyDQb1o `iqS5>R;W\WEDa9r9]]eѨ2̂ JR|*JQ(X/qF8 ‚dt2 cQeLT>ׇ~{NhTdr֟aeY,KHDHDhT4>>СC φ yf]`iy'.ER!@`PRTʖre[R]Ŝ|>ѨΞ=~[Tc~Ѩ亮*jddd΂yQ566SNW7u뭷^8y ۧC_yJ%SVJԶm)˲Q'@m|| `Z*o*S`vbNPHڸqݫ={̹Mi5~HO;maEO?|M:thQ%I=z) PT| '@|X<ϓy2,WyVU4bN(JӻᆱQ8u=x *{S,KlVvtndWWJ<o VJd2m{U8֖-[TWWw%S ?V X*,dخJeGP"JR{Ԥˎ B|8v8ҫzѨ~M{b_~Yǎ伷ܕD- Fa 9\Vld:Y >XDHD6mRggedžBj|3gdE-ٳguȑ/jm[bQǎȈ浭S(R<8 .GQi+2mOEVlhb(\`E"E"9U }~_i0E-EBE庮 ӣ~X---6(LUiT*-(>+N+N_Kb500Q2\ie%C.ӡCtAYFtq(4MAs*sadRx\K{^%jKJ|P&.W@ V<ϫ6(L4MR4m700|>햃b|>?_۶599r.zImT*ԩS:{٬lۮ~~ܰad.Ll߯6566* %PYZ GyVr(">UԤ3gH$浭W(R28m\N|֬YmRTҁt!\vmۚR}}q544+"V T,u=ڻwz{{U* ԤG}TuM7]P:q^x{ڹs0EQJa :Q0U2YP\}2nV;>O@@pCsEs(˚ZqEiݻW f8JǑeYK 4M;vL4::d2\HD###z7ꫯ3gΨYO>fkT,UWW,nX,ꮻR*R( wsN}'>X,ӧOkddD}z{{/8::>MLLu]<َ+vU0l [%ӑK=EQL2T<_ `0t:JȅgE+ɤnݺYAڵKhttTi^,u]eYU=ǬoD"f ]IfYLӔiբW8V8dw4/{`(R<W eX,4j+K*0ǫ-30dYV5u) *4M9#߯x<>yZl6 (wQP}ݧP2>ǏW6wɲ ###JO}SJR|ʲ,ڿ=bD"=#jiiu)"5$ixxX[nUGGک)~;~ȑ#:{fff|G?O$Iwuu]W\]O|VѴP(U!IǎO?L&"ѩSm۶J2MSO~;^qګiƍڽ{n馥 5m׿=ڴi%SAlۖaWt.D.{S.uQ};QPкuc)w}JڻwoV~{5Z|nl\8Ɣ#߯A ^{nЮ]ԓO> 9;S{6l IjnnVCCòJU)Z%vE9K\B2ԽޫoY\n3ogΜåFM3 Cշ-mڴIx|uD"Qؼ/i*\>|Xz)=CjkkS,Ӟ={oOSAzǫ %۷oW>ӟThx\---ڰaE`0H$BfhkkSKKfff411iIg Ky_,kAs>O}Sھ}%;wN>}kzᇵyf~b1k:}nV577WDZz7jͺ%) X "]O%TաD< `ՈF+./ jf IDATڵZnݲYYUsGz?An֭zG|*\o]XgԵx+W,U.}ߖeixxXGu]zh ]rYtZ]]]>ueYm޼Y2n&jddD6m4JhxxXk׮ƍ/:۰a3hddDsqbQsJcXZ[[fjhhH_FGGu1۷O7u*κJStZ7|666~^>vܩu]P}>_ruš~mG?Ҿ}.8y*>pG|^gϞueRIo٬}>kbbBbQ7n(6WW +=jbbB穾^ /(ϧl6l6{Qɉ'444^zIJQmqD"555izzZCCCs/1z)[PHHDpXahjjJCCC>ϫa6ZV,\(Q }:u8Q=ڼyccc:}9rr."aGGEz0466\.`0 ^ijzzZgϞU2Tww.}9_$5 x\ĄۧP([k֬P(T*uUVB!(+HTܬ!qٶ]]*RT:wsB<_q)B,Gv]LGyVpdE> ,ctZ[lQoo9W2m%TV~+8Je/###zf4$ miʶF g/0p8|sp8\]gq ڽ{Q]ax1 z饗t)uuuo(Z*T,/ZZ*455Ź5L&a ѣjoo{ァP(|+sz`^}З%]4MMLL\.+ 333ǵ{  TzqE"STjAOeg$QkkE|>R)e2Rg*j>ʹ-*[b( X&~sFAb1aYŮ?NU__\.'۶511zzzF2ڵkm۪צMtݻ<ϓmjjjR6U__22O(UWڶ7nw]OLFDb WPHDB몮Na,I$QCCZZZ499)˲422'O.VʊϺPH W;SBaֱX,=%Iw} dƬ&۶庮ļ޳BP5}Z۶Kzp mبNtM}_s>DB---鹨(̹|@ U(~[joo 7ܠjQcY488D"H$d2`0*vU [VɢUbr~Q EQ% %IY%4lj]brYRip\TdiG}j?bB$]Ѓв,RY{T/VCѸRIR:x<>~~᰺Ңw}7Tl߾][n__^pNX*gsO"_X,&۶c޽{,+E[,SggZZZ[o瞓SOO>#߿_\N۶m?{O۶mS[[ۢe>5>>BP1hÆ ֋/q馛.g8Vccz{{uIzRt4]+[r\$\.W]A|>a)MMM}j<Ǐ?ǝzUWW6oEhllL@@7oV:suuujiiQ]]ק[n1gΜܬ9뺮\訦>qqq+˲ N~zm޼Y[l( N'dY599YF`qsqYmQϓo7 F3?(Qk[jXLk֬Q{{_-|캮֭['E^uvvZ[[8TjcGo~3ghbbzȈ߯qim߾r,4ev'tM===T3:{zzz֦T*%\Rqd۶@}4My8qBcccڴi25~0<+۶קg}VahXԃ>8'xc]W1eY544׾m_ ^vfa.Y.YrVcPבϵ Οߜʎ6ʨ['' K>ߞbڱcoiddD.vJљEY):66_|_KRڵkgGPP.as$ l۶M}}}_WR.ӽ+4u=3+ i˖-/HG0 Cz뭷tI%IE"l6gϪK;w߮kTa٬;W^yEfZnvڥm۶UWc433믿(WyrsC a`ث1(M(1%;Y '05Lwɍ\ XROeوFJR mcE]Ԝ=<ϓa2MjqW_Pu^eͺiMMMijjj^D"\U o駟o[?W0TGG>O_n.[X__;w4M+ڳg8 ԤzHg[nBk]]y9  EQ577kÆ zumiݺuW-Sz7HDB۷oדO>o]mmmK=\.kGpTD\ٖa塞']RlҽRgƹ X9%FPPB^ $#>uۗsP):uJ###*˒X=qℶnݪ;SrYlv֕HD.quvvKPhѾ'Fޮ??׃>b(ϧh4L&K'<ھ}&''u7^rߛ6mRssj{8Vss.*j͛U.=F+7$ 577n,뮻N=vڥ@ P3{'裏Q---K=jyʗm͔l,Gl Z)PTWfk1L߯eǛem LQהy,fZaG?o[f />Xk֬ѣ>/ U  * jZ~[ve{`KV{x\x\T*T*u-Tj 7ܰSf9'qU4mʶ#{5o(}OX?ZTO)+2yB^rrCOQpM ˶mWWڶi8qBw}nݪT*%q4::g}VlV~&&&SO]HDҹBAbQ,hNhT*D"!I2WDޔeZs¹3 Ct6>I>ϑ+TR8߯r(!OQt(|>uQFU,uY-+]ei*Ye[Eӑa|~];><_ફļ۴uVe~?~_DBw}:% **J\.1볟o߮L&S79&IR,'\/ۚ.Y*Z g7 |t xW!O Jyy9~dWrٶmMMM\8Z!B!B'ш+*JFХЭ.Df>-1RMm"^D67hqOR>W!R)EVχ˿d0 ;wRRRB aY!bQ4ܸqiv)//@ X暘`llP(D4%Lfq:*++bsiH&wݶFX,nctuuDz^ ~RUd2ɍ7dffCYYMMM[ Z>ˑdD"={L&Î;xB1KhO$Ib2K^0TaaXlΩKxcU Zd]AITlE 4aX &=EBX䂢 FGG9tЂi^|@>Ek֬aǎ]a _!3M9;ETqgY.v4`XX7npIxٲe l6Eѣ\|9_QeQWWGYY. Ξ=0x<CAA2 7o&ɠiڜS===RWWGuu5fܠ(‰'}Q!Ν;ygؽ{7[n0 zzzF pQ:;;)//ϗ---eQTTDAAvH$¥K.aZLܺuGʕ+q\0FQΝ;餩 yby.]D&aϞ=^R,>|ͺuXbżAٳ?~vͶmy&h[nq:;;4t:ӧ9w---R>N! UQTWTR ]B?_ mK;ғc cQ"D^$CwHI !0LvZZZ!p5>IEmm-~ޅGڣH!2 f.pMuXf }x}d2ʕ+M ȏ́VwF6EUUt]ϷðX,|եf^vӧOxl6SWWG?Qy<9}|B!+Ñ_TPPpEL&L~1~ܳr4L>G!OH$™3gx<)O/\{ú\.|dYfff(..^Ro/RiH޽7$Ͳ~z  NLLp%>333Amm-ݻ%IJnw~ZPP멬d|| .PUUE0q- ͖Ϭ}U8 k.ZZZ%iZ>ynn Ø=$###=zg244ix^yY~ bݺuP(Dss3UUUx<1|>TVV200 u_oJaaaEOU׉UidFC?sʢ(ȺJQ [xoQEIdTj8lwF !⩑[V[2 X,իWB">N"ȟǁΝ;Ǎ7xصk=C!xrѬMedU >9,iAi,ڽ{aƱ%FLJI<ݾO P8ɹGM4xX_S@ J\!B<-E!Nrؾ};MMM*pO?inݺfv?cB!f6c5?KqZlffIREEED"1<<86l`߾} \vGd%_f׮]]vɁp8˗y lܸ׻쾓b9AI0PUÇsy^yVZ%###[LOOe~PUU0 JKKp---lڴiQ6EQd2σfL&QUumNIhW^a޽f ;{,;00(W^x<o_ݎR)***?3mۖ/{ =JII : %%%fZ[[inn[Oؾ};(dٻu8݇GɓݻիWzge !ģ RYHR%j}Ҙ5s6c˺XT4b N%Ndp-xV2NKY,sBuUUq8uVc$xWwll>.]4H$stIl6^wV+VPYYbϥdϞ=޳LbK xX,av\.x<8~:7oޤu֖@ @II ֭[twwrJ=fMevf94M#qu.]D:f޽477cyauP4TD20̏ &}5 Eՙ) L%1{$h4(+p^gc]!>'6/K|B!@<)L&ff^/EEEXǹuRJK!LLL066d \v#Gp---l߾;8555~֯_侢.:0j011{LJ~HUUl߾}YP(k2uűN(R[[Kgg'~EQdLoUUD"IUUhtNyJ0$322B&!uݳ&!cƍd2FFF8s /8x h6@| ӟd294M#NsA~_o}[|  bX4x<h5kPRR?V*sL&gQ=4W^\x;wyfjkkI׿ĉ?vSYYctt^xN> htIcνv!0A0رb2]C'xY]'M$3K@auflυ~CwlaX]6b?/WRYՙJ(s+(vR- EgW`1IgIPT!O\?.]fxxYN,# ya|ٳImmc++B'$333PPP@qq1:Z[[پ};W_ΩShii͕]l6˕+W?pYwƍԿq!===\t ̊+hmmܸqa{9t]'LNIRh p85M>H$7hllddd+Wootuu己k.`qqseZDv>EQޣNwgd򥐗sW!cPTbJQD @U%5YwoxdAyx+j0KiSq08d*l6QsUj\L_/ST!OJQQ---9rCyZu,RgϞ7ڵkK^0| 7Iyy8B!r PUUt&QQQ7 j&''S5miY!455QYYy50u ._Ç]رc@`Y=sYt===Q]]Mmmmg䝢(###ܼyBΞ=xi<͛LOOsQ&&&ذa{U.frxPYYIuuujmN;dc<](@v)((>^Aܱfs0^xY:X .`t:I$R_<wEH'ORRRBss3mmmƁ@i|>cccܼy͛7:u\_ZJKKT~q6mΘ^/n{NU|fLNNbXPUX,ƍ7رcLMM~z݋ZԹB{uUIf4JBQɪ?i`X]23 _gvRzHvV;|ܫahT"P8Exˡ( RY"BA/m~JVNۗB!fQ^^ηmBМ S _KR 3::׿uJKKH6bz)..zVQd2D|&x_BLLLFzRvh}}}+?O\;:eee Q4 l6K"wb1^x^uJKKGg0::JGGcM&$Iv;]]]7sd2s\.3ȴlY^x{nyaWk yfV+׊̚{L{pT*EUUբs8TTTxfLMM(ʬz`2(,,`0xkF9wnl N~~W^y%dfdr{fx(..u:8 wfΝ477{|ł餬,?o~wsaa!B9.wOafvSNqԩ92ɠi.]vJPTlNBјJdP>)b29jbMLJ1L_k1V Ѻ}?G:ozCVIdT.D4fHe5l3>lk,܇n;H\!B<f3.v͆ejjjVP4KHu6mD]]#+]t:)**EQkk)Eƍ׿?*++پ};۷o_VVB! ql6qFJJJ=N]]*KmoogŊwA__?vggtvvRTT@b===p8ضmeeen[RR³>__ɞ3x;>>s=GKK 6mnc%a5M#Hu^ |̻Nܷr;F("H3(׮]# t:Yv-ŋ:?2333l6JKKJ`0 ".\`Æ 悍=yFqqq_.dbQ__ςQp\466{;mkwkjjرcH$pݘL&bW^% p8Xf +WdŊ_5:t!vAKK 6lVBB7 Ո*USHHi| ;|[bvG%sĪwFS~cOz'?d,& 4l+Mau/B!xbL&\.ׂ AfŜ.b èz_{sO8_H$™3gxxS)//gʕ F% QRR2+`n2Z~Aoo/ϟرcz4~;F8f֭ūVbppnΟ?Oaa!`l&affM(,,$ =榦&9w555a2u|A!V1LޯwRiD"]m۶ֶBqLr}jhBR%kѭnTW f-a[=d=$K֑*]K[a+$p8FoMf4V3>V}h-sٰYW㷕ʏ IDATB!xre]t@sffSN155şɟڊtRPPRwB!X:EQ#0:: EEEb1ܹs8pիWm6 O=;v~ӧOo>I$ܼysv4667n;?0 p8ljbj*~ɕR)8ihh*MEE7x<͛inn\ 6t>---SQQg}4qOmm-7naV?>* Z{z^vJKP(PQQACCrR\\̞={Ӹ\.6nHuu5paN:an:l6< hÇ288͛h^,k׮e˖- Ciiiarrwy'O233ë kx뭷dӦM>LnSVVF}}=$ !tr0Hf4",qE $Q[|[L @u4b\5=d5 VJ FX&n o R#{4ӞfR>W!1fO?Eg|>UUUR`B!x$b1`xxE W^7>_488͛7u'OrM^ĪUGKKˬYl Μ9Cii)6Wq466|VΞ=Ç9tat:s}p__Gq>իyٱcǜ&`EWWdUU1Lv^/;wd˖-l޼Pn`xx&WݻwiǏ͛˿ a`6X,\??3j**++L|+_!u˞?j0d˖-$Iy |D0d߾}сflXz޽6ZZZd l6l66lAU|pVJJJ=Bii)8 Ė-[hjjuʕdY!O ihh`͚5dŊ|;aݺul100@(`0PsQ\\Lww7ӤiV+EEE444i&*++HEmm-b\Lٌ㡬FUNks|P(΂njjgNhmm]R֪B E>nX]h{{}IF3Iᰚ-tP⡽ϊBf"I\!B( |g\t UU| UUD"ꫯI0~lQbʕR_ˡ*dd29^r%@!xڥR)1ͬ^??|dooq_677|m6tttv;mQQEEElܸqٟ{'A0_*_WY~e֭lݺuQOLLٲe˂=]+b VXWEt:^{큏n yזu|FQQ_6h:{\n4E_j) J(ӛS|zsh]BUb4SuH B!)Lrߏ UUIRdʗBUU$ n76p8|_UUŋ]r%k׮?G!mu:o~^zB8PT,JV;T39{8#43,rkW(pRc1<~HPT!O\nB(1==~܇(J[nE xH#;EQ'ݳgB! QVV*BXqA! @ U'$dFr208hk1X&~uEnZ)r㰚e ST!O Ál6zl6jjjhllv/iL&CAAk׮ȑ#;ig?s֬Y^ 1L!xeYfffhmm20B!,:dQ%=t\GCvޤd7{s60 U74ëcDҤB7k e2vST!O;> L%?g(++?WUCݽb1.\ۿQUUŊ+X,XRlD!ϺuL   >qs!Br!JHbXlY58Z[[GӴb1JKKTUU*B|s= !B<T]'$3J2J/0i,)>[1Lnuuע4{t1>O4g㘳 LZtb L'ܚN;ppx:KAM5UT(tB!L&Coo//_f||<(ܸqc( ,fp8gO^/VEMM͜B!B\eNȨ:J8!Jv95y`2~f.h$5Ϣ`,/`iht T[|{lK&nqJP > mrUӉ\pw C2En;k PlV3f=R>W!8]]]:tt:fd2ixǓV4qq Y;~L#B!B!nnPTiDFC$3[=v [z *_Ɍf`MMbUf_CÉ H8Glj$3lԕh,OsЇijޡB!X$IUUuuuX,(EEEI& D ***YT*E<'Ju`0嚷BL&HY]!):i%ߣA i(bp,f}s~Ɩ;cF_|<0̙L&, 6 25Zξ9iZ~*rfy1EUUt~wcٖtPU5p`XyLyZrWUu5ZZvuTl6avl6#o\@Toˍ(Y .]9Սoc8ّ[aލ(]vi`R&);ӱdcxFņl^jR0tEո1D4'M&6 +}li(f}m!>UJ>BR>W!br\Nł(XVTUe||K4ebbĆ hjjr=% =V5(Xv]v{9ewBdb qhhh_ZýϤR)VXp8uQ>***e G!BTo<Ṝd2nOfxxصkk׮ dR)B}3<<̥K8z(CCCDQL&Ŵ/SUU{ڵk};}xioo_Vr1Ο?ϩSt:},UU;w .$T FYYmmmڵ%lJ"O>O?l6里ݻwсk`SuEg?|Da޽TUUBO YH*K2Q% z7&--6=1%Cnj kjG@s,S ,0C8//j2>EgFYnw"Lp۩+v/Nv}䷡B!}l<.i^bp},t7npu >> n۱ f<!Ÿz*?JJJ\!rYbX>nFGGyl6[< &&&BDbtt{R[[;~d^{=ncPA8Hݻwt:ܾձ1>CN:h:4Pp8Lii΃dfaѴ 355իYbOO'N`rrD"c)B(ɓ(j&LJqN]šs/ZgH43Cjnh")nN&>HЦ-e>+8lOƜFB!v¶m8| Y8=ұb1FFFp:|ߠ~;{-d?!j]e<w}66nP9l||{UUihhx;Xsp8(**t:}9qwGee%[la߾}+Wؿ?CCCtttPZZo]}7oK/a\zz+u} goNj/͛Auuɴs]SS}Ea>])//\NǏc0.>|M}]B֭n{t]g||_?L\!jqv܄lG:f5I,yWa&1/q_Kz{tkz=DgŰ%BC oBj{A7 Q9|}C3O%Lx ]n Ou楤#=EB!b֭lݺ>,:tǏe^<GQ2 HEQdJKK }\B!\&ݓ(_[[bCX?.f3*_רJ~̳>wgq\==`Awq(J&MQlɒ,˕N*lIJR)?RypvKBR%$E b1̈́A$:*LL=sb7N]]ݼ?xyi\tW_}׿u^~ejjjxH$i `p|d2.\ںu+/"[lB!H!x(ge2ZZZb477S(ҥKLOOd0MOMM {2<< l0p8TWWHkk+vMӈ:t#G`ǏvSSSfm۶-*L&ŋ$I r "\+WKj\v墪zbv]Wʼ+{H$DQ֮]K$)_rl6i~Wg(ޭ䀊 qE!HpE~M/_jYr%vEQBTTTo>._̡Choo/6/_˗;6dɒqzzz8~8_Wپ};+W㾯v}e>gzzit]gݺu-e\q8r333dҥXNE9$LDʕ+ ^.\0 :;;ٴiHUU B>9~8󂢥gϞѣn,YBe&A:.Ha5JLՅbhuޚU gqkչ,Pl\[0w(K`q\>|>yT2d``mF$CkVgYʾl6|>~_Jt !-RzW9{,h o|^zfff8r?9{,cccNCCׯ_:W1M]9y${eϞ=LNNi>kײ}v^ypkoMXwa߾}~{솿KYCCC{?dppB@ee%< HbxMYB立D"UXjO>$/" CB9}4?֯___f\.q1|ٰa;v_& ^)-6hbMMML&immrux<455F)?~;w'NO_ӤR)YbEʈeYޠ wjV\y'SB!:|hZv-+V  x0M .p\پ};˖-t~EQ7ŋvEGG^ryݻwE,n.]Ğ={`۶mb1l6^e6Oȑ#βk.}Q1 G"̙3pn:::r:333?~~+WՅYa~RWWٱcNEEEeqe~H$hiiaΝ455t:Ʋ,Μ9ݻinn&p8Px<ίk\.n{%Or#EQuB@6%ɐf) :H$ԩS$I٢SSSR)fffo `ffÇcfJɧ-KRҫ__(ٺiL&9uMMM,]\^tǏ'yf:;;]6ɐhlln@xWեX,222ݻ4UVyK7W\n.4ޱO~.BmĞ=}GfQ<͹A dkcڽ},1LՉ(,4b'\'RvXV`Ym*?*rcR>W! ͊+hjj"H`Y߿~++,V×TTTfKcMD4|Ioظq%KT!bHmm-ʕ+W.]??aɒ%TTTMMM >O'|[ow3o1S)?J4EQEgMNNgikkOO.qDyc}>K. ]1 41Mr bhh|>_^xUWW(;q.^Ȼ׾5osyYUU,gǎLR `0ݳ|>z{{P(t:,\.XLiVTTx5c<H 8@<W^|>ρطo}}}b1{E8~8twwxIPX, H'IlyDnT^+e%|rPt1 !ޗY}[%inTӉ JR\tݻwk.~i xE1_yQ "\Sn3˜/O2'?j8|v7 ǞA1K?tWBxd6Zosb&e\5B${{&Β A7jX^CS[ =|B!(NH$R~pz, կ~k҃4?? b1Z[Gf[U!tFYlPhktϣ( >v"ׯ b&TqR---,_LQhii)& +++illn6a>|#GpifggfN"`bb|>O" /@[N[[˗/UPhbbb|-[b٨L*X>:ľ}s\|MӨ:j(g۷qoaBgüֲj**10Id ![aYss؊Y,Չ QcN.}k=#]mRWP I0E_=Zu~+ص$6Y:6 ñ&E$w)DW\fhU!ER>W!EQPUp|&wF BnƲ,&&&% ]! sA***  @ 0/c|477K<Dz,2 dMӈD">WF2,SB1n7UUU8yAKM("^S4Hoɓ'4s\x<5rE+355i?ݻw_S4Hp)4M#3;;iJEE[l+sZ[[yGXjkbYSSS`٨% r~z8 :.]ZX^Κ\d 6lO.Ο?ϩS'e__ΝCUUZ[[V-DZojsPYO$RSSC8./ p14M+ovihh`˖-ĉLLLtR}Y:::ni_ٲW3 0p:l64M#LrzzzX~=|>t]GӴ àX,R, %XeYEhzj!E828}8S8pM1ftOlv1ܕ `BSDz{Q Wx.lZ{~ G% .5[ZƙDca֨*?+">|CB! q, Ν;%7p|{}ny$3xz > 3 \.nVN r_B@PviڼwX,Jʽ k?e߾}/Lgg'uuux^._0 t]_t 믿oqmm6bL&s g~԰qFfggyx뭷ojkkٸq#TTT0222/VSSk԰iӦ-EkjkkԩSuJ[oo/ϟ' hjjZ3SUUWxy28z(nggܣ|>###,]}/+dyJoڵk,e^p{|K_^-18y?-ϣiZl.˜8qQRYYYd̐N1M\.W^ PYYyM&Xi$rE"A釃5W*י?!qQ]b0ɦ/"[30Pt,-S6=Ik&3Ǐ]*5k9iGI A$AQ!B/0EQztwwSYiyΜ9-e܃vo!Bq/#f *R|tݸnE!͒d{KA84[x<ΡCF<#˄a\.og) /y%K|UF(;wrQYYICC(Ec+**[ik2~0 ,}}}LMMaÆr_؅8hUp8b״PU5|eӦMFQn__[(vinn.?)G'p8L0dbb⺁xx<477@.#HK2u]Gܻ֭7r zzzy٢Dd2I(lrЍ70(l6)WA Z)yxxl6ʕ+*^[YY9sT:b+$IΟ?pi~?=7oPSSùs瘘 J?bt:8Ll BYfk[* s?yeZtL Stz+, ?!у̌`34toÏ{ǩ gGQ  YUM5UElC,Q*nA'=EB!}Kufffx"[lGCORB!l2<Jee%b1ZZZlajkkD" r~irgϢ( 4662(5MWѢyOGG===199n`Y\rk25KFBTUҜ*_ NP(V,ͷV<L|>Omm-N|>㚦4 9q7SگeY^>y麎(JJQ,ܧ˨֭[ihh f.]bxx/dɒybpp bؼEG积U"࣏>bllP(TRk\+W0>>(twwF˯;B-C^ϴP(4{TilghsHKK 333 0<gf:tA6ms=G{{;mmmuBO<gI[[a{^- rJػw/ D"2 'O$K\.뙘رctww|D"ry׮]\tʕ+DqFFFx">,ׯ/Ν;??p8Xjַ]5N300@:fvvAfggI`Y555x^D"\'N RQQfctt'OnoNww]7{)y뎍Ftvv裏O~LӤM8}4iկ~ .p|Mvŗe q8@P~HR?~***XP`zz_7|źuXbLLLu:~(R,I$ꫜ9sNZ[[Ynmmm>|0صk!v K.eÆ ` \y͕+WPUH$B[[e0-RyTHN3 I4e)O̽ұ88SXT$bϒ4L_ff;V#v~:j"% B!aY|Griljr9\.>JG~,Bǹ|+Vn:qB<<---|K_X,9wv~$O<[lWSSî]f9sӃ&L2<Nqr'O$PWWngzzU^]vgy7{333hm۶qYzzz/N'MMMl۶\^b߾}\r`0. rRkz6rp: f^ gppId2}Ν;G4;w311l8N,"J1;;(lܸm۶QUU5/\j+رWV^x}]FFFx뭷B.nyxϳgZ[[ٸq5A|>NI(&H~/$IN8n ;/#Ny8qO088裏mFYt)۷oOO<ɇ~HUU+W,o k_ZyBN2{1z(ty;S.?YB< D-rN-HSsS؊9G?bj )ZAQeرq%erFE),SXechxc衖{^W|v|B!oXE2W'N@Ur1 L&ӧ![j&\>D"QvW+BS xPUUU׾Fcc#?я8q>bf6o+BWW׼ ng޽;vB@ `ƍر_~y^/mMGGw/~cسgSO/0(ZI}J~parHիW_7i[ٳZ6lڵk̙3\yeY ~{ꫯR(Xf X`0XΞwwe``T*ᠺV֮]Kee6 ]ފ)}]?ؼ@EE˖-l ŋD4&۶m+g^Fcn8t=o ؽ{7 H`ill㩧bGq)x{t:$,[UV-W秕*}n K'NK^z CCCd2,"Ͳw^{ͶK,aΝlٲ(AQNg?---a97@4***Xz5/"_җ*( wK/RDMLn"ё;6=\ǚl, ={ʘC0+LD8 Pptlix<***',8,ݱcGyn'SUU&R vuuH$4 ˲ZtؚmFGGl0p:rزe aJ+Wʆ H R IDATR\ip8L(B4֭[G, J˗/lD"[*ΟٟL& pr,N:F4LrFmYzc~?UUU7l3P nnٲ$/3njkk&tRouVihh&3uVH$B]]mE0[lEQ?-299I?<w=(ZOss37R]]] ''|[ߢycJ#O?4k֬!LbY`0H}}=>onxg蠱ƻ~MxEV3Hd ECwewa:|U^T?nfL sr(lLRvȺ`ve>&N@ E=K8)+B!K~z,vIlfpΝg͚5A N[oqYNN$!\7#p!&nx%^{}\+)&[[[imm;::ᠢέ[&<jp 68qUU~JeˮMB=.o^Ke{rٻY:\UUx䡳60-^.\"B!oZQn:t]_pL&ٳg9z(|T*5,Ox^<f4Y*B!Ӳ f):ED fe\PW"ZUAn3Ztt8W*w"F&ʊ5XZcB!5EQnNv388ɓ' '''9{,@o}[a&^P(awB!B{a)ij¥\`i:M`=lŹN76Y6;+D!E2_*s\O1ְ*NTUC{u)*B!xH$Bgg'.?Ջ,Bu{1$ \"g B!Nd4t^'S0(7ZO1 8R83#sY⮷,b/$p&1! F- ҅"ӜJ3d>ax޻v,!xbH&AQLn]+DB*eI.F~U4L ELA']0iY6Eo Su`qBq#@[\$e :,FTmԆ<4Wz .@Cȃn{SqCR>W!b6 W*8Tf,"z(.h&wjjjX|9x<***qa|{riL1xPUBW) Z(HE|>NSR[rA2W$+bJ4sa.&4{n *W!^-Ԋ/o´0MFyN % Ɠy4D)4TxXf*.\^xH\!B<<uuuB!t:bH<FL$sEbwؾ`˙Tꆙ;w:&N|f咏v 6 U?z^/t:d2r B(FUU p:TB5tEC7F>dB^|d%0N^iA7L860M˺ :k4Wz\;T)+B㡻o~ ߓc$INرc\pم|lڴM63BK|9A!x9UU4 4/Pgx<\.R`htR9nbHDBt3gȌa3 \j Z0Fa+XoyIK$d:18D 9AEs%~V5yzozq$(*BᠱJr=yH;::J2n^s\a"r;U* ˫Я-e.4>Μ9|ӧOd| MuxnD [E<[P}ӜIP4JV\k`S[%k8T*nB!p Bdz?d8ro&lUUI&b1 ׌)=/ܳD!(R~h.AQ!x8sbqt'CES%!BDH5nÙ@(iMzOMxVpC .OgJ YdecJ/QwNz !BB&ahhEQ?#{ᣏ>iy{_|"yh.B{m.;Ԣd \Q{90< w%Z{vKR=(+ګ|tׇXR'ඣJ& ~B!xnhllzt:}1 D"&&&ft~@ 继B!BE)y˲2DYtޠĢ) C1 s, "_48?P G̐ TET =ª>]䉻J !Bftzinn&et]?ѣutt裏v{z!B!xXXaZERy\@7$=a3p,2%&Q*+E|ݸ=]B!t:q:7nbbSNq (~rǛB!B,ahI`.d : ͹v4o*ͅF:v~ګt 8pڥT7|B!xhYq+466K𘦉d*VvӠB!B< J [n*̤5P(9`8N04æ@堩ˎt {>Y/)+B!Kea&i}+UNJѩ)HRx<hiiAQ,"2==Np8L$nB!Bq7EF3Hd )чIV3pj8ّ$<ϩʆjԅ={ B !BR:fhh'J-z|Xd``9s16l0ol6G}oAooתyygw~BB!BgYs١1?IC0- x2ϕ,SgBb/thbW[$ĝ%B!ԩS꫸n<###.j?199ɑ#Ghmm0 <8NEaffӧO300?NEEap444HB!BaE9f [)βL @4ó9tPѶJj7T| B!o(B `|>ʯ.ir9fggyz{nBL^,b֭TWWsyzzzd2hvK%{B!B,0-EDHN3(Deqe:ّ$ h,]>DCCDU%3T|>B!o(eӦMtww˯,wOgy@Q5-qTǎu:qm@ڋW EINC[dKL#%RLy~/(Ғ5Q2%ýlDCCrŹ!ˑH$FA'8t[n.W!B!ĝ˥d~l|R'J((P ѕךb}[U "*QbQLQ!Bb1b5J2h,cΝW!B<EAׯ'0NsN8dYۇ躎i7]Zr!y._ >ʓO>Ioo=!B!X |LǧlEmAjSe8U!_s訏Ӕ`KGɀP8 @@jRbI|B!xhN[[j5.]ę3g,\.G<lÇs1:;; BD"[v !B!ăj5cdc |]5-Kw~C9j(c<:#RLh]$"F|#A꠨RBsB!IJyZJr]* iv=00 D"eY366O&y|#G( 1ML&C(B!Br=JKt\_ ˚T-E\s~xQ[:XSa#R. Y]P4|=k]zd/O<$>W!B, ieqYJmm]x*b͚5 / p6FFFYz5uuutuu9B!b$t([.˥fK5t%S9=^bl4%Xcc{M2I^z؇g}1$Ud~(X)R+B!xܩcKO$>W!B, Xݻwm7M!^{y( dH&xw]ץ>=ki2ST!BP^[eٿֈdO*Y9p)UCf !Be0 ܑP(D*b!_883 fϞ=${.!Ľ/<VenϏ;9mםϚͭ( ]/!B- r}UH1t \8t1d>1gZLvt7X1_!͜&T0Ѽ߼J:%BQB˘F@?dB!\A@Zelll6;Finn_DQܶ.I.7\t MhjjbW%w!B!(J Zϟq:;;yyF%2..]7`AP(}lf˖-Z255o+`NMMQ*r$I7ݟeY߿_8puظ`!B˵]53?j{2?t*Y\83QHS|ϥ=Wbv]IlT3 P4<=^DAuM˝/@Q>B9B!=u)J=z|>1SV)ڵ&BxfuH$B" -•!4Mgٹs'/j>GJ%* 7nwm6>_*۶mCUU>cݻoZ,1L*" -A!fS&l'[X.+_p\bPӜ/c>a- c8<KS.Uk˕HOt ψcV⇒h\]#+竏E]V$>W!B<<#*===5]ejj3g066FTBuTUӄB!EaժU<#lڴiFq;GСCE//yD"^u>e|e~ӟ:O?4N}}=7oRJWW '? m6ŢDs ! (Y%ӥf{x,pƙ_32Up|L-"{ʯW!B;w2<<̇~0iBԩS[S=ʦKve~2d%e8WDS%NqxHcuS OVa])l~sU"ٓQu5…c>8զXP $TG+B!H:pK.O"ᱶm366eYR)Z[[inn<|wMMMZbȧWTUE4(T^$ͲqFZ[[ cs؇[Y,gdd.֯_]ڵkYr% EObܹsK477s !B\8S2WCc5e~sbeUUD-Inhamh\̅i S"TCu+FKC(ܨ(*n03}Jt$>W!B< àu_g<>瓈 u) y<ϻOSt:M:B,]T*zzzUUUd2D"FFFj]32== @}}=L溟LE;ꢨ8ԩS|`ݺu1%BP\?lWC%.w9򃀢prgˌML#=ņk"$*cN;oV<13(g$H^@:JW?Gm7ne.Zy!B@ BtwwK/1>>~M9\Բ,Ν;/mp#_ximm]B,reY444 ((B"  f]*(JA@"an"X/s+B>ܹs?~xYr%ϟ-|ߟs5qC!"`&jjĭIAt9q=270UHse&lH)Ns2ai\;_ jF6o3⸱FB!tswD8jMۨ5oIuhᅼ|!EB!d6SSSDQ4M#`6ZB7"111!)?UUlذ W3MA~_3Ea8@__TNP(D$0 àH$rϯKYb N\WѲpb?'LӜ ^yYnO=apFq0MGjJB!ăg x>K>R]ʭ9C*,3s^Xguc6T@S?)Z?E~2A#F7ކk9eBKv@F=FGf !B܆a$IL䷿-s*cXZvˢ۝}i&&&X~QUh4z]wͿO1>> u!B,s`:Cp=).'߳e85Vb$_bD u-I6wYے5!Q?Ӎ6`VDPƚC !P4-DT!B!D"Aoo/.\>{\Q4MCӴ"JO'"w$allcǎ122t9rcǎaY\WY8fʹ-օwAu4Mö.PnuoXt.s'Oߏi]>\EQǙۣyضa:{b1uERtB!ălϧjT,eaS\J*'G+q9W%jhtXcc{uIQ Ưi=oڼթ.<ε%k:D8զXP f_^o` iX,=+Bqx={ept:M]]b4>whh 5MӨc͚5|ᇼAaT*+_t:M}}"\q7"ST+^7MuI$7ؽڧqon&Zmn۷Çqƹ(\.*uMӨjdY\|ر-[|k/8tmI!߯Ot(\j"K0'JA2\^g6}F5  ݙ;WdoXC ~P\%TGF7*i9LB! B! EQFB!F444d8EQM$>uL&ßٟ/|IN:ů~cEAUU4Mbyd2b1犔W}\.itttgq&EQrLOOuϊl64A\s|6ܹseǩ;'qYEaddcǎ}'|giz !ˣdTm]10w&@qkQ4 opcxDoxM93^b0[%W ݙ0;Vۜ+#5д}}#GaxF{ t HPmNI*mq-J7$>W!bfcr6;2aYa,XQu]"ȼ"g7zj:::u] T*a6Ν_+lݺ{5k,wt:͹sfsP՘djj EQXv-dkD*b||!mv1.]bttt:Mcc\sŊlݺunnݫW8J&vv !Sg ޢDF3KKPQx;v ;7:3a3]rv̑F &є ӝۜ`kW-EnH5Tqhpq̢61x+զmԚ㤺h!B!h8&MMMq X4mB@RmA%l7٨(W K{455[o122BT+PNMMqA&&&H&l߾Yc\1JJww7/_ɓ|K_}SN144Dww7R)}Yv؁8ȑ#e/nc]!5Z}*tv}e|h%GI_$Er('YHb[նDZ@y(;G \'Wh0ǁ,'NJA4%^3z&([)w|tP]$"FtEn˓ !B)HvvũS(<#Μ90B۶q^z 鬴mST룩3省m۶/q$0114weӡbyX5?~¹3$.Ml0SJyl/\JC- k L96\dQ3mI)ƎkBDg [uX$>W!BuzڈF Ο?ϥKMWWtvv.VX u]^}UCk4 4)sN<磏>ܹsa(ٺu+я~o;#tuuco};w^?6;[Z&GŶm^u~oEr+_a޽ڵk3E靍B!OfTLB͡b{,zo'y o7*)VSG0CIPîn\sERk Ɩ:i-EdwHQ !Bq:uuuttt5W㋽U!Q<~; < {!Go߾k7 :V\(橧ZD"O?M\FQbtvvbuݻ72==Ν;ov__ ٳ˲Blkk+w˫(B&w1U!'/b͡jt.vATL0(]f譨n 6Ep߈ENdb`r\2^0\TۺX%!kB!B!&E!Jc*'N RT`͚5tww/6Xy׹|2---|j >k mii!200@\^N"yrJV\ychhhuoO<B!ă\/T,xDAMyT߾ \4^GuV=EQX.eN86Rj{uuIz%kKD[2ST!B{Yb?9y$(>ަp{|;s7J]]hɹK!Bqml\զdz)QDneb5Rʛ&81Zd`(jō-mIҜ,x@H|B!dÆ ^w}˲PUUf1Oi266Ǝ;ho$AuJ !B,OUۣlM۝_4($w~I.]bpl"E鐌kI=ͺ$ɈqX(+B!X!b OV[vѹBϮ{cǎϿ˿WW444>A>m355Łٳg瞓*Bй5ۣPs(Cs觹vF _$Ar#g$1zɯ:նGӫqwn.8ghR=TlLʹ"DC)" !BkA@>?)o:oa6ͬ^xʚ[tǨ{B#8ӧf\xǡX,>p EQD"yBOP(ϫ[ośo9sUOu??^B<"HފB!Ē?Z]ʖKZCg)ff}H05wLhxF:f)u?%q Um &*)pfLjmI1kc*CX $>W!!d&'O__9qZ횏{GRaӦMwדN +WcQ,F  5Eث)BKK ---w}mB)#EA򋡛'#} @UUEB!x| 듭T,ۻͤJ:"SHԥ7nrfIQo$(w|ۈ|| 5(sBӔ-*k[<$"D H|B!CȲ,FFF޽{Ybh)@LMMk|۶)˔J%nz-u6M«DruneI]x 7ڈZ$ ålr LVר+blguSthH\! B!xyGVX,}v}QR0SpṶm300oŋo:tlGX(Va-#tJSS;v`ǎhvϟOqkSSS>|+V3EQ8~8.\P(H$(*B؞O(.U{r:ѩ赉?*psㄊЬ<^8 ⼧1Q~ IDAT==^rBAQV5Yg]ki2aC TI|B!C.NH}}=0S0-BNB0w|X7ph4zˢlQ}*m躎,O\B,q~ߐhnnPP(eY={Ioκu㮅B!I;S2%-4E s7JEBe|#F޿B(,c`3~(`B^43KRobi\!BqUU1 l6K?sr:t ~zbMRMӘLLLܶV"MMMܲ HR9W0*ttt:ZZZHR RTB!)[.ˣj{Nj"8pq._|LLLp!yGn[ b1uK$ZH$"BXF\ץR`htE"t]\.8=ܡB!ĽAS9jCgZH(*W_2WhQ|#q?4'_sb秹0U|ºJc"xbK)$:ɈN,𑙢B!SE! KWWuEB@<ԩSg?Fo~lϓNh[Y~=\1M÷|N!cTrL.y\bH<0$L!ˏTm`C 7ڈ^m@uʨysE7؉dzo_ e/9ϥl鲍nךbsG0*5( hB454"FHS5UgLQ!BqCHH$rdm۶3pܹ7|ߧV.m|jF23]bFtvvx"|D"qӛ$lۦR088H.:LB!l\T-[.ǎ… ZިA@\ŋ=z)v=m.BT]݄z>Mb:Y5tF(2#TnԬF)2Vf;5 BXg0[PsPt mIJg}dDJҤ a]%IuCR9B!w, 8NN۶1 p8L]]]]]466W!b+ yނ癘Ew0 2 _W&6>Wd2ڵݻwS(xw)J={.J!N>M?===<DCoJ3bMT[vqHPEE78V;5oIvh7p7ϧlj LV86R``t&1Xeuc-iV6iJYW, `h*!]%lsQCS#߫!B!K(q9w>W0Xe1>>`݊i444o~u ZFVqϴb1ѨqXXn^x4M?d7<^u(_җ?VX!oB$69Or.8À؇hoܹ4Dt.1hV]ea][=.LysL TԠ%k]G"Rˋ/H__G󌏏c&imm͛7i&VXB!)eӥbDoIQqc$ka- ,\jF/1R0\DXg}kuiNКʕrX*tM!F *?B!XTU%LsSt|>ρ Ayq׮fy8z(mwD(GB,L&C2drEDZRpV\I__X 0yB! ](.UŖ[Ru 8_g3Mɒt#N+C:ݙ+216uYߚ) b1i h)DtHh&&׸R !B,aDbAcsgMOOs…_^bH>ew뺌pI֮]˳>KSS]?az !čA:f޽{#BqGf P2 5;t~]|?rY93I +b<*=C(UadT'kyHQT!b Wqf'?رc qdtwwBTT*y=(l>WB!BLǣ`:lˑܥbL_qnPFt5l画)AW&F""CUJ4U+yoLQ!Bd4uݴs< eT*| a=w}}=>(w&_X'!feQ.)JVN6B!Ss<*KtqPx r<6N鿔gly+cmIdXHzUCS51374jh*{Lf !B%}j<!Lzޝuw} 9\E(Qc˒Vś8p"H}o{^(mз)Mm'xѮhېR,E|_hf9!Ɯ011կ}\.G:4:|q<ϻqUU1M˲T[X< Ðrp%us_B!kaD)5<%ш{ٚuqs M3@ZH*Nj*Lt mB&%B!B2 7!ts}]|sc߾}d%O44Zb׽.L͛uz-m?_ٳTUl&[v.:x { B!PA>5' H*:-qb\tfbɲ+Ko>NkDjNb- XB7hT15 CWU]+B! fyg> 'O(>y+aR,)j5~_/a˗%:;;4,F277yx뭷j 2̒:E!ݥ !B,aD 5' V("#f. .LW9>:t 'M6loO;˶BIXb*Eј\X#+B!+Tx<ތܵk/ynh( C:d~r8݌-yTYb|2?x7h4ݻOܹ|>i{a`׮]wiB!ȚѬaD:~H(kёyh 14okeG{ BłhIt.uBB!}EӴٟ8}:ŋ|2GŲ,TU 0%W!bZ,HpYRԪ4M$sssm%DQyR,WlKXd2VbJ&ry#BDR=NR]#QeTc%NT+]4{3loO#eIC].  r'B!؀bܹX8WEQPU pEJ"p]˗/={F"]l6>9>S(걅Xk<\r˗/3;;K&~!B0Ps|ʶD2?t aH ,\sję eқOךdow):1TIwh0#t jhČ|2ST!b,;vo}%.(heY LOO/Z\err#GpF4X,F<_q,cppc Qs=zgϲcZ[[o" !N\{fF]K^9X9.?ddi޾8t%#Fo. <җ%a B܈BHtRr^rOB!봵OR pՎ( eJevvvɱzꫯZ0h077ʓO>Igg'lD"*njyA`5 ^ ~ӧOsot~w( X!BWOaD:^H w!"6 I+n-1o`e9!V),tL'ajRI|B!hiiTU]e^q4M#ͮ1XOmƷ-t```W$B";BVq 8U.ԘB_69Қ$5yT.E]UbrMaj*R I|B!4 00 cՎQx׹|2W!BZr1.^H.^L&zYBB@PXe!b0OQ})E0JUUttL'i M  !B{8j5QհmEuoGXdrrI]!B!VH뇔mKwɱ2'J Ԙ*;( td,tgӝ-I!CRTL횎PCTtUAj !BuKQTUEuIJW^v|gE$3338LNNR*ᥗ^"H088} q/ 7|ߦeY躜 !("#l/m QWw^ կC聢jEvEQF0Ww/58]hsSU*G6n5ֶ$l2О&3 *V*Č/D^#F&B!ĺ:|;vK/ܢbA>ǎT*-k?ah4صk=> tzY^a]DضMR. RB!un^-kJz}2ꖉ8^eHWϽP8Z,~ى o KsE;xIAJ*]UA԰tm$)*B!-]) )ccc4;_X1;;ˉ'```T*u)A"u]}d2(w,z655ӧyX,8ΒoÇ߅U !^O͖܏cTGOrݞC }"E#4xvjh߇'̏grys\16CmIך3җ 0brͫ]ҍ,LQ!BnJ<`ApG+˼ >"\ץ\.uV>Lkkmgdd .pY~_N-[~85 ^KVW__7ߤR0??4dX,afI&XE\^!Bud1.Y,: 7@xߘh#F^&9=|8$R4#^Bw(*^k!RaH * M83Q<GWUR @OLXabh 5crMME&'CB!b][\I0V,6Likkmkea6J%4MkKܱcNJQVq%_7Ξ={fLOOFgg'\/66zzzP(P(m!bXl È0[s?rMEW#6{~& 2ї1+FZFrk^z! ~}fc%F}No>gwu;MWVRp15 9/T\!B!2EQbݻ{nBT*akD!V(_{g֭| Ora2O楗^bbbX,Ɨez{{m!b#Jç^H #Bk̐sbgnϒsx7ל-Zw}.-sz|R#eilkK;`g\L\m3u74,C4 MA\1$>W!B,N裏yv"ˑN0 + q/W_%˳>KkkksVp.cǎ:t رc---Ŝ IDAT?<|G_Bk{D8~@ > /KzuXBZw^qE*0SwބX hf+iyDQ,*¦Md28qRVB!"pJã^ ۤ6_vj# @œʼW•lm=Ů :C)S Ub( tk*k*1%B!bPUxn&\ZuC}u]\וYB!EaP-\*/ݡw bzHQxƵSQ 0#.)a)cMYAW6NҒX9 S#3H[̥+N%B!6 4oo(Y0::??tT*EOOJ.79z(rX)ymR`6dK{Y"W(N388('Nٳtww:bG2<3<ßɟro\u J188Ƕm,ˢɓG?0w<}QZ[[m!bEQDF8~H9>u'@w.4x.m6f S$ťSQo91"ivPo Ʌ&-RUCW05072TTECꑙB!bCY,^;SQbmxU*bLMMQT#L2==iύ躎eYb1L$L*XY~طoǎŋ͑_"/"G%L( Z0 '?ɳ>˦Mm!b-T]^/CW .bV>Qb ^ B=䁜ZػLGq@ҖN:05TU ,.!B!hx8w:K" J./_R*epر]vL&) AhK_ttt~͛7d2躎ilٲzjJE$ z!:k6B 0 B*O񱽀@ +.4m{(m"'{j r<Vžޮ [zўoUd%Kt]Y54bBL)+"B!b N~N8ŋ uCgϞ)hEE:0(Ap7ߚ.Lm6zzz,a&O<lڴy("Ck.zzzq!>!Rw|*;?jrPJ聢EEzh^%p!THW积C |RJer 73 ЗMPɎ,َ~1#B܊*XW SWX B!bt].z~XO:114MM;>NgR>Mww7|W&BJur[b赢>QAsKF?ގ2@[=Q1Н"JYL~k(;9ޮUEߒbR8ZMU b 1!bI|B!AUUZZZHRDQDV^*bQ"C__D VT* }($I* SVoS4Jdb᭷ޢ%w~2<<0dwaB!XMqeۣ*w^eTF͞"9feݙC ="E'4hfرUYDb30k( QH6mԺmOرJ ѹ: s~\㓍l@EO"4F[Qиaj3&Wʡb=\!B!n(躎xa[[9rcǎQ,Q4bq<ϣX,\tFq~u]'vax[zG9|0+>Xi###G?ݏ3::o͛oIOOEB{XEaԝrCV{|h#F~Kr- 8MFc )~HUU"5kRc+Fj(|=5w͞ P߭ /`pi  (6kK2ؑI)ݡ(-䚺J욹 H|B!w0 O=.\X,umse^xE!H`YVyMh4͢~OX,6 e5g6 DQĦMbQG?_җVqB!Xma2WlW%6sGfn(@sKG^Ƭ ij]f(jTGHFݙb C`h#V^=?.v–օ(+ S#IY:gI[+B!u6/PTW^Wu[5zynJ:n>oYT Mp;E/^dll 0刺WA@raE!5\Pq|/6._קK1Kfg[ƚ?Kx%pox.fu  2(Bf. MV8>Zl? iMZ v۝eKkP3D~{ j**1 3EB!XA0>>N<'S.jE!JJ0 6 -[P(V q'rE322L斟{!B?aa_iBzzc|.]3Cf@|TQŬؘKqtch~>U"/(5+sqaOTqCS 6Rtۣ(kJ3"7ajR$)*B! 2M|>O6N'n?L2d||^xQ(BQ LQ]?́E4f q}k… DQ{G\淿Mu8quyrwaB!Sa!U{;\VͯAtyj@]JyfmUomED|sUsXgb![qvty'Ko>I{BW%FQ@WbBLnLW1u]SQs$Q+B!5R 0ryK>300O?͕+WA=4k2 iRVy7X,y7- ĺ{z}a8R3gr s=G,[ !4RݣE14bzۏ 82THio,ld۪s~/O34]X_2ٕ=]lnM/bRU0uL e M "B!b4ywxW-5ܵkג盏J%4IP f(m)ZE:&ˡ"ֿo|<3 (:ٷo'MuL&C{{;e2J!Xr+G  -<_G:WfB" RtB#Mo"Rn(@p}.|#QoylP% 8٭VK )5<~?QxsSU^Hkdww]Stec$L9oOU;BU,CTtUAj~#WB!yOh4$?s0M6//~ gLV?!Gi^VWW>,_җST~a~濳,ǎ'СC:tH8B!qQոr B\zAY ~&Il?eٕ!U'r8-۱s;Ϟ@ nv|7Fd;BnDL%NU8$M- ےqVV?Fi\]P9҅7?6@)P?`doLsRKAkKH *DSJ&n0br$>W!B ib ÐT*"qf9x F0 j>}G{qv>J.cnnjJRX,{ݽ{rxB˲hkkCu4]ǡT*q2m6 aB!:x=jN@qp=D vJ[@`fINaQFhFz>݇u>(&j=PBĊѼ*GC=IDe;@<ʜ(36oSw}`G=]vtI:R 7ubk蚂.#*"B!B%L&I&K>| . DO:i⋔e 0[;H088A댍199I*b޽ќZ.ȑ#\xyt]gϞ=<۷U!B(:5ǧ7{\/"OtP|HZ0+#J]!MtP<@0nz3hTi Ru7 6DoiFq~&qF%N9=^fX'fjtf<ГewWx3T?* PCStPI:FlHRB!bɖ-[+" ÐFOS(,ܥ(Jke2rZ !dtt'Klݺoۤfw0?8v/000@:B(f /{9z^z^`/cTF/.u /f m/v~7[ƚ?QBd]•^LRxW[<ҟKQKܚ$ML fhB!b iFKK ]]]ٳ|+ qe^ZEQf`Yuϩb=wAI&ESk꫄aiooVqYΜ9/~ >L__ڽ !b />U;C*^GQf%@uH3YzVnV`DjP,f)qnbR#klx747gh 4,]mvjR Bf !BEA4,ˢ.W^wmSO=O?MooZ/]RV9wB|>iJǹ|2[n3 j5?i~߲sN) !wuc?pS}^=}Ija(4S`I剢 97Y9&J6Қ؜=Û[HV&W_44UbFHB1T B4I|B!w("lƶfmEQqxg9s rX*r;_Tq淋q(ⳟ,_y%G+_Z-_!ذn@Q=("J w/,a(g,>5ϣyѥ%nUN&ciB B!aH^ԩSaHtvvǶm?OMR!˱~|3.\8k|!bC _˭HAt9~\Xc%.ԙ8hBG6 l'hKY\ײt7u,]:EUEϊ7!B!B܆(0 Q~pyl^lOEQPU{|2 Lf߂kb1*: C|o>^.9y$JB޽{f8eh4݉-B P= W_q?۹xfhʱ秪Bm)>ѓe=EQO\CS MЮD |VXB!6DQD\T*yz .p~i|e28|\.GKK*\elFь(J;vjX|늨B!X=aPTl_CWP뇜+,\ MOl@2 )o?(3T1LLG*X:B!b|gff'9sJBj52ڵ|>NRttt`YFj5* z JNձ*jI&l۶I}]{= 7 yfLӼ[.i4r9L\w Bܟn@>JAt,l+gj|0<%hOڒtfbXD1]%fj m!&WS5UωKsB!XŢ믿N2]יeddmFq4zTƄFQm=zӧO3;; )CCC\|sydmYtMp9ZQQ8rq](@WW6mT*L&1M]bڼȳ8{txxyyZ,]!oaD8^/+BtzSeK )/N_[`G{B=D4F2HYBZL\B!b,]]]dYLd߾}8q>`YSMӀcb\`Ν<],twwC.[֚XId~op)<;v੧z\zCֶVB!+A!ۣ8^H ;FUle~?YatNᓉ ӝf{GM-q1C3TF0ł|NX2ST!B;`]]]_%$ l޼ӧOE NPEQ8pCںFB!}7yAԜa!2atpeƩ ʌJW6Ɩ{{LӝK @k*6#r-CEU!jB!B,AVc||ZvݼOEQuvrM]]]>|QMG yMHd2wM[[mmmb.R)o-_'BSw}Uۗb 񂐙ëxkx#JgRH[|Wj iK'I 1B%W>B!D"AP… ?<uQ00 cI&R) E=4>###7}M t{'xe]۱X"R_\m3??/̱cE4ؾ};ԧغu+Μ9ѣG9rR(f8pz;w^zy饗d~~Fa&<Ȯ]B!Rq*ĝjhFh>\mmm$;^/kq`{ddӧO>{%_j4E~[o1<<|."fff(iZ[[8zu }I駟&LMB!60 9>#d|蝩>uJpa&8dՕ-R4tMU,Ø\S_B=+B!M(B*'dr㨪7Mlٲ +jF6%ٻغ3߳}Sb%/Nh&8dd04bb:o蛶E_EMK Od 'ı$[-[djNq瞥/(ޱ,-}E<'F^0 ,²۹}YxW㡇"377ǫz=6m=ˑ#G_dػw/wT*;_|b=s.,,[o?dffo~ݻ4ywy塇X.҆aH<gƍS.9~8?<ɓ'{ ADD??eR]7* %'4Sw{c@3%껝i@1I1m:ȝ\XLRU33anz="4K3 X,FKK e:u?ys)ܒѣG9|0KKK<3|_gOgg'ꫯrN>MOOT뎏saY_?CZ[[1 !2ǎ瞣Yd2 B&!JD<͛7s}ݿcnn7xx<\Qr7c!Zlzz>s%&|4]lB 8rN-AG:JVw0 btDP20 EIK41LLL|flٲ\P(0==8O=;wΝ;9z(?OP(뚦I4%`&""zΕ^2nZT>DjÇZ{< DeeL&qlDVՑ%""""ضMGGO<1Rjz4MWV/IZV9y$WE.#Ja6S}qFbKD4OTn,Gwr&''yz,عs'du?)'N`bbn߾7޲sS2+=~'E:mmmD"Gܭei"ssskZX,!tt:}1tL&s`6::Ӕe9|0dݻwk.rUa^UygEDD֎~HS5(}AaJbsesbB%wܑdc{;Ӵ$#X _wX5XݡE̱MCPUN3EEDDDDad2faVd2tuu8b3gF"r%Emϖ-[so W,qndDVzN H`ۗW8^ӌOY՚Ͻ\D'e;P_}U{9~ht:~~izzzb4K^Vq]!Xk4fބS%8=ϡS]pL])oi $"6~wLD&IDlKoD3EEDDDDpCj_gsZ1LĶm癛kW,j50l^)"4M,wky_߳ghGyR4Ǐ_\. Wo_->TjOQuCu-U\+;2U D m sljOҗs, CѨwd#Y&ebWMDV犈1X.|J*0 :A@R^ɓJ? ?M}o-]sBC=DMgYi%+|'8i^uM۶]W}YqF۹)Js~_o}v{챫E0lv~(! T\B Br`9vxX|;H0 [lH;͞rqs e1 p$Yɍ&\J"""""kL*bϞ=,..6#tWfaH <,---$+.6,܌7x}{BZ>{b1ǡR\@Xqwǖ8P! ! Nҗc]0 1T&4;VdP|H$xٶmR/*  3{:+###LMML&WDDDDd 64=fٰay F۶1 Z֜k۶mbl.t: _tSSS͟\.w{^)֮w5i^6h\q>~j bͣʂ ǹR*'g3P! CRQZ f'`kmwۻic8AĶ1XuH"""""?zNV{q2>><׿u_cXl6K&"k~J?g,..}}]R̟㭷?1'N-d޴immme{zzE:;;/+""S(̗\m6x /Ӓ50v"NLLӟy?6nHKK e]t~KK > _ͷ-瞛]8ws2>(r1~!lݺ9_7ٟow?< Wlڴ 08{,/jgy 64Ü>}|>O___s\.3>>Α#G8txo}[@DDV0 J\ z`tə"L.wA$;כa5AG:c;t3 -x" 2MY{@dLQu"}vz){=&''9}4j>%q76 e +y7yW!JaYX =re333 cyƻr^^{5&''/?|Kݻ~/3;;yLNN2>>ξ}H[[E+$SSSs|!b6ړ dͰ+}CPLXȵLIJV `G pvI\^yHxWDDDD.eY1_ׯ˳\.r!տW7yfoo8C&annsα@:l^S*ennL&sK#qs]۶m۶mc:;;dxxrr9o~]{- C0B*GS7E5~@1qzщ</PvI6'ґdx $=T[ ,BLg||LӤVL$J5g~Z`۶m 333sCkmme*e$6mԩS;WDDDDd1MyƘ㥗^V]24<> Pl7RVohmH$T~|f֭1 J$###{;v>}E*""ZajG]˕k!ω"Ǧ)1THF,vt'=rAT4&E̱&ԸP|Ⱥo/cYX3h4xL$!ne'ԩSWСC;w~H$T*&&&gbb͛7/~'x;|"""7\?kt}Z\.i^ZeQ(TQTDDD20B\ϧT)=*n{PvW95[gKԼC_.ζ96uHD,L]^,6  XD6+"sEDDDDֱH$B,<&&&YbDI&rɱHT*E:ZH亣wEDDDֻЀbAQ@ѫYi֙85W%Ηp\)veЖ;#br׃msLmM+"sEDDDDֱX,F<o~o0>>N,ؾ>~aynQDDDdY)5Sj j^kuBϗ86U<s,wѓf'ýY ۺXcؖA,bp,2," 犈cFONNh4.*0 RD4 \muH$rݳHEDDD֫0rAڠ\Qs赫g /2[Вp֙ɡ.6whMFNT!qT;@"""""w/}K8pK>f333T*(}}}DEDDDV/7r+O z Xk02[d3%Ɨ*>ٸ4CvIlL͖\ c9&7XcLl\HKK lݺ7 };k;/C*0]uLrq6%՟eGWl 0T0[ <34X#P)*""""b1dvvz;>]e||Çc~i,̰<0 4LF"""AH`!b赩{*/g-Db%wp` m:C<Ӏx"IEmls+TDd5LQu,Hi&z!^x?gOP`tt}o6h;au/PA* -q|K l dѝ/%`]L΅P$b8cUD"""""X$!^|E>CΟ?OKK X}ߧR>i2>>ίk$db8J%<\._TM&dY"J&""/?ZçX(>mZ+7g2TÉǦ -uLSrqv0Ƕt3Zd`˸kwLLEdLQuβ,8aWU~~ݝzg/忤RDO?m7/xA6%.eaY}zƄa$/ Ge|| Xlڵ}kl߾"""K(,\~HkrX/?\N 8%D]^ 2!HGRQ4PADV;犈eZZZظq#|V>H|>yDQhkkRPׁ|d2IKK \>Y#|ߧhraΟ?OR!NV,..o3::ʱcx'xqGw0 B*G> 5>srę2:˱+ņ$m(Tm1M9 "Dl 2Q5`j\ay8}v>#$>`qqw}._W>S5(s)~s!:twwN"R0??cccKj5l–-[hmmg"""Pp=R  X6X2rĻ/U>--qvx`\Lܹۖd`M±:˅mBEd-Q|:{-lۦw_gqq3g+}݇eYjHӷd㭷u]}Qo>ۛ0d~~zǼtvv*mqjB녨 5Ɨ842ϱu--<)h5` ڤc6ɨWDDDDdsT*uMwqI"cpp0~+({ajj"f>gСC?S6oLkk+\liilK9¡Cx'zUoT\bAU,P586gLjtӓa'æ]h 朵2 IYJ17ofS40 /G{5+vvvnDD.\-=5jW{g/97_%̕XRu}ڒ6'՗eS{\؅~/\ 1"Xmb[&EdLQ"˲ >|_LOObHl۶GyNoYV\.0z "Dq.{|ѠZ211AVcxx\.9ZDDփ^RV]_qWgrz-Q{X$[:R dϒ;DlNo[im8A6IDlb\uzNQLeL&_d2Iww7*7 ~266lW*xwEDd=>jBbU^R'st"b dbCkt'Cw&50ӱܸ\h\aR)6l0|ǎci&6euVΜ9?￟;vC"Z299ɉ'8|0 lݺ^裏.YL&y^6J7Pw蕄aH1X<M[TillO2ԓaGw8xKUo%&7;Q"rST1"rQ|-YV:FM??۷q{ntf=z|>:gϞe֭L&?dƍrQ=zٵo144yrA!O(4P0W3Xt& -V01hKEЖ`'˽Zؖ憮veX&Q$YQL+"""""u---122rKH$fR[yǎ} Ð{Gbsa5 C0l322ӧy篸-[TAHX> 2X,zd7,0XDmt/m`ߦ6zs1lD4 ꘤cM̶+"sEDDDD^xӧO_ p]FAX8D"[a/w[y===|߼Y""7aH)=u T '|0gl\% Cvٝf'@kTRjf\ ;q\ɵMl䊈4)>WDDDDdmD"Akk+RVY\\$7Y\\N,9ѯ/^__wne]Y; g.D^p*>jBc]jٸÖf7QTAmL4+16qg96W+""""E"سgo8wcx뭷T*>D:a`6mD"A&5dug-ky[j  ~١ad_fbJП?ˁ{HEmTS[LI:nD+"TY"|䣏>׿5E===K^X,F6S]r 4U[* C zjWA ~BtSN͖WL{{3N=Eo6F̱0U][ "I>ɍ]ɍ)&WDh]{6<;vp255uk8dYqװ,d2I*¶j#"""˝KZ+Wv=>)dz?X\ޞ _νY Ke@1IQœ;+GWDDDDD2Ht:M.l6 J֫?~#GkVOR<<'{0 ;vOf9q?;yaw.*拈ݧqF iPq}>.plKUj t CvƚQu.mw,E1X&\%"r+"""""Nl6{]ϛٳA@,4\nv}ϕcbb'?΁H&LLLӟ nh]0x'T a~@S{ +7 fKu7GEf 5RQ ٝ=Uw*cp!&2X1Mܱ-EDnsEDDDD䦔eDZ, ^16 fY]JsaxC+Cj rjve!/3 ~EQ={ʭ*!P{ ij*/12[blJ ݟeKG阃U4 r!&7ڊ]+""""r}bHT^gbbbi8C$u]"zy\Rw孷bbbur~;e;#YKV~H} AR|K.ʜ." e lMm vtTcmZ$1RZD6R|]"ݴŰ tTl6{];! Q5^ fdw-rvDl\/`?@kBQi#brED>O """"r;w;AFy{-k-..d%^x}l&˅ع986mb߾}l߾T*ii-;OY=>#~򓟰sNvɎ; ĉ|G?~za""r'x~@)<*O )UgP<ǧ/3Wrql8C=vtЖ-6UgBcm&\ϋ"""""w!u) 8q>_⽱%Wh-qvvg՗ec[cȶ :ABA4*&WDLQ\WW7oDr:uQ*l7288,_J%z{{okS(ٹs'Bẞ7>>αcq""r4bm9.١r;y<q4#ܑR *c]ėcrSȝ"""""w9˲ms,[8w{% C"b0 7 C2 ;;wur\B%@Ћ NNNϕO!t"ӓkC] &#:(&WDdmP|]b%~0'oF,#fq]h4JVcffiL&sٯBOOmmmro.C^{_3yz'OyG켭{'B~@Zu}D? FΗ8>UL F@K"4;3lL'z)&WDdQ]4M2 eňuR%*drrr|q=wyᇛ{EoddzqZ% Cj"m&ɰ{n|Izzz>-!AR*GQkʡ#(̢i8C.۶?{g}yJ,Y2>b ؀14)@&ML3ЙtڿomIMiHЄ@!8$! Y> YZiW{RplcHm] }߷m ^K/6!aeףlە,?qSc3o 3UKSYݖd]k 1t!.B; !B!(b1mFkk+Eja1w8۷7|>mKrba]ǖe֭[&B܁ l6?hrƔ+9 NW8|a&D E{:4[S΁#1BqgB!bq,l0p]gϲgRq###:V5%j›Mbr'3EB!"c=}v~_P(p~mvA{{;Hd w/nBѣGy뭷'BqÐ 8ŪGp<!0]v0U {M1xIg}5-I盛9!1bAILB,/+B!XJ@UUV\?LOO1ccc{nQ.I&xG&!wR{RoG!uDkBqCZ!eIN=UQhJZlm`kWlCאХ!1BH|B!bѨa(B4%N8h4ʣ>J1<<o'fӦMlڴi @ A>A,VBS)EۣDlgpt%F 6uQ6Xך!F644$f\!X$>W!Bd8;v`ݺuSNqQV^M*Bq qQ~{#2UvW(`EG:jcU64$,Uo7 !B!B,X,FWWmmmlܸ\.yDQz{B!(B*OPq}\WC/ B݀#yqGQ"=u< m"$&W!H|B!bN2DQ8i^vL\P(P,<0 4 UU]B!-Blקh{Z\HA`|% (18]4%#l=EwcQSCU+fɍ+˖ !B!aE-u]JRJ9p###bǎرcv/n4ihh֥ގB°6#Ÿ\eeghsfȱOSq|L]'`usul#a^$&W!ć\!B!JB>X,oTU˲Z+ Cؽ{7.\\.sQFGGI&DѹضK/Ja .vB\R-T\ U#͡5U/\ě'8>,n 0>c˓~|u[ M) CSR͡ C#\!'B!B,ݴ299,MӤ/}K 066Ʊc4M8477ܺJ0gΜD"iWqsy/ٳgX,>P+' eǎY:BE!P=JG ] ?(72ñbpp .KccB!_B(T]Ue>:tDЅi8>XԮMG}{:ϙ3gxxw8~8?яxYzB\?vke6;tDmgpbWhx|hKG-$+4%-"&E(`jcrKcrUBH|B!⦉blݺl6WK) RV;vP(zj{9>Z[[opC.ڵ{GBq0$*OxAr  竜/reUTԠ.ʪ[H.O g6&67T%fD ]7 !X+B!R0>>NRXD"A$汪NYnW=<" E;4m۶SOW/jnnfΝ ]IR &''.Q(HR;B;K)Tkq~.cEn$E#B4UaMsW6fX.P$,!1B!n)*B! HŪU>WTP(\u]XR`Yuuui*.SWWƍpw歷bÆ d+?>>Ή'ؽ{7\7No0cTiw\CyΎ9?UaQ5QGOct殅1\SW1TBqsI|B!ݐ2 4(R`)U(=qֵoE=騁eZ-&WT,]#fiD K\!KCsB!s X,RVweʕXyŵe8X:hT w}YOSokڵkP(ӧ sN}YZZZ,& C0q *S`AC/$@QpKQqe[ *>5΁ L񂐈ґɲ5E[:T ]!y1&7fj K1!˚ !B!ZA4scx3gllr|388믿 olld͚5]#?XzHyZZZصkSSS߿eqtwwO}V"RB< 0r C@+Q8>2 Ð3pt&KLLM7cCk5-IVdbM VT1kQSTtMEB!n+B!jŨg~lq:;;1M]vq1J.~֯_g?Y)!t]'H#Nb>}Q*\r" ]wO?ƍr3UW!B뺌s;9y$GG!,~mmm:Jl۶[2>>0sh+VFcc#ai2ML?wǸe?6ymM ׀eY|坳۟J&f]<2Cg}SWQVR04,B!@sB!@-v.\ץc6'O>qF?J333ض}׍D"$Ib%4 0>9[a455H$hmmj7g;JceIbDžpg+Dk>>"i*k VÅaH2Ɗsnht5Yݜ`}kLe"\T54"&1B!na+B!L4zq8x 㸮KRR\q]TUG__\fz!> q a}D""ȇv02207oa!ĝ+p:GkW-f7ζ9XDW&TP/۞LcP G*! K3wձ5K1t(Jjh*8;4bbr*V'EQ!B!Yźuf_N>kF* (˼;LMMňDj7g=u] dtwwb L4͛2T\_?Cyyy{x饗ȿۿ|fw*K)fj]zeV ŻËoT銋,nciKGIFu4)-THXI nihBAdB!,ˢ UUyxw9pU󘙙aΝ<쳴LLL͎F)J8p6::: ybj:;ujbx]P%3Es(n455|3Z^X__>B^{ݻw366vɚٸF>^w<|ߗa!/$0Bή~@-O8x~3 K!FOcVӓӘ)-]UеZTnԈ[:QBq\!B!i*a\늢*444\AƻÇLkt>У,vJ|3o'~Ru}Npb"m#w5%hOGIF tU?*EKWkQcrM]E87TB; !B YEGGԧ8x ϟ_UX,ƶmظq#mCz-9B.bWݻwsС'O`ppݻw3==}A`6B={[l!,<ömX,( ht:M[[T UUFb۵~iLcc#y~0wCu̙3k׮ j7UU塇cŊ ?۶{?Cu:;;y?ϽދeY'N`׮]?fll0 f|ӟfΝl۶SSS>|7xcǎ3>>N,5kظ`@\?`v)T<*OB1ʟAGzB~jV2{MSLW\/ V6y;C= V^]HDtRRhBqG\!B!"dGGD\.JH&ar9q]wQ_W,GyH$2_XnV\yյ:HVV^O}}Ͷm>̷-^O̻Sfjj~s1z{{y衇P1y&''D"̝9|0"K<u]&''9}4S?SUg !n}A!%ۣd{T\ .:.;P}nh^У8v-[Y$յ}2<]`SE&.QC!tfbcކy+1u55"HwB; !B  IDATL)o|)78)O~ wؾ}%sjɓ'ټy3[la֭W]*aDhoo'D?1[la۶m} سgr~B,o^UgQv|<{s~jf=jYij@n~5c٥8!0Uv8+srt=O16c!qk[lИxQ 誂qqnhԈ:bBM!B!8JU*8vo&Wf͚5DQ8]]];KaÆ [nq"رclݺ[r_ȩ( Cw^ 'g>3Wd$OO߿g;. ./Ny'x抩۶mc||7x_|M6]իW4MCӴsްa> 7/KɤEMUBեPq Kg~P`&d7QͬC氦Ϡ9(opV[5Bͻ9qfhB[]{+MWCCSD׏UN]k1rYB,7RB!B̛89s0<<|CQV9<ɟ ;v젾Mӈb޵X ŽYwu_Whll0,1֬YCGGtzfyf ~25333p96lD"֭_~a dx>NZ] #X`{E67v}PT5wP5$ݱ3Y9:T %f(Bg}m)ֶnMZXz{DCStkXqqn\S!ˑB!B[X䷿-w) y7|ߧZ>L6]yG/|Tbbbqb֭[CCCyVZE&;9E6… }hiǙˎꢽ}|>?hޛw-h°6# n@f΋_. p™"93^LzQjJpOglI RT] :1K+ !˙B!B[Tb``;VX1pa-.ddd?}k^T*~dUUd2DQ嘜$ C2 Ld2444( SSSLNN[V"!D?i!MzLգW AH~9 婺1Sgkw=̰9EDGeh*1S.j`&1B!,B!B[aH$rĊu]ǹz!č (9eۧzm)T9;^`'K Tֺ(8w.BP zC4UkЈa*t !#B!B릪*HX,vEn^/,A`6r۶okzXu⼮먪mՊͭbg;]׽fupp{ꫯH$Xf oddA`BmW!Bضmskq]D"O?M&\.y`YHDH~_/sqOby ٳ^zGta8WB,0Q2Vv<ΌQNt`uSnIz4M!j1SUB!AsB!@co>1. k:uSN`Y+WGf&EeYĶm|ߧMeͭRD8sݰW؅ZO~(?\/mc{,AHrv'f8+S}mIqWSLDDǐn*`*1C#bjDtCWUUbrBy\!B!Pq89990dzz_|W^y .|oll^XRq[J2J$XE.x9R8d2b絞3H( Rbx1bˎI:~Ν;G[[=7n$GV*w;B\* k3B][r"}&\.$V0~:r*?yyv17t4MblLƅ!خt٥h{8^rVu~7ξ)Fgl\? jjxlu#tiHXzǷUK&LPkK1!6$B!B,suuu|cݻwk{TU,[neŊ7bBllۦ]vq96m-VCC۷o'HtS^G~FGGT*D"E!sYƈFl޼k>g*9u<%ǜ:uZ[[inn&J}mjj3gCc>ի?RD7ry8< J}|66oLoo%ѵoo~oGGs___x7 r!|Mb_[788[o׿uٶmu]N:5wi$IH$:!-!ZT=ʎo4_i~7ČM (HcuI$*:) B2btJLBdB!})o_~2A<)t]' Y*O__yyᇁZˇ__W|_]h,{_*{̙3|_' C `<<~lۦX,2==8Ev/XѪ3Vrlɱ"%FUTVdlh+dIEt4,k**1B!BH !B!n٢ɓ'{xG)Ab&HQ;Egg[|;AUU6oO?͎;5 +D鹮uW__Aww7>,uuu۷ϣiMMM]'|իW_v3[bY---|-rJz)2 o6SSSaHKK ۷og˖-tww_lYܹs뺗u]<ϻ7.C ʎO(WQsG (T<++\ S*O]Ԡ=aM6&U%Rл"T]StŘ\PQf!!B8B!B, V477s~5ApqL&b>---D""x\n8FDhmmy:LӴ=SIuŲ,4M CS~,B+B!XReJk!\7߿RtŢ( mc6aRVm]ٴi]7g>X,FXQiu?i?0 )t ‹ݡקdT\˯ xLJ (1<] &ZSlhPYg4 *U $TMXv]/喭8nh5_w9P0tQʵtSW1ZATެ%B,> B!mTUN8??STR}BX8ϟ'_jEsȑ>r&''ijj²E߷bÐ ^,l[^?#fC26SdSa쒊lgK퓻IQ4ǰSŎǨ4M`&m稪 QC%nD ]\!f\!B!-i6vRǏYf\0 4Z4:{|Y0s (r99BlذT*u3.X&9]q(Vk6[>>\I!l`SGS/M7յBjoSv}ʶG piAths.W` q8S4&hOGIBu (wg QB3kT08S4U!jbr#k*1B!Ē\!B!-\.o>^yK: =cjj m4 W_u=>(r]]]su]gddH$B:kEAUUt][ s7.B |G8+AH,9/qls9*XM-Ž+IFtL%@u Dr'LC j+~;jNBL~ItMT,]%fiLKW*B"(*B!eN8o[zzzHR躎mۨʹs( r9 [X& økc%VTUE$X,w^Μ9áCoSNQT(J>}__QQ.r _Qw :W__71MS"rυQ3B(BbzRS9q@AQ|gvvz8y dRwP7np卸7nyeddw^f.]DІR^H+:ݡ4?,]®/~ĈRKczUʭj۾"c8fFKͮ2ybD˰o ǁc=r Rb;E+?=@hg0:-^Jziw[!#6I:&i"X$l21 \KKK3y;edl6 }}}E^~eN:8wt(T*p%|ߧGc̙3>}+WH;LӤݻwsaqam<'m /h!f{~D;v-d$;fؼKéy"7BPitfV9?i6;ioж<{ry[_Wc%LME(~~ ihv' [/4Q՞v-2 TwV\&''կ~EOOm>(JyuZm+H0::7 &&&C(l6}e àlk׮b|yQ}8ƲU^$*o6?<{,+UYm6vTV##7 F!w ,fqvv/0Sj )o+~Ik;bX"Q=߼kd6M¶Lݱ"""S||i/^=w1AEQ׹p333uD"ݻ*QtA333bO<ݺޑ*_Oɓ\z!N88CCCѺ177Dž x뭷W^a||Ç388W"qS IDAT"`3BAHnj(A6[n`~v;:2C"=;=4\Cy ՗a{Wca[w8ymGz?lD鮋~vq*OOlZxYA6II"ᘸP-O"""""=|ghh^y0dyyɓLOOcǎ:mtwwEOtww3>>;CV#r1L7o~˗I5sqqZ۶M&YqHӟŒT*8p08w (JKLLLt<<=7-حرcݻ 4 ]8P(`YMٖea&w^Ο?뛰ryQDԼC 6B[T$h/]| j8*?pW\=;2L0Lb&0mb;#b%tCpe0 RM5I:ZgyVEDDdKLQڅT*EOOXXXTd\|-ds7p=ϣZ7i6LMM#Rg9XR{˧OR!ۋiw[,) T*O(#^H-{3 <|1'v2p%0 FS9p$ֽ. x܏3vgk لQfDaq~O&*{ل~}>l299ɕ+W+N8AOO]dw\4Ml&;*&Oض}w;D䁷^-}̀CZ ]9iZ]xAB'*c?h#2< 9< bS<їOdqmAnTmO:d6)4 tDDD:sEDDDDhE7nܴ+o~~\vmV>+++˷|mEd2I?\EEۗJevvS*f}zŋettt:}W-"M?Z!-? ㇺ fe?[!7JD4[>wr)"]qȘyC=J&rnK,EұH9& ±̍nZ3Π\044D__7K) M/...r9:ānڱ++++꫔J%Onª{zSN/{nd2SXXX`bbuqzzz62D v1ZC573`P9H^e~qk NE#enbLFE3M"裄vҲzfЎɵ-mNؤ]mbwyΪl  i-RܷA"lD"eYDQĵk(J8q'Nc(V1<<4bb״Z-gMRFCCC<\twyk׮}'N~ \p7|_sA}Y7*D^ÈP0]Ff;s= ~;+M.>9=Fcqf/b)"I6erǬȃM"""""mT*a?3===8aq ZT*EWW-;{zz(u,Dy\r .t˵suvn?=,ԩS7̙3tuuH$2rrqu<(#~HՎm!QDD^BŹU.Ζ\0ߊ1l]ÅY%'&B^nTvV M\6vATݡ"""M"""""I&ڵׯk}4M,lSVW^߲4U2 L~۶1M7nl6 ˲H&r9=3<÷mƴ-0񂈆Rm4 R}X{̔a{S%&jxEwa[ᑢb.~ Dw ئk$L&67T;DDDdsEDDDD䁓Ny'ַ-" Cfff?VLMMdя~M7NR%Wݻygx78{,SSS4 ]8q۷յɫ-bjrݧQgF߇w&y2*44'm=ː 6e`facMʵ3C7{a"""Q<$дm0 I$ ׮]^gffV8C6ŲdYreanqg#.7Ns*Al6KXdppP\E"]u/AY8ngK ,8;S& ?d{w=Yʳa0"ژxӀcrLREb32 uM7{Tjy|gaaa8f&k p&''7QމzիWq_|Jz0O<'N=87{)"r] f6jwXT.DTj s>.sz0I;{sh[CeYc8I&av-RN}Ϣ"""""rA2X,rU~ӟNY^^T*}汎wN:*_d,Hq" `YAh4(J]bꭐJӧ NTi\…yިs1YCyg'MWV1RI.OXZm)*"""""eYtwwsq^u^{58jQV?|>s=i6_h ?ɓZ-cǡZo />i\|/ru}8q]bgϞ=^|^Cj^@ӏ΋Rb s./T\ṯ/hOLƱ^ű N+4XmۦGEDDDD侳,~sh4hZLMM àP(`Ya~5twww^Ν;G 1::JE\|ŋ<__SSS|k:u?G˲c9r}k:t1@"(?i!V@F bdbe.̮Xmt, Ive9:ž,|ckQI5I6P+"""""&ϓdVa!z/eYx yWu]:ΝR{m۶ݗ5=(g?;#yqiEWWWdjj[ / +k!Vk%~M}<@wYz -mȗ\4mbVCƲ,ؿ?NK:&0 cC1ܗ5=x9y$ 3>>D󘝝ŋ[LNN+0>>Σ>&_8 ׎m!Nv /B?SuJu480T`|0ϾۻSd\\Tw6I)MLSݡ""")>WDDDDD:V6+ .W 3 ++`;{%&^L I&avma*""""""""%u&tׯSՈOoȻK:&NEGFF63MscV7}'l45[Nd35զj# b vr㽩pˋU~@>;{86 IRgǘAڵȧ2m)JXDDDZ4M}]Μ9 P.}E۷sፎ;8bbx7/kR###q-gBZ׹x"|"|9~Cj^HiAؙVR]*.֘-7 |ys2ON,] M)µMSݡ"""ri<2/*iNiZax7MFFF*twwcos)^z%vE?lnA@Vcaa N:E^s_Eފ0 ZAøq#[mquʻ+aj3rݗaw_ƺӗ%1UlLI6av-EDDD犈'"("J {2==M^ih*P(|hys,g˼;xg8q'cr/orA}Y72D:BF@QCEkCLy{bJעrc]<CyRmzw(d6MƵ1M\ u&''Vtuud>fyܸqccT|>O6g[|{4MN>ͯkΜ9CwwFy0774_Ww?NQ{(? {! /GQD+M&o`̇5K *\ʳ/pWlT, ܈M:ebF|eY vӧx"DFիW'? RFA4OO8vؽ L&C&駟ƶm,ƍ\rfkYd\.ѣGygؘ6E\?hZwhЙEAQCXpvfw'Whe0V̰ ǡWDDDDD(\\.q!\47U_~eΞ=KV4??ȑ#E8{,|~oN>etOD6kNF1^\m1\烙U\/3Sn`ŬXOۻ88\`+٘ip\ݡ""""2犈P(022B__A¥Kx'8v]]]{|>}X̛oɏ~#?s=ǿw "[C 4}Vawdg:/Y8yqwV)5񂈄c2\H}}b Zo>4H:&CڵI&R."""["""""+ |\r(}~vE*T*EP UDža17Զ-? iQY 0T|sLިTY?c'M_.A1;!jCӮMʱH&ebR,"""[f}7nlW u]ŋJ%0LNN233ss:tGVGDbH"쥈tABj^@tpwh)7|V?]2*8Vq/Ñ.m+/QkQkL:ވ֤"""""r!!/"Оs{tn 7ߤll69s o&JnI;44D}0pqnkf|l6˞={h4,..nrDzZ1ix!^ul1tbř%~saJj]$I.b6AƵ4vA4ȧҮc**WDDD6emd2ٳ~~j/"zfI\&c~m6Աl|>sqLEͱ@^u]Tw]0<<__ӧOo~f/M1A^HiQGwJ s.WpLA <2g@ IvgD l Z\cnD;TDDD6犈mf|[,..2==_뾼w&[̙3_7>H$ضm;viQ0>;1"2|MU 2 vq&&&'x vI*¶#ާlQ^CvQ :1~Sm̯6P.թ|IB9HOTetLIca[!,"""犈m3M|>O*bhhL&C..m`GQDVcvv˲A077|(_+عs'Ln^F*˜9s\.4˯~+vΝ;$ɛ!ggel aS z+uU^g+TZ>QӓqH'v7#;3fZK\4""""#犈, ˲pt:_i$I4ih4hZK/QՈEJ)<ȓO>qsz{{W0==OSVVVX^^RppntÇ(*& IDATbbh i! "c:VU.VXeԠ9s1THO9FgG&cr-kXCEDD\RL$J,ꫯR(H=EF0 I&twwX\\^СCr9E8 Ð\.G.cllSq1~#*M=4+-ywr sHwў4_f|0GO6aَ$,2Qwhy)>WDDDDD۶^czzX^^? N9}gzz?a>fe|My-4Mm&Gy_˗:ǡCjDvTnSiԽ(P\eޚX ˀC9ёn2 2;>ֵL2 B3t%"""r(>WDDDDDq( o9z(O /i 2::zsN[R.vryZ*vz꺯Q[Mww7ǎ47R~DQ'CTRU>\2\T)Fܖgw_]iNHlCӮMҵHڦrEDD(*"""""[i222Baiwt>qb׮]={gbY籴īᅬ8:zzl6aJHR -%b(cꭀRktr-4b~HqFse޹BcC]Ivf88\X7CVLl$a]lƵLlξO< 4STDDDDD$۶q]ތi y*aR*(0::J28u]$=== ߕu|FZ ;;*#fJ ^\[ b80cµ-2 pmB!ItLQxiJ8v<y \v 0p]D"qgllt:뺛x"v4n iZTnHѱ8{!s&V8WaFJ 4[2>g@}.ɵNlLH)'i[Q""""L2IӤi s1{=Ξ=Z#:XDDDf+"""""[V&a``]=|L&CEeYXuWSD:GDŽQLk-*aD}8cRbL,ՙ[mBF{q`0ǎ $iNHӄcvQ ±LLu|sEDDDDdJ<#?~^ziQ?>Rr̡CfJdmNDvGaDy!V;*ӟ[j+`t˜)qmxt{G80ǵM-YcI6avmNF犈Ȗ.۶mcϞ=EQ~:Νc~~~EV d8<!H*"qLˏ(7|j/ౡP[ \[iP{aP><:PW|:{?+m[-qƿj5y~_l6q0ZiWDDDDDǏs:رi4-6<9z(z˲,rT^^lA~Qk>ZghC7M%V> "WDDDDDd2ɾ}LTbvv_r Z===|3J)"_XExAD i!M?D*VlUP7-Ş 1ZLS$-ֻCSʵM١ڷ{+"""""[8twwS(6A}]gyCmREd( C̀VvzV. " +u.UxkbJ ?$I1>牝=f 2L2H8&GQ*SÇ "jz0 oyN4Id2,˺/!"(nC+̀j+Pg J'y .Uia0\H"_b'C11;86ev^\yK.#LjxyG! CJ:׮]hYebLA0ܕbWoCܡBlyZ14ڤ\cb&*""""B3EEDDDD䡓J8p T*LMM122B&qM^l8 ÈRm4?T%tg.<.U`fVÈms_^XK,l$d6MPͦ"""""aHu]lۦf!zyvE"e"!b*MJ3Dq?Ro\^>\Xm]i9tbbűM:gt, iLBQ""""犈Ȧ<7:9?mA@T*jS.$ɰsNml6K6yvu/EDx B^O+hG!bV>7jpyu*̀kqh`=Yvf%m˾LҎEj-*7i8a;TDDDA\8&"癟VqeH$H&h4h4LLL/裏u@D8ވʭB^; ] #h`)[ QD+QQe>)3± s v3PBsm~s'L4p\&㶣r;>l. CJ?O8y$}ZWL?O>+A VaE홢8©0U"'KU ms N^\Եs-0"XlI}^/ı -l!ν""""[sEDDDD例}xgn4M!HyT*._omۘy@D/hG!-?;tS&r{i F[ ?Jg?7IQbK .UQFEnj?c@bl#"- a)"X+"""""]x*{駟fxxs,d2I&arrZF\X,rh4 Dd+0jG6vLnC[ 5Bӯ+䮿*aޝ=u>iFI#ٲdG87c'qR) E\*PTRd%رk_FH}}=.ƚX3zTͅ?L{yMh:NBa `$ 5\}98tϱh9}>5ʶ5fEؖ]X&\ADDDdR|ZZFj5 Aioo{XE,#LR*bqJwP(篺a88*YAHXЋZ!ZN~ĻA# /Ycu"џ`gM|㝑f5A}-1>'6vҖpf <ۤ%l<ۢ oȊ\(" CǙP(PT*mO<\w}oo/%CA[T!AzC}ͮ]u+,|A2-?(ZWz@BC8i9%3D?)f4p!r$L8h6]);"M sHzcbw'DDDDV;*":|[OӧOzK{EN>,Cq:::dppPѹ"+\E4¥bhXɭ!AxW#^Ĭ1^%rX 7QCzNGqd>IyvSvEyiTmbFH"""""rq`qq۶Vy{zl63==MGG_җhmm4ͫ.tZQ,"JR-D4k8_:6,|`QqϚyJބ9Iҵ]\IJ+""")>WDDDDD:˲hmmexxz7xㆻq.0 -[dXn"rwVZ#u~B=A-Okaq*p AN}̑y|<΃(i2A-E&iZ&q",Eze;TDDDdj</\,~੧"qy333LNN{Q,1 41MJ###ܹKA@VcjjJayt.RMgfYVK]N/۳T*1;;KTT*QTT*DuoQTlF@P6(C*WRw,xX Y9X7&a1(O[PT[6SK#ZaHXk\tƳ-)"""":(>WDDDDD:0p]͛7nݺMm>Dgr)Ν;Ǒ#G#8\ovZl{z0bq6J4/2o6###ضM?;wk_;v츩Bcx뭷~ Q?3ٳg)J< [lv]FPBr:jJ=$z- |s028:TpIRc/[y,5L"^B-)Dm ۤ}c+*WDDD(>WDDDDD}[E,#Lftvvo---XETԩS9r .099,\زe [n%NUVȑ#;gϞq^x /a0??s=wÝ~C֭[#188HKK'?ZRimmevvyjaޑ{q 0brZHP" ((T/9:diQfuOs`yN#K $Ŏ}I:L0TQIGر}sT*<ȅ xw1 ݻwH$n(~yffgDQ /͛1 'N+]R,D"Aoo/D۶YXXqڍ0!jR-RobÈzPqȃ_B h;lE-4l ʸQNzBSz>M-9oe;&)!Zؖ憊4#EEDDDDdŊ;v,\.ٳgٿ?j܄HRXm4(Vbr,j32G/S8IGM<ҟ?0VyB'A#E53D&-9O0 Y|ocjm"""""b]8ˏaH__CCC=zi֭[G__eih;}4SSS 100@WWb===<|{cjjzݢhP`rrSNsϱm64bӃ>ȉ'|d2axGWWi6Z#dTR~+WEaqnG'r+1P ؝bKw 1"p('1 /T ] ٖo=c9&Pf"""""뺗=>d>G}tStuunݺxSY2zT*uY⿑}qrzX<}X,' Aa^xRC=/32tAўtғbSW Iֶʼn9:^iXݥ߱p,KQ ʍ%K~& C,oMO\.>a,O}۷/O%NEww7#?v%ȟk|[_s>wx7d2dY* GT*I*bӦMXYYAd{gw~ѹFmmٍlwL&"eL!Yئ|ADDDD犈Ȫe~zr'O;viؾ};.\ĉ8q۶I$* CCC<|c'&&1:: b*dN֭[׿uEWRlǧ)00gKO)6t&L$ܥ/b4Siw-Q,ˢ'xlٲbLOO۶m^_VL&lܸ/| ;0??OEgv%V (Jy2i2<<|Z%/G/"0"[3XtG83[[ 9`{߱h`[moMwDDDDS|4 qXf 79~88###8q??G!N/FSԽ>m|ߧ|_hKqЮ^uns=Ǟ={j^q-[~z^zeYyW, 45M۶\!0Xm3s|8za@:P;ZЙw,l9cl2120+""""wsEDDDDI&aƍ<;wA@GG֭[.vyYGߦD"A"<1EQDLd˜)rt""e :}-1:lM#Io'Mi&r}ijM CQ""""r(>WDDDDDaXEKK O>$mmm߿G֭[I$^DnH=)V,jqB/c1g[_-lVuEXRTnܵH<Ķ+"""""MqIӤR)8~+~_i&4k׮}uu+uOy4%f 5j4Oo-NkŵM6 Mڷ96e4}{C"""""Ҵ\ץ͛7SOq1(˴裏qFbؽ>UabΙ"&svDm: wؕd=A³qXA[ʍ&ma%n|[T8|dllwy{XEoo"rFR+ѹEL-Tldž$he;EWkyiXm9$\2>A3EEDDDD陦IKK T.~i2ݤ{}z"r).,y{dcYf5jAHµXߑlKӖ8*I?z&)!X٬7BDDDD )*"""""^TP(PV6\u]|WG t<ǧΕX(0 ض& 'hOtC,MEܱ Z n{!""""犈Ȫ!J_=z>6L#sNǹg)"_$/u&s~5,gfָKOg`+fX4/"06 |"ZcebuDDDD\k*|l6{sJB@(";p <:6N344D|DdeP Z@@{Ok3i\i#b$IcZo+"""""waβ~&&&.[W\.߶Ð|>υ _uQ-wڶ88C:&L޶Tk0pl"ωgfLf+@[i6u'lOНq,*CEܵCEDDD>\LӤ͛7o wB:fڵ]\dY~0d #0EYE!j2'flj#$;ғbv>I&?Z"A#la>Gvfw-,S3EDDD\.E|\.wuzi^ykh4kA$j0Ð\.GP9FI~ӟ{nd27w"bQ\ƾ f3EDНZlO[눌"Z/w($tT~}]5 HzKФoc|"""""sEDDDD3 uٲe 4+T*9sWݫ^366믿ί~+"7MEyfttSNqKf^=vL͛7J}_]O"MZȖ12L2FHgcKO=I:}R1nYƈ_8Sl,uGK=Cerק |76 <$\ 1*""""+sEDDDD}|\fqq˲R022¿˿8]s}EejSNx6 C2A022EaJ\E~yv)f#Pg]mlL[*"n, ?'yMbsGy>cIR a(6L$iimI³Ii4 UYTZ233ɓ'+lB, ,,,7 6lذ\l4LLLOO>}"wD. j=dE>]EJ0m|zzS]2o59RߢUbX1Y̠Jttl_ \ۤ%lWDDDDDV-0H޽˲8vQQ8pSSSݣwgg'[ne˖-wE6|&szH\dzM6w'N;ٝFPǪ.`6\?ןDAToy}mI[ m TwU4M$>,CCC?P(sIj}7L&UY0,j/qh,YƳeLZ. ^¶ k2-Dao#l`ܡoLc).7Z$WDDDDDV=uXRd2L&ܣ^f1 T*eMyagg.pl*3١C]I6u-v$JyÆNZjzc6@tY{BC+Fo$pS|L$Y]kX/K.mmm;0??OE?Ν;G^;2c{n]:sJ= _3[".d9:õMRú8h᡾6u';+3<n Ԓx0Ku sya[mlbo[ئCEDDDhw.%4VFKkk+k֬< Qa6PV)˗W*8|0:gΜY~|۶mK*%Q"*'|pv3IϦ;3ܝmmwi/ vJ0<a:m!w ӈwR\n̵Hx6阃e,HDDDDf}gaa3g\VrLMMަidذacqqD"A>g?fnnc0\.H$ :;;qL&]-86Ssʓ+i! 2sA/[S<^0 |gR,9uϳyf~wK^waajJ?x>@YM(" s*<&sL$=5->k<-=)Y rb4 4lk懚fsEDDDD>aYT^x={PV/[/~Cnbmmmc6###tuuh4h4ɚ5k,_WDnLadG^7of ܣYY(Xmpzȡ,')0a0ԙ`;CI.qw;.vƽܸkZ&*"""""ץ4=4d2ڵ}1::JP [ݡ"""""7E""""""3M4I$lذ??errZ@J%{=<ɓ'aϞ=<@de0 6I6)6ޗa{_ ؖą?0g8*""""rK+"""""^ZRPo0 Y~=axEtwws9 LT*Q߂ik[<3$jGwp,.9AʷI14 鍈ȭQ|ZQQ9qΝ#~x 6SOh4ضM"t"a,ֶIx6 ib7 2 E[_wK"""""F"""""jaH.^#RGgGG/"/"LES&`P4ˆf޶icI:pmlKCEDDDDn'犈ȪEl3g044O?}KLu&LƳfs-RMw-穊)'"fgg#_u]LLLP,gxx5k,?_T(k$ 8`YmiNmp-⮍ZR'.""""r)>WDDDDDV qhiiz{8UׇaH>gzzm۶Ǘ<+ Of߾}LMM]u7mΝ;켭#"LME&&ռTEDDDDEEDDDDd}!򕯰w^fffVMEeje oضMaxZXn===RqV"r3, -Ce/TDDDDLQY1WDDDDDV-4I<\>Vh4( r9&&&V8s}GGGq]gsNo~K#"+cgs-<\DDDDD>犈ȪeX;wuVsE&&&(J%uF1Wں+"ic\w-ۼק%""""+"""""^<'_XgE|3'_+"0$ K^4MZ.IƱM+""""rP|4ZF.100peEdklbkO(>WDDDDDR"ÇlIL.~.\X~|֭<|]/"L2H6I!Y*܇+"""""M)Lca|c޽H$njzBiG2W "m]87 Ty[l<*hPVoShPp0Mq,vCi& "eoi4-HӤi GeϞ=Y+JGx<e˖Q^^bf TEi1g5I2T!BB!Bt]p( v] B(9rzn   1228E*B,&xâa6iH\!B!^R>W!BqO4 jEUUhnn,ОHMM^ ##cho|G4Ivv g !nE]Sq5v]-+B!{I\!B!qy{=]$!??Lrrr&}dϞ=9sarrrxgxg%)*JS&]M7ΰB!&sB!bGGG###_5iiin|Fx<ܹQڈD"S:VZżyHOO'33sw !,FDUGS$*B! OB!B "`EQ(++#77j|[SZ}]nL8fdd>RRRp:a\.$ flnѰ&Uf !BC#IQ!B!8N\.פg4l6sp8]w4 QG}}=EEEH! WZtEe3ڡB!BɚB!B(ng̛7)یLWW---aZyGIMM g-ISpXM&lf oHB!5EB!⏢(Hfsvvl6ԩS PZZȔG3KUn6a7k8?dB!?`R>W!B!=o>Hee%QVV=P0 f]m3ᰘ0k$BB!GH\!B!=Muod2ߏ7(2666ii4d2ʕ+|ddd`2T!nⴚ5UB!"sB!4LFFO<W\a``K ᾡPn;F{{;`pҘ;w.gϖ3LlbfְTEJ !Bqq!B!=d2ƍ={pQB>z^裏F躎iS+))k !&MnpYf !B!~x|B!➧inmp8Loo/>oD'55577t:lp8տT&xblҐjB!Bۤ|B!BLcpp[ىvH$r2Nۍ)դb3k-6YAB!Bۤ|B!BLc||:VZEvv66m6`ndVZŜ9sfԅ'iISpZL8&f*B!0HRT!B!D `6  Bb$ *fBbb"v B34ڡvk* B!BL$k !B!& Պfaa``)ۇaĖ'q8QPP sbk:,&f لIUPeQ!B!5dMQ!B!f1k,rsscll}QYYI__;ٸq#˗/tY q1.Uפ\B!⺤|B!BL`٘7oׯKKK ɼꫤ;V+X8c!=qVqVECS$*B!6R>W!B!&PUNRRDaa!Dkp8l6t]YB ?uMXu P!B! I\!B!l&!!tΝ;GWWɌPSSCkk+@`~sΥpBp) hլⴘp̲vB!;B!Bq LFF֭P(ҥKl۶ ٌDQᰱ6?Lg1X B!B|GR>W!B!a6W_-[000@]]W\oo5k㌎eeeew>MU5 لŤbR}ZB!BB!BihF||]qp8L0!Qٌ$)) ݎ(y}ˑ  FuXStNX!*$X,ަB!B |B!B v; .P__Okk+ deeOk&$$Sx<>c<ȥK4Lyg(++l6ﮯڵ C4%))׳f,Y2mR4saѣGzl6rrrxgB B!)+B!EQ#??|k={6nPU˅jݧ,(PWW֭[ill$ b 08pEQbڵ7=3sxxV>3,X!:D?vlnoww7رX,~:;;/eIZ!B!IRT!B!D6"^z%jkk9|0>/J[[cӧyw)--eŊ_qΞ=֭[ٿ?H%K`1nxطo$ /0gTU>ɣ>j$ECW\a֭4551k,6mDJJ 8pC188Ȓ%K(..&))VI!B!~PdMQ!B!L&RSSYf x<<w殮INNPv'O244c=SO=ŬYFdffr~Ǚ3ghjj"//~o[[EuVZ/jEQ,YB__d֭0{lhjjbݬ[Gy] ,^ضm/$EB!;ReMQ!B!i"?? N'MMM SPP@nn.qqq4.]< nt:bժU$&&Ouu57Q:;;'--瓔D\\N$ȠFGGFtttpe(**ۍvŜ9sp:TVV7QB!B)+B!&EQp\lܸKrYm޽{ äqOSQ[[222(((M~~>YYYxpN[[Knnϓ8rD"ENB!^'sB!{p8!!!ٳgKJJ YYYx^ϟn(hFBB6v|>M}g__hD$,ǶOOO!N'.k9$&&Goo/cccB!t]!B!ϽdddEl6:iƦ*&ڙa4TU5ړjEuuTl-,iSSibAQ6v+ևš:pvd2aXPU8">;ibHa6lƌCç( & EQHMM%11lOHyuٌi3v|EQu2cǼx^.˸'%2v;&a zlgl6#z^/~~ݶb۱ZA|>~[pH$2 AQUB!B|~?@`FH{(4M7i&.w|x6ucK]1cۧ%&6I#rn)T0$cZ{n*d> c։s}q;%ҥKDQ9y$υB!3. rś}B!B!̉'رc;v옔ԍD"x^B+k !B!f\4%xfR>W!B!=l6c2|-ø\Xb6'n&١ŘywⱮ'775k֐2ih4% JB g裏pBt]ϐ`0Hcc#}֭\? MMM|駬YŋKgX$! W_xxqRd{n:;;yIHHϐXkZZZxIJJϐXOSSO?4)))g!--펊x|^!B!v]={^ 7L@8ؔm&np8Pݎb1: è:@l Rłfab ذaÔ/ z5Lŭعs'۷o#S IDATfRJ~k.vC=ďcc oq덏o>vɃ>o!apGgg''?!;;[loA~~?88_H?CbJFGG?1%%%8+̛7[:#e6gd9FI !B!$&&biooN<000###NHH 11EQ刺I/#HRRq>nQz8I(III84 UUtFDQ⌲Eb( f.I{m6v]?Cb,yPfXV3 nߏX]%A,oy8St dMQ!B!pq#i5<͛G|| _H1q֯(:e&ub01ֱKgĘO7w!nkۼfE^ŭF' “?mdMQ!B!"ٳg ̙3,"W\ %appQHHHMOO ٳgy>j(++###(:k,IMMŋTUUlG}}=>X'T!B!w#sA@`0hҎFf,˴u0@@ @$0JWFFh<|ƶӉMq7hh4J$a||P(do2X,xqg*'Dbbiڔ6( & <ӱv}cXۘnP(dh"]׍sѼwp8l+UU65]bĶm#m*7jf[OjS}kW0$ :f~zmd2aZҍ BkDQ80=bד`0h3sߘoDĿq=];$}YFL&l6u"xtm{GYY---|ܹ~{19s ~!qqq,\V={عs'<g<|$&&RZZ(_*:~N~ajkkOl_͹seƍdffhB!@ q>/cǎqe._07nd,[l>---|ܹvTU%??kkrCCCٳ_ttt\'O5k֭cӦMݲ؈ﮩ#Gpbɲex(,,h \tÇx,\_ Lkj۷clcNIEQ裏صkD"yyʺ17' R]]9uqKlذzI qi~PWW8fbժUMZ*m6N:ECC--- 0|;ñcpPVVƫJyy9.H~񔗗WW\pۍyRR=k֬fMJFcc####7%%իWӧ9tO^333Y`V4S4rssټy3_~%.]O?Eu ,Y˗SPP0OTU%--͸^*)))]lH5b_f6 L;wz_RR80Dqq1~)a&ٳg3::*a˗r4D!Fwߥh4… pB&sI{=mFvv6K.!9ŋ)--vi3|,Y2؋;+BVV&H$=ٳHKKTRRR$8K,[x<Zkk+eeeO*}v~Q__Ϝ9sXr%466rYFFFXt)pB9t,Y2ǏIQQ@ ؾ};o|2VEQpgϞμ3oVQzzz7o^A>3~BII +V 99 .p9-`0ȉ'/~AUU%%%,^tؽ{7I0B[nߧ5kְh"0ΝID{n,]bOb??@~~>+V`֬Y9sj\.SNsN Y|9tttPYYI \=8::/~ vڅf林*++ deeMCz8s fٸϧJ%>>UUd޽;X W̉'(++#>>3կ! Wl6|Ib0ռ?~R,YBrr2/_f޽dfflAäiqqq3>>N?͌vY|9O<-RaA(7nbd2ڊattڵky)++4ni._L__plx ֬YCZZT[ EQV+ , 55UTaϟ? FX,ʤFHYf1gΜVN86"fF}Yjj*%%%S[KQ")))`%3,Lii @ EjrJ sԩiz>|̋/H~~>PSNg駟rp8HIIbPPP@RRQ*ܕ+Wp80w\rgg'f޽[oe4?Vt~SOrV֯_ߏ#--m;w.<=i8ǴɀH+Wh"|>hEQu8KiFVV>,v]ͰX~iv *aO?fŋ B|_QQA(r3,voh"B… %!wL&,X@II?$srx饗3X,nx8w###+_xٟJ$aΝ߿ٳg#TvٜHVzzzlh|~E;+¢Ep:DQ233ٿ?'Odҥw}2:999g?Pn!\UUE~~>?8WÁa۶mڵl#)сe͚5<lFGG9q]]]IǏS__Ovv6JQQQq֭FM^, EEE?#1Ktʕ+TVVb qxsJkk+۷t]'Ob6O~ٳTUUk.jjjXl:tK.QZZ/lBFFFO>矗٢wf?p6nٳikk/$))M6rJL&p<:9qℑꢪ ϦMxᇍl6y7!==4ꫯgݺulܸd(԰k.8O?=ZbfYVi,**ʕ+lٲk:'OsksssZ|'ݻ5]y׌>z(޷>544PYY딖bۉF̚58b .uRRҴevpfff}]qqqӖw/EQS ^_VR~:^/SJ3[: n6ÄaBHMӰlJUWWz),,$??hEyy9tvvwGCC~)/E__ǎ#Cww7IIIOJl6.]\x&ӧO )((0pMQZZJCC]]] fnvi8NRRR# k$ֲlٲI5M#%%y h4J4ܹstvvR'aٲeD"x<յ?Nrr2EEEFEQPUX1Vf2HQU5mBQuq8I(|>Il6q?+WOqq`( Nu1<>,"---}A|2F2Dϟva,K(an1/j墽k|>W\!++4QFF"I;磣arrrc``FvvY OZngtt(;lJoo>M!B!w?)/(%%8hjjx644DSShaǯ=~6Ξ=ˬYR&NUU1Lx^I8܅t]';;Lgg'wttM(Hhܹs_whf7xG}tRc, .h2dXB4顠 C0dppИv~j$H~?|>&5Øieuڢ(FR_ܙN<ɧ~J(⩧"++qFGGQU=mra6x^\.A,ˤe,].###FB 7m5Ӊj%Lj_p1شi3::GiKL&IU'GvOIjFBBMӄ?Ltvvߏ7)**bΜ9טQ:;;a, 3gΜ9O]] F%Evv6 .$##5eP(DWWO~0dn]SwddĈGGOaaϽccctvvRSSCSS# c7)GDKK 10VYfQPP=wI7N'̞=bt]6Ν!fO{A#팏t:d…deeݰD9\]|>EEE,^'@Xl@ߕ+Whoo6EEEc6'tNrr2Ŕ\7CCCp:ddd񏏏v_.\C(2ֽ7o%%%ܩhmmXU,AnnX,I|?44$%%ȘF|8I^_GGgϞc}̴4JKK5^L4tcb'E#F3333Vq㔕Q^^N~~uwogΜ C8&!!\,YBRR]|>"Nl-k hhh`xxx^盚蠷A~?F}G粒f<###AV+2|Iw8o'OАjm1\EGGLjII S*}a")))btɚB|222(((ٳܹ9s搟O(ɓ|FIo{i;44bƍSJFIފMwl<._7|Cff& W_QYY 0=uuu `IJJBuhootuucP((ӮNfaݝl6Ѧjkk9p̚5~KΞ=;i2\-\ZZJuu5[laƍ0669p###D"IbTlsXҦ\|裏f 1g)+MӦmľ&/wIޙ9~8}p~%KQy00H[s#;sA#Kղ$d bݿ?׋뤦RZZʓO>jrM~?sΟ?OGG@F~~>===Yb,ˤ}cksA"ny (//'33EQ58|0gϞ I Naa18++kRۍǖuJKKٸq444_p9ۍի)))1?::J}}=^FGGhlـ`0ܹsIMMdh4n cIXaĿֈrr2<liȶm͈ۨNNݬ]sNi~\bTG|[&):88ѣG$K⟟Oyy93)]]]F/\d2Dii)?8V=)###\xxkmm%`ZΦ5k0o޼)ɓ>|jvINN㓢;vӧOs%#D^^-BQrssD?DΝ?n<ر3gH IDATڊjEww7WfF"<}%=޽{X,tR|A˧$D###?1)dc…@ @ww7;w׋i$&&RZZʆ SȮ].xg#++I^OhllH$B\\~,YB^^(:u/2005⟛˂ D"LOO066f$JKKyGq8Ix"_}Eww76m2\#GpI<FDQQ> 5?TUUQUUEccLlM@ СC… vO7q]kk(2eԳ3aO$;;_>l4MchhJPUGyĘ 7007|Ν;9~8c=vW\Cz{{ꫯBdee#rp.\˗я~Ċ+?r/IMMeٲeTTTOk֬kjjرc|\ /C=\UU,Z FGGc׮]X˜8qqHHH`pp[ri.\gժUddd=z}qY~K/]w0dxx}CJJ V")) :h?<<pߊ_UU.\ޙuidK$@ HrZ,ٖ[ULwLGL11z]o%[#=L2{Ȗ|"!=o<ك餻7nGC. QWW&22-)-H-Çh4?#/_"ٹs'x<aqLNNr= Z4 jZd ZvlA?Q|׿ȇf޽466VŗŁn߾wGIIxe׮]?\ jnhxll); Q*_%j?_W~j5ǎ6C`>vHOO筷`Y2 ,..t:]nh5yw|2!X kmm$p G# ߏeqq0( FcrR0 .KD?s|M^u &,vsHvU!!!ۢjQ*luAv>Ng A!&&'OFtt4qqqj͛7ٿ?999jZ[[illQRRѣGIIIfa2TWWSRRL&cuuOcc#mmmrAʈ0?Ç$&&@hh(.y;vqs|---sfV+h4|>qmJJJCVFCCsqY\\$:: z{{>:~hii!%%p"""HKK#**J$8'%%L&#,,ݻwR$))IT 9s=bΝl۶mo28~v](xwe޽Vioo޽{yINNfii޽{۷/ )&9p؈OOOd2100 ȂUwK6"p՞xp\\Z---4668|0ddd`2ѣG$''c6E* ܺu LFii)}JjwhD+͎\.d2@b ɸ>ٳBj5rD_JJ N&''Ν;cGkk+Q^^Nee%dggc6Μ9BrGOO.3gPRRBZZr f3NFFƦ߷1;vPGӉB\ν{bj5]]]TWWt:ٿ?O&%%Ebb"SSSr- G DL.344DkkW^e~~Vػw/T*%""V6#G_ włBΝ;ձ{nJJJPp}8|0gϞ%99#'&&y&zݻE\.gllNFCNN$FN۷y"{3NEE>/`0??J֭[466KYYj^ (++㥗^"99Krr2333LNNru ڵ )۟o{{;w!!!ǃr_ h(++#??y, zHFGGSZZJttilldqq 7<.""ep:DEE=M͏^ ϳ@\\;ܽ{Rq÷ZLMMP(HOOKTTCCCLMM%$$0003 u //xטnKxx8@cc#v ĉTTT011@ף멮F.з ))ffgg]je||LFrrr0qc111k'' Dxx8fLﱱ1BBB$5hb`IHHBѰm6XZZz-6ahjjz*o&#n4Eo'~"""}S"## cxxx=륯˅dl6$HA||<*Zv d<Ռp8P*MZZСC"ycrrO?l6:ۙ^"I$99Yl ɓ'8<//zfİʥK顽;vl\\\Ν{X,~mYZZBT#:;;ٶm:Zп*Ie3g8x (J{1<\ l/?u9ysBؔ*BBB cbb+W‚(9͌_XX 6߿(uuu?p/:l6 s1jf^z Zd~~7BRIGGmmm$&&R^^NEEHbʕ+466gsSSStbCp8444BQQ?UٳOrgttTN>|HBBl"Wrjhh^8ꘝl6 -E`zii&,|>l6---<|cǎhhmmݒA A_$;HHrr2999rppa6?00@MM *C=9}ppǏUnBӑLXXFd2ݻIJJbppz=gΜZMXX? odHCBBp8vm)..^@1 cl6CǴZ-c R<nCQ YPP`jeΝl6z{{Dv\GGG+ v(V{KFyz{{}}}΢h())plII zE갰θ8q[׽.zH&t:bPTT$F"##VI__333sׇY7}6ϳm۶UO.$U/266{!...``(,r`ffR޽{7[\\璘ۍp [VHUO?**f2>>,)..d2v`zzB޽{7w^BBBë|>VWW p [ZT*p% -z:J_~:;;q8T*Z-n!]ȈڵWo3??OVV Yn޼(*))&? 144իW_'&&&Xɐ2Gq8LNN4]]]LOO!6x<"#r144ĕ+WXXXuc||\ظIPӧ)** 2+//ǏSNhڵk8x-c@ww7}W\AՊĜ MɄV%))SN\t -oܸ(ݻW5166˗ILL$99;wf߾}է~ʍ7P*#x!qС`}zinnwޡ$***Pr\lvݻwկ~Eii)z~^ G ؄̈/nFj5fYXeeeQ\\̃կ~ӧٶm6ƙ3gعs禯 $wG{VJhh(:\b%mۆ^dt뙝ettJv\&_HU( l6RdxxXTbg5is-99n述@hh(ZB6 2Q8,,,@IC^8cccjm:- tu״Y:9(iɄVFCjj*aaa 066&DZT*RRR*kbncX1n7###\|VKAA"i|v]lhKV͆r166FFF2WT⽏9~?*QP(0Ldee}uʳ/II$ CjZhrgrT*INN'韒Zb`X0Lh4233err۷oBff mjjbffvܹ%}VlXV|>p *'&&X\\ (>ɴ.+%'&&277Ė}X]]KHHHX׺FRv.PsqqYVVVh4~,kݎjeyyo4xu ?ΣGXYY!66%z{{ĉ,aq8\|YWK/ÁBsssر_~9YMqQ|#˱Z<|4=`[ѣGZܻw%t:LMMw^^~倌 ʇ~frֆᠥeZ-ɓT*KiNٳӧOc2$/_d2T*qLMM111Aaa!/"cx|2w=fe߾}9s&سoNgg'۷ogllW; IDATW_%++~Bgg'6xMMMر#G܇T*YoILLt244VܹsI^Ϟ={8{,TUUcd2T****(--iq|gܾ}E\\tvvO~J%;wرcsejLLL022©S8tP@RԛÇX,&''Z\.^Jkk+ =z;w 2=zÇY^^l6cgǎQ-8::dd2VrP(^NhzUfffpDFF΁ER#̌*mnT*f3=jnJѧ!?00"80==DP`6/ZVo-JٌJֽR2FHfBALLH٪HKVBN'rk2\.J1UT,--aXIss3 Bn7zdhh(4>OMi]jBӉFO_Vb!!!Av;nAhoobyyy:u ^n!?44Bә2K?_^^fnn)d{GTT:NV X˅h$33<}6"i&r9۷o'??KEgyyaQn2tbyr(t:+++ Wo>—nROҵHԏv+T*> IDGG뙞p{9 tUEuVEttǏz^?OzRMyhiicǎa4: كAioo?F Jkk+fW_}Ux ebN8AQQSqN'yyy?~+dgg___FΝ;HAAA@Y?r*0ioonP(HMM7СC2 OMM苕s=k&6"9{,111\p{xSNAH!>>G}q'++ ZMvv67}]qjڵGGIUU=BV9{l}R.^׹u~T^u\Z^+SPt:YZZ +4i nwI000@yy9reeLV]d/P(XWVHs}bbbرciii[RiH!~DB4jZX}'99ݻwov3==M]]===].ˢzޯ+ T*Նc`xin0>>/K xILLddd6>cq-[+z:;;)..&==]Ϫ%˿V ̙3DFF__,//#..7|JtP ),,$##Cأz^Q|s$Un+w8-4$hkk#??LQ,+JjvuuK}}=׮]m{X^^fjjJ$ڵ,aURϝNfC>3صk999[Zg L?߇V o?ōP*W(_T*//g߾}R6BPgdsa6~e\.ÇS^^.zHrJ"55*Ju Er/VHKK?oiNp1***{ N=}޵kucn]j>|2-S'[_%nmS./~ VVVĺu4?? #7`08}[v====d2!D^CCa6mg d2qI].4jPTzEۉĉر[xY]]eaawR]]ĉٳgK;^ .^Hkk+~)alq}}c"&U(^|@蟘]#+fŋ`۶m:uJokojj|> 99YTw8477 6yo=E $H A $H |><.]ի\.N: /^ =eʊC<Ţt4V&6kJvr^/Et:|d?4n1| NsYÅk=U@vkǮ__|.]^zgϒ%/76n7~).]biiW^y_~KyWVV]{εVCCC;( ֘ݠTvqykyJ]z>ٳg9wI')󬬬_{tzV׾ZlѮ@Bӑ-H*ɌR5k׸pV7|Sɒ kml9oXiooh4tz=!!!dgg(|gٳ%tX,kDGG#Y^^KZ ώU Iׯ{1;;˹sx7dM]\xyWعs'}͛pΟ?O\\7:C.\n ^U\r=f{ $H A $H Ah|puݻ7$%%RdBѰ azzZl Ĉj8FvԔFEE111`Z72*J"""L|(7nΝ;ɢS_ղ N3\՛DTFj4<333hڀMT}j&immmTUU100@EEڵ Vt|q n߾W_СC?aHH (Z-+++/iVicl6jYZZbff޹njnBCCLOOkjjN>͛7}6.sqaRRR|n8gggq8( f3:NhX,`cϔvEEEhp\ĠX^^~j/A)zEz+ܺu%^z%***ضmۆi]J%bmۙl6z􏌌Dղ@?n8RRRՋ:xhiiaxxx]f1==͍7y&63gPYYIjj**J)ܜH,//o䪵yzzzX,|HQQGtĉ=z4j3뿼ܜd2}{㡯YV+  ֆ륯'NmFl $H A $H AHI333444x^IHH000n p:$Q!Dxx8sss !R[?+++F"##QTh4mFCCl63T^ZZbxxFCllЇ,MMM;\.vILL _Ph$$$ '&&Q($&&DFF*NVVV0LDDDXvzzzpmmmF^{5=*oYZZ"//l~JKhhb``EZ_V $::zx^DV#1 ,,,088`X,8\. ,//S\\LTTԦJo[v;;w7 555@\hh4"ɾ* SSS '6ޭFQZMJJ y^7HkI IyZZZxwYXX ++_ *w$'FCBB044$_n;@"px2B&{KV󤧧kL&( 4|RJ")) BVh0#U"HHH'&--W^y;vlhDP066:[`liiA> Ӕ'kokk>`bbT^~errr2 @DDJ1,K^aPߋ2pfffcll,VE<6 F~~~e $H A $H AQϸt?OO8s lǤj$hhhȑ#,,,l6dffNHHYYYL&#)))`3oaa:T*iiiB)<<ݻws5xtp:LOOIyy9颊hϹt===曜={u=o0hllXVjkkuff&233zILL [WWB -- Rikkʕ+\t2N8AYY٦*~?7n࣏>W_}_~m۶OLL$""f:pf"##A쌌 g'%%rERjj*5|ᇴ́(++#--{P]}6~!]]]K;wukÇ>-as~!9ssΑnH'$$Mkk+,..䕈zinn&--1n@FFPr9QQQ*'w=###|> ~ݻ|@{{;'OW_%33s]BT-l}KKK466277'j֭[ގ`,ݤ޵Yܿ6~kAIII1&1}g%ҥKdffr :%$~?555{RYYo;\DK||<]]]#>7g?fm*ݻGJJ %%%8pu׿  $H A $H A蘚>a @233 6QUUŭ[ %55JSSׯ_'"""ENcLMMqmzDFF222_|ǏXdeeE}}=>V\J%>Ν;~v]Ħ̌pp|>;;Tw0W^( RSS477su Æ166ݻwbyy(FGGCQRR"ҋ SUUEuu5deebFAբj7}п]vEXXssshaaaa^^CCCBZ-ommz1DEEbllzzz(--TEF#O~XvMAAfQ__ϵk#77W???‚8v 駟r4 iii,--t $sssH~?QQQS[[Kww7{e¶QP`2ͥ:ޙL&ijjDqq񖰒X,BvIVVłjǮ?''^ݻwp8hooƍj \oo/"XtuuOYY#nxw),,$99L$HAAH/,,رcBA^/*wAQQW^޽{墳7nT*Kl6V+EX^^n3<ikk[wlnn.F򘞞t:cffnxٿ?JRr9EEELOOSSSn'>>Nh4g'٠4IDAT@\.gbbFCmm-l߾2226}@ J_tZ)**'!-- @NNпM^^sssBӧOSVV&K w,..Oww7ݨT*vMaa@l466r=:;;!$$dC+$RRRHII333|%$$011Aww7Vr˷DW\FAAn{Co.>n0:t^/ޣ^T Ihh(yyy۷O(**!$;;\N?]]]8NnfOb㡽}ݱYYYdff - tvvB^^144ġC ,,,^855EGG"(v Jxx8"*Fg``GbACINN۷o kڵ ׻"a ++2ҥK AOee%OOO?22bzzfl6xap8hmm/d2SSSLMM\sw+m6}gjjJa?9spbcc9x ܼysU7ܹs>}: )/ͼ\.oo8p* ;Fdd$|ܻwGtt4={-! _ZM>zyN'/^|Wŋ/HXX1116֭[PUUJ">>_|ӧO6%v-|ᇸ\.z=_Q&m&NFss3===|QNxk׮R̙3:u* )'ojj ?==gNGBBol{餳v;W\Vx?7xNGtt4ϭ[hll֭[rf3='NtxOO},--zY\\* Hqq1 -//'"">DDDcΞ=KAA\.j駟r Ct:&{۷o۷DGGsQ?Nyy: p)'%$y^L066&/,, szzA[[8y$ћ3rfzzJUUpxW_}Gt:ػw/?Osa]QQ9p: ^._,򖗗E8J("""~_rAY^^^  $H A $H A/bqq`eee`2 p˺WTL&EʍXXX~p݄Onn. mmmaZhJJ w`0l@a]f~履Mhh(N)nT*7jcvqqq +333;vsk~ھ>llc@y2a$օavҖHrM; ӤviNVTMke)Y Lll~~n{Q~åD|\|jttTXpΝ;&Yc;33rܮrn=3'{Z}]ϫYΝ;lmmMz?22!~t:p8Y---)Lng!統QKKJ%ZZZ*N~եJFGG}Ο?a555fO?HnX=naaAd29{X,P(2EԨI ǦHDo~fS&)qq[NMOOkbbB`O_v@>W,VVVB ׫r\Wz7p٬߿%Iy:1833 |bt5yrR‚677?ή.9sFgΜ94F^D"' z}?$W^飏>Rssc( D/O89RT D#>F|.\'N4sh88l+kwwWPHCuuujlli. ;E￯GO^{M{{{. ϔNPP"ܜ U,X^^+"á>⋪O\ \G׮]˗>Wp.pLJ%YD"]iyjy<_(dJNf;Gm6<jkkt:ݻyr9EQݻwOk^^< i)L*(ϫT*f믭$}6iوT*ikkKn޼iqy<uvvŋNRם;w499%=|PtZب]tI/_V__߁{_JǕH$4::;w~z饗t…`0wҒѨ,RCC422+Wh``(SUәw[Z]]U6P,o5r9eCb1 T*p8deYѨp8^r82 Cv]^W>OpXavԩSx^9`3ibbB( 0 9\.޽{Z]]U8֕+W|bCQ8fkW_:;;544s0 mmmݻu떒#lVd2jjjR PCC4;;[n)HȲ,fnI/_U]]^KrEi*( ^{ァp8>}Zr:Z[[Ӄ411m쨧Gr8e';Ěُ@wT__*)뗿^Gmii=9NnUWW4Mbt:)ܜnܸׯrrQ/_eYo~#ۭ^]~] 89`0۷o7ސз-?T[[jjjTUU\.yؘt-]tI@l5`(3DBoҒvy[6MUUUjjjАH$=F}}}r:#kӭ[Dt5:{jkkeەrN 455b( x*1L&u]E"|>}Tww=6Ms=C1MSGFۓeY* ?PTWW'áx??qyuww̙3;[(/߯T*I ONc&jmmMdR ;WZZZd>#S,fumݼySD"Q.ST*/b:uvvvd-B!E2MST*X,jmmMRIHDO^py% r9v|>9G^xzeƁEB![y>H$/--))Jɲ~/\8fJŢ Puuuyl477_Z^^VuuΞ=.577v4^wyGx@( r*JRР~/\8f ÐfS>W2|it:T*uhq-,,M/nOnoo>nFUUU~OJicpEd2ZYYQCC#hT"oc666=s>p]&Q<8bO644ԩSؐ3#E"b(˲ C8٬J^~d6U4Ԕc멪fSXT>[[[*+ jaaQ ,R6}xpҥKjkkS4믿Yr5|^x\wؘgx<y^H$`0x4i8և~ 4MnY8%ippP/^Ѝ7ꫯjssv_:BRԿa(3G?A 2 Cx\<쬜N>]pkk?O,KNnW2x+˥g}V333{vJjnnV}}:;;uEkqqQ۫fnye2%I˲,kddDG^ NQ8fN:;;u%E"/э74;;l6%IͩSOV(:f hxxXzD"˥X,P(R!r9%GSWW+kuuU'Qϟ?y<~ z7twS{{Z[[zeYRjkkr488Yp?p~9e2k~~^HD6M.\зmuttƍ|:}rF}}}J$Z__W0JFFFtU}+_677588A먮V{{ bVWW5??{ijjJuuuP{{vN*˲C-..Z[[S"aו+W /(W1zuiUUUٳP:SWW:::dD aӗeEQr9:uwwMNSRIP[[ہ:s^nmnn*(ϫT*ٳ l$ݮ&;wN֖,*NkjjܬVy Specifying equilibrium frequencies ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Another possibility to address problems associated with biased sampling, is direct specification of the equilibrium frequencies using the flag ``--weights``. This parameter expects a csv or tsv file specifying the relative weights for each discrete state (they will be normalized to 1.0). These weights correspond to equilibrium frequencies in a time-reversible model. This has sometimes slightly unintuitive implications and should be used with caution. treetime-0.11.1/docs/source/tutorials/timetree.rst000066400000000000000000000212471447636507100222610ustar00rootroot00000000000000 Estimation of time scaled phylogenies ------------------------------------- The principal functionality of TreeTime is estimating time trees from an initial tree topology, a set of date constraints (e.g. tip dates), and an alignment (optional). This tutorial uses data provided in the github repository `github.com/neherlab/treetime_examples `_. .. code-block:: bash treetime --tree data/h3n2_na/h3n2_na_20.nwk --dates data/h3n2_na/h3n2_na_20.metadata.csv --aln data/h3n2_na/h3n2_na_20.fasta --outdir h3n2_timetree The tree can be in newick or nexus format, the alignment in fasta or phylip, and the dates should be given as a tsv or csv file. TreeTime will attempt to parse dates, preferred formats are "%Y-%m-%d" or numerical as in YYYY.F (where 'F' is the fraction of the year that has passed, in days. For example 2016.04918 means that 18/366 days of 2016 have passed). This command will estimate an GTR model, a molecular clock model, and a time-stamped phylogeny. The results are saved to several files in the directory specified as `outdir` and printed to standard out: .. code-block:: bash Inferred GTR model: Substitution rate (mu): 1.0 Equilibrium frequencies (pi_i): A: 0.2983 C: 0.1986 G: 0.2353 T: 0.2579 -: 0.01 Symmetrized rates from j->i (W_ij): A C G T - A 0 0.8273 2.8038 0.4525 1.031 C 0.8273 0 0.5688 2.8435 1.0561 G 2.8038 0.5688 0 0.6088 1.0462 T 0.4525 2.8435 0.6088 0 1.0418 - 1.031 1.0561 1.0462 1.0418 0 Actual rates from j->i (Q_ij): A C G T - A 0 0.2468 0.8363 0.135 0.3075 C 0.1643 0 0.1129 0.5646 0.2097 G 0.6597 0.1338 0 0.1432 0.2462 T 0.1167 0.7332 0.157 0 0.2686 - 0.0103 0.0106 0.0105 0.0104 0 Root-Tip-Regression: --rate: 2.613e-03 --chi^2: 22.16 --r^2: 0.98 --- saved tree as h3n2_timetree/timetree.pdf --- alignment including ancestral nodes saved as h3n2_timetree/ancestral_sequences.fasta --- saved divergence times in h3n2_timetree/dates.tsv --- tree saved in nexus format as h3n2_timetree/timetree.nexus --- root-to-tip plot saved to h3n2_timetree/root_to_tip_regression.pdf Other output files include an alignment with reconstructed ancestral sequences, an annotated tree in nexus format in which branch length correspond to years and mutations and node dates (in the numeric format detailed above) are added as comments to each node. In addition, the root-to-tip vs time regression and the tree are drawn and saved to file. .. image:: figures/timetree.png :target: figures/timetree.png :alt: rtt Accounting for phylogenetic covariance ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ The root-to-tip distances of samples are expected to increase with sampling date and TreeTime uses this behavior to estimate clock rates. However, these root-to-tip distances are correlated due to shared ancestry. This can be efficiently accounted if the sequence data set is consistent with a simple strict molecular clock model, but can give misleading results when the molecular clock model is violated. This feature is hence off by default and can be switched on using the flag .. code-block:: bash --covariation Fixed evolutionary rate ^^^^^^^^^^^^^^^^^^^^^^^ If the temporal signal in the data is weak and the clock rate can't be estimated confidently from the data, it is advisable to specify the rate explicitly. This can be done using the argument .. code-block:: bash --clock-rate Divergence times inference methods ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ TimeTree estimates optimal time trees by chosing node positions/ divergence times that optimize the joint or marginal likelihood. The **joint maximum-likelihood** assignment corresponds to the global configuration with the highest likelihood, however it gives no information about the confidence of divergence time estimates. The **marginal maximum-likelihood** assignment assigns nodes to their most likely divergence time after integrating over all possible configurations of the other nodes, it enables the computation of divergence time confidence intervals. Which 'method' of divergence time estimation is used can be specified with the flag: .. code-block:: bash --time-marginal It is possible to run iterations of TreeTime using different methods. If ``‘false’`` or ``‘never’``, TreeTime uses the jointly most likely values for the divergence times. If ``‘true’`` or ``‘always’`` TreeTime uses the marginal inference mode at every round of optimization, ``‘only-final’`` (or ``‘assign’`` for compatibility with previous versions) only uses the marginal distribution in the final round. In versions 0.9 and higher the marginal-likelihood assignment was sped up by using the Fast Fourier Transform to calculate convolution integrals. Now the time complexity of marginal and joint likelihood calculations is comparable, whereas in versions prior to 0.9 the joint likelihood assignment was 2-3 times faster. To maintain compatibility with previous versions the joint maximum-likelihood assignment is still preformed as a default, however the marginal-likelihood assignment is now recommended. Confidence intervals ^^^^^^^^^^^^^^^^^^^^ In its default setting, TreeTime does not estimate confidence intervals of divergence times. Such estimates require calculation of the marginal probability distributions of the dates of the internal nodes. To switch on confidence estimation, pass the flag ``--confidence``. If the ``--time-marginal`` method is in ``['false', 'never']`` TreeTime will run another round of marginal timetree reconstruction to calculate the marginal probability distribution of the nodes. Otherwise, TreeTime will use the marginal probability distribution calculated in the last round of time tree reconstruction and determine the region that contains 90% of the marginal probability distribution of the node dates. These intervals are drawn into the tree graph and written to the dates file. Specify or estimate coalescent models ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ TreeTime can be run either without a tree prior or with a Kingman coalescent tree prior. The later is parameterized by a time scale 'Tc' which can vary in time. This time scale is often called 'effective population size' Ne, but the appropriate Tc has very little to do with census population sizes. To activate the Kingman Coalescent model in TreeTime, you need to add the flag .. code-block:: bash --coalescent where the argument is either a floating point number giving the time scale of coalescence in units of divergence, 'const' to have TreeTime estimate a constant merger rate, or 'skyline'. In the latter case, TreeTime will estimate a piece-wise linear merger rate trajectory and save this in files ending on ``skyline.tsv`` and ``skyline.pdf`` The following command will run TreeTime on the ebola example data set and estimate a time tree along with a skyline (this will take a few minutes). .. code-block:: bash treetime --tree data/ebola/ebola.nwk --dates data/ebola/ebola.metadata.csv --aln data/ebola/ebola.fasta --outdir ebola --coalescent skyline The number of grid points in the skyline model can be additionally specified using the flag .. code-block:: bash --n-skyline .. image:: figures/ebola_skyline.png :target: figures/ebola_skyline.png :alt: ebola_skyline The coalescent model requires the number of lineages in the tree at any given time for estimating the probability of a coalecent event. In the default setting the current estimates of divergence times are used for calculating the number of lineages, if the certainty of these estimates should be accounted for the posterior probability distributions of divergence times can be used by adding the flag .. code-block:: bash --n-branches-posterior this should smooth the coalescence likelihood distributions. VCF files as input ^^^^^^^^^^^^^^^^^^ In addition to standard fasta files, TreeTime can ingest sequence data in form of vcf files which is common for bacterial data sets where short reads are mapped against a reference and only variable sites are reported. The following example with a set of MtB sequences uses a fixed evolutionary rate of 1e-7 per site and year. .. code-block:: bash treetime --aln data/tb/lee_2015.vcf.gz --vcf-reference data/tb/tb_ref.fasta --tree data/tb/lee_2015.nwk --clock-rate 1e-7 --dates data/tb/lee_2015.metadata.tsv For many bacterial data sets where the temporal signal in the data is weak, it is advisable to fix the rate of the molecular clock explicitly. Divergence times, however, will depend on this choice. treetime-0.11.1/docs/source/vcf_utils.rst000066400000000000000000000002121447636507100204000ustar00rootroot00000000000000************* VCF Utilities ************* .. autofunction:: treetime.vcf_utils.read_vcf .. autofunction:: treetime.vcf_utils.write_vcf treetime-0.11.1/setup.py000066400000000000000000000033001447636507100151330ustar00rootroot00000000000000from setuptools import setup def get_version(): v = "0.0.0" with open('treetime/__init__.py') as ifile: for line in ifile: if line[:7]=='version': v = line.split('=')[-1].strip()[1:-1] break return v with open("README.md", "r") as fh: long_description = fh.read() setup( name = "phylo-treetime", version = get_version(), author = "Pavel Sagulenko, Emma Hodcroft, and Richard Neher", author_email = "richard.neher@unibas.ch", description = ("Maximum-likelihood phylodynamic inference"), long_description = long_description, long_description_content_type="text/markdown", license = "MIT", keywords = "Time-stamped phylogenies, phylogeography, virus evolution", url = "https://github.com/neherlab/treetime", packages=['treetime'], install_requires = [ 'biopython>=1.67,!=1.77,!=1.78', 'numpy>=1.10.4', 'pandas>=0.17.1', 'scipy>=0.16.1' ], extras_require = { ':python_version >= "3.6"':['matplotlib>=2.0'], }, classifiers=[ "Development Status :: 5 - Production/Stable", "Topic :: Scientific/Engineering :: Bio-Informatics", "License :: OSI Approved :: MIT License", "Programming Language :: Python :: 3.7", "Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", ], entry_points = { "console_scripts": [ "treetime = treetime.__main__:main", ] } ) treetime-0.11.1/test.sh000066400000000000000000000006551447636507100147460ustar00rootroot00000000000000#!/usr/bin/env bash set -euo pipefail cd test # Remove treetime_examples in case it exists to not fail rm -rf treetime_examples git clone https://github.com/neherlab/treetime_examples.git bash command_line_tests.sh OUT=$? if [ "$OUT" != 0 ]; then exit 1 fi pytest test_treetime.py if [ "$OUT" != 0 ]; then exit 1 fi # Clean up, the 202* is to remove auto-generated output dirs rm -rf treetime_examples __pycache__ 202* treetime-0.11.1/test/000077500000000000000000000000001447636507100144045ustar00rootroot00000000000000treetime-0.11.1/test/coalescent_tests.py000066400000000000000000000127651447636507100203330ustar00rootroot00000000000000## This script is written for running two different versions of treetime (in different environments) ## and comparing their output, in this case: inferred divergence times of nodes. ## Remember to set if this script is currently being run on the master branch or ## the new branch/version that should be tested import numpy as np from Bio import Phylo import matplotlib.pyplot as plt import pandas as pd from treetime import TreeTime from treetime.utils import parse_dates from fft_tests import get_tree_events, get_test_nodes, get_large_differences, compare def write_to_file(times_and_names, name = 'master.txt'): with open(name, 'w') as f: f.write("time \t name \t bad_branch\n") for t in times_and_names: f.write(str(t[0])) f.write("\t") f.write(t[1]) f.write("\t") f.write(str(t[2])) f.write("\n") f.close() return None def read_from_file(file_name): times_and_names = [] with open(file_name, 'r') as f: for line in f.readlines()[1:]: lines = line.split("\n")[0].split("\t") times_and_names += [[float(lines[0]), lines[1], lines[2]]] return times_and_names if __name__ == '__main__': plt.ion() ebola=True master = False ##should be True for master branch location_master = '../../TreeTimeMaster/treetime/' ##only needed for test branch if ebola: node_pattern = 'EM_004555' base_name = '../treetime_examples/data/ebola/ebola' clock_rate = 0.0001 else: node_pattern = 'Indiana' base_name = '../treetime_examples/data/h3n2_na/h3n2_na_20' clock_rate = 0.0028 seq_kwargs = {"marginal_sequences":True, "branch_length_mode": 'input', "sample_from_profile":"root", "reconstruct_tip_states":False} tt_kwargs = {'clock_rate':clock_rate, 'time_marginal':'assign'} coal_kwargs ={'Tc':10000, 'time_marginal':'assign'} dates = parse_dates(base_name+'.metadata.csv') tt = TreeTime(gtr='Jukes-Cantor', tree = base_name+'.nwk', use_fft=False, aln = base_name+'.fasta', verbose = 1, dates = dates, precision=3, debug=True) tt._set_branch_length_mode(seq_kwargs["branch_length_mode"]) tt.infer_ancestral_sequences(infer_gtr=False, marginal=seq_kwargs["marginal_sequences"]) tt.prune_short_branches() tt.clock_filter(reroot='least-squares', n_iqd=1, plot=False, fixed_clock_rate=tt_kwargs["clock_rate"]) tt.reroot(root='least-squares', clock_rate=tt_kwargs["clock_rate"]) tt.infer_ancestral_sequences(**seq_kwargs) tt.make_time_tree(clock_rate=tt_kwargs["clock_rate"], time_marginal=tt_kwargs["time_marginal"]) ##should be no difference at this point unless 'joint' is used for "branch_length_mode" tree_events_tt = get_tree_events(tt) if master: write_to_file(tree_events_tt) else: output_comparison = compare(tree_events_tt, read_from_file(location_master + "master.txt")) large_differences = get_large_differences(output_comparison[1]) ##plot differences for non bad-branches plt.figure() plt.plot(output_comparison[1][output_comparison[1]['bad_branch']==0].time, output_comparison[1][output_comparison[1]['bad_branch']==0].difference, 'o') # add coalescent model, assume there will be some changes after this point tt.add_coalescent_model(coal_kwargs ["Tc"]) tt.make_time_tree(clock_rate=tt_kwargs ["clock_rate"], time_marginal=coal_kwargs ["time_marginal"]) tree_events_tt_post_coal = get_tree_events(tt) if master: write_to_file(tree_events_tt_post_coal) else: write_to_file(tree_events_tt, "fft_branch"+ ".txt") output_comparison = compare(tree_events_tt_post_coal, read_from_file(location_master + "master.txt")) ##plot differences and color according to bad-branch label, save figure plt.figure() groups = output_comparison[1].groupby('bad_branch') color = ['red', 'black', 'yellow', 'green'] for name, group in groups: plt.plot(output_comparison[1].time, output_comparison[1].difference, marker='o', color=color[int(name)], linestyle='', ms=1, label=name) plt.xlabel("nodes ranging from root at 0 to most recent") plt.ylabel("difference time_before_present coalescent branch - master branch") plt.legend() if ebola: plt.savefig("time_before_present-differences-ebola.png") else: plt.savefig("time_before_present-differences-h3n2_na.png") large_differences = get_large_differences(output_comparison[1]) ##plot differences for non bad-branches plt.figure() plt.plot(output_comparison[1][output_comparison[1]['bad_branch']==0].time, output_comparison[1][output_comparison[1]['bad_branch']==0].difference, 'o') ##draw tree for optical comparison Phylo.draw(tt.tree, label_func=lambda x:"") ##plot LH distributions for optical comparison if coal_kwargs['time_marginal']=='assign': test_node = get_test_nodes([tt], node_pattern)[0] while test_node: if test_node.name != tt.tree.root.name: plt.figure() t = np.linspace(test_node.time_before_present-0.0001,test_node.time_before_present+0.0001,1000) plt.plot(t, test_node.marginal_pos_LH.prob_relative(t), 'o-', label='new') plt.title(test_node.name) plt.show() test_node= test_node.uptreetime-0.11.1/test/command_line_tests.sh000077500000000000000000000051511447636507100206140ustar00rootroot00000000000000all_tests=0 treetime homoplasy --aln treetime_examples/data/h3n2_na/h3n2_na_20.fasta --tree treetime_examples/data/h3n2_na/h3n2_na_20.nwk retval="$?" if [ "$retval" == 0 ]; then echo "homoplasy_scanning ok" else echo "homoplasy_scanning failed $retval" ((all_tests++)) fi treetime ancestral --aln treetime_examples/data/h3n2_na/h3n2_na_20.phylip --tree treetime_examples/data/h3n2_na/h3n2_na_20.nwk retval="$?" if [ "$retval" == 0 ]; then echo "ancestral_reconstruction ok" else ((all_tests++)) echo "ancestral_reconstruction failed $retval" fi treetime clock --tree treetime_examples/data/h3n2_na/h3n2_na_20.nex --dates treetime_examples/data/h3n2_na/h3n2_na_20.metadata.csv --sequence-length 1400 retval="$?" if [ "$retval" == 0 ]; then echo "temporal_signal ok" else ((all_tests++)) echo "temporal_signal failed $retval" fi treetime --aln treetime_examples/data/h3n2_na/h3n2_na_20.fasta --tree treetime_examples/data/h3n2_na/h3n2_na_20.nwk --dates treetime_examples/data/h3n2_na/h3n2_na_20.metadata.csv --confidence --covariation retval="$?" if [ "$retval" == 0 ]; then echo "timetree_inference ok" else ((all_tests++)) echo "timetree_inference failed $retval" fi treetime mugration --tree treetime_examples/data/zika/zika.nwk --states treetime_examples/data/zika/zika.metadata.csv --weights treetime_examples/data/zika/zika.country_weights.csv --attribute country retval="$?" if [ "$retval" == 0 ]; then echo "mugration ok" else ((all_tests++)) echo "mugration failed $retval" fi treetime --aln treetime_examples/data/tb/lee_2015.vcf.gz --vcf-reference treetime_examples/data/tb/tb_ref.fasta --tree treetime_examples/data/tb/lee_2015.nwk --clock-rate 1e-7 --dates treetime_examples/data/tb/lee_2015.metadata.tsv retval="$?" if [ "$retval" == 0 ]; then echo "timetree_inference on vcf data ok" else ((all_tests++)) echo "timetree_inference on vcf data failed $retval" fi treetime --tree treetime_examples/data/ebola/ebola.nwk --dates treetime_examples/data/ebola/ebola.metadata.csv --aln treetime_examples/data/ebola/ebola.fasta --coalescent skyline --gen-per-year 100 retval="$?" if [ "$retval" == 0 ]; then echo "skyline approximation ok" else ((all_tests++)) echo "skyline approximation failed $retval" fi # From https://github.com/neherlab/treetime/issues/250 treetime --tree treetime_examples/data/ebola/ebola.nwk --dates treetime_examples/data/ebola/ebola.metadata.csv --sequence-length 1000 retval="$?" if [ "$retval" == 0 ]; then echo "sequence length only ok" else ((all_tests++)) echo "sequence length only failed $retval" fi if [ "$all_tests" == 0 ];then echo "All tests passed" exit 0 else exit "$all_tests" fi treetime-0.11.1/test/fft_accuracy.ipynb000066400000000000000000043352241447636507100201150ustar00rootroot00000000000000{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "I will test the accuracy of the numerical integration vs discrete Fourier transform methods of calculating the convolution integral. \n", "In order to have a known analytical solution to the convolution I will convolve 2 Gamma distributions, as it holds that: \n", "\n", "$Gamma(\\alpha_1, \\beta)*Gamma(\\alpha_1, \\beta)= Gamma(\\alpha_1 + \\alpha_2, \\beta)$\n", "\n", "Where to stay in line with the notation used in scipy the PDF of the Gamma distribution is described as: \n", "\n", "$f(x, \\alpha, \\beta) = \\frac{\\beta^{\\alpha} x^{\\alpha -1}e^{-\\beta x}}{\\Gamma(\\alpha)}$\n", "\n", "($\\beta$ is given as the inverse of the scale parameter)\n", "\n", "I first read in all the packages that are needed. \n" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import matplotlib.pyplot as plt\n", "from matplotlib.backends.backend_pdf import PdfPages\n", "from scipy.interpolate import interp1d\n", "from scipy.stats import gamma\n", "import time\n", "\n", "from treetime.node_interpolator import NodeInterpolator\n", "from treetime.distribution import Distribution\n", "from treetime.config import BIG_NUMBER, TINY_NUMBER, REL_TOL_PRUNE, BRANCH_GRID_SIZE, MAX_BRANCH_LENGTH" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Then I create two Distribution objects for two Gamma distributions, I additionally define the analytical solution to their convolution. Note that the MAX_BRANCH_LENGTH parameter is set to 4 and anything that is longer will be cut off. Thus, it makes sense to use gamma distributions that are scaled smaller to prevent estimation issues. " ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "data": { "text/plain": [ "
" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" }, { "data": { "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from matplotlib import rcParams\n", "rcParams.update({'figure.autolayout': True})\n", "\n", "beta = 100\n", "alpha_1 = 5\n", "alpha_2 = 2\n", "\n", "start = 0\n", "end = 1\n", "x = np.linspace(start, end, num=1000, endpoint=False) #create an x vector of points that should be sampled\n", "y_1 = gamma.pdf(x, alpha_1, scale=1/beta)\n", "y_1[y_1 == 0] = TINY_NUMBER ##remove -inf to prevent numerical errors\n", "\n", "fig= plt.figure()\n", "plt.autoscale()\n", "plt.plot(x, gamma.pdf(x, alpha_1, scale=1/beta), label=\"PDF\")\n", "plt.ylabel(\"PDF Gamma(\"+ str(alpha_1) +\",\"+str(beta)+ \")\")\n", "plt.title(\"Distribution 1\")\n", "plt.show()\n", "dist_1 = Distribution(x, y_1, kind='linear', is_log=False)\n", "\n", "y_2 = gamma.pdf(x, alpha_2, scale=1/beta)\n", "y_2[y_2 == 0] = TINY_NUMBER ##remove -inf to prevent numerical errors\n", "\n", "dist_2 = Distribution(x, y_2, kind='linear', is_log=False)\n", "\n", "plt.figure()\n", "plt.plot(x, gamma.pdf(x, alpha_2, scale=1/beta), color=\"blue\")\n", "plt.plot(x, np.exp(-dist_2.y), color=\"green\") ##just to check that distribution object is initialized accurately \n", "plt.ylabel(\"PDF Gamma(\"+ str(alpha_2) +\",\"+str(beta)+ \")\")\n", "plt.title(\"Distribution 2\")\n", "plt.show()\n", "\n", "\n", "alpha_sol = alpha_1 + alpha_2\n", "y_sol = gamma.pdf(x, alpha_sol, scale=1/beta)\n", "y_sol[y_sol == 0] = TINY_NUMBER ##remove -inf to prevent numerical errors\n", "dist_sol = Distribution(x, y_sol, kind='linear', is_log=False)\n", "plt.figure()\n", "plt.plot(x, gamma.pdf(x, alpha_sol, scale=1/beta))\n", "plt.ylabel(\"PDF Gamma(\"+ str(alpha_sol) +\",\"+str(beta)+ \")\")\n", "plt.title(\"Convolution Distribution 1 and Distribution 2\")\n", "plt.show()\n", "\n", "plt.figure()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "I shall now perform convolution on the two gamma distributions using the afore mentioned methods. I shall again vary the grid sizes used for convolution and see the effects on accuracy by comparing the output with the analytical solution." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "def accuracy_and_time(dist_1, dist_2, calc_type, grid_size):\n", " '''\n", " Output: res - convolution output (Distribution object)\n", " conv_time - time needed for convolution\n", " true_grid_size - grid size of convolution output (as grid is set in convolution function and can vary)\n", " '''\n", " if calc_type==\"fft\":\n", " start = time.process_time()\n", " if alpha_1==1 or alpha_2==1:\n", " factor = 100\n", " else:\n", " factor = 50\n", " res = NodeInterpolator.convolve_fft(dist_1, dist_2, fft_grid_size=int(grid_size/factor))\n", " conv_time = time.process_time() - start\n", " true_grid_size = len(res.y)\n", " if calc_type==\"num\":\n", " start = time.process_time()\n", " res = NodeInterpolator.convolve(dist_1, dist_2, n_grid_points=grid_size, n_integral=grid_size)[0] ##second output is grid scale, which is also given in the x parameter\n", " conv_time = time.process_time() - start\n", " true_grid_size = len(res.y)\n", " return res, conv_time, true_grid_size\n", "\n", "def get_P(x, neg_log_P):\n", " '''\n", " Given a Distribution object (neg_log_P) this returns the original likelihood function evaluated at points x\n", " As a Distribution object stores the function as the negative loglikelihood of the normalized function\n", " '''\n", " y = neg_log_P(x)\n", " y = np.exp(-y + neg_log_P.peak_val)\n", " return y\n", "\n", " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "For simplicity set the one_mutation parameter to zero." ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "##in order to perform the convolution dist_2 needs a one_mutation parameter (as this should be a BranchLenInterpolator object)\n", "dist_2.one_mutation = 0\n", "\n", "grid_size = [100, 200, 300, 500, 1000] #more desired grid_sizes, true grid size is given as output when the accuracy_and_time function is called\n", "time_fft = np.empty((len(grid_size),2))\n", "accuracy_fft = []\n", "time_num = np.empty((len(grid_size),2))\n", "accuracy_num = []\n", "for t in range(len(grid_size)):\n", " #print(t)\n", " time_fft_full = accuracy_and_time(dist_1, dist_2, \"fft\", grid_size[t])\n", " time_fft[t] = time_fft_full[1:3]\n", " accuracy_fft.append(time_fft_full[0])\n", " time_num_full = accuracy_and_time(dist_1, dist_2, \"num\", grid_size[t])\n", " time_num[t] = time_num_full[1:3]\n", " accuracy_num.append(time_num_full[0])\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "First I just plot the probability density functions to get a visual assessment of the accuracy. I also do this in the log scale to get a better look at the tails, here it becomes clear that the probability density in the tails (after the effective support is slightly over estimated)." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "grid points NUM (output):139.0\n", "grid points FFT (output):55.0\n" ] }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAbEAAAEhCAYAAADxtp7yAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAAsTAAALEwEAmpwYAAAtGElEQVR4nO3deXxc5X3v8c8zo5mRNNp32fJuyWYxCGLSGJKbtAmEULbLjUOhyQWaXgghKU7SpGlv0zhNCU1oi0nyooT0Nm5LKCb01rktDSTgkFCWEjvGGDDesC3bstbRSKMZLSPNc/84Y4GNFy0zOnPG3/fr5TDnaM55fhyIvjznPM9zjLUWERERL/K5XYCIiMh0KcRERMSzFGIiIuJZCjEREfEshZiIiHiWQkxERDyrwO0CjgqVVNgVy5e6XYaIJ73ZHQdgcW3Y5UpEZmbLli091trayX4/Z0IsXN3I5s2b3S5DxJOu/94LAGy4bZXLlYjMjDHmwFS+r9uJIiLiWTnTExMRyVWdnZ1EIhG3y8hbVVVV1NfXT+tYhZiIyGlEIhFaWlrw+/1ul5J3xsfH2bVr17RDTLcTRUQmQQGWHTO9ruqJiYhMwpon1vByx8tTOqa1oZV1l687Zt/atWtZs2YNFRUV069lzRpuv/12hoaGaG1tzei5vUYhJiIyi3bv3s3DDz/MxRdfzNe//nVuueUWnnrqKdatW8e6deu49tprefTRRwkGg0SjUdauXQtAe3s7d999N8uXLwfgyJEjRKNRHn/8ccrLyznvvPMmzn3jjTeeMUGmEBMRmYTje1TT1dzczI033kg0GuWSSy7hyiuv5KmnngLg6Kuxnn76aW644QY6OjoYHR0lGAzy7LPPct1117Fq1Sq+/OUvT5zvoosuYvv27UQikYlznykBBnomJiIyq5YtW8YDDzxAX18fPp/zK/i8887j/vvv56WXXgLg0ksvJR6Ps2TJEoLBIADve9/7+OlPf8qGDRuOOV80GiUUCvHGG28cc+4zhcnUSzGNMS3AnwAbrbUb0/tuAmqAsLX2z091fNWCs2zkwI6M1CJyptFk5+zasWMHZ511lttl5K23X19jzBZr7crJHpuxnpi1dhew/rjdrdbav04XVpGptiZr294jFC3cRsmyl9hzuHe2mxcRkSybrduJJ+zuGWNuNcZsNsZsTiaTGW/0lj96leED5/PHu37Mrz5wa8bPLyIi7srYwA5jTAPwUaDIGFMOPAm8bIz5AoC1Nnr8MdbaB4EHwbmdmKlaAJJjKV5+/Dc456Kf8L9/9Q3YA8mhEQJFoUw2IyIiLspYiFlrO4DPHLf7HzJ1/qn60c9fxw6fy8dXHoJfOfv+7e82cd1nP+JWSSLiYWvWwMsvT+2Y1lZYt24qbaxh3VQOmMJ5v/KVr7B161Y+9KEPTexfv349ra2tx8w185q8HWL/46c7gXO5bv74xL7dj78ICjERcdFzzz3HT37yE4wx3HTTTXz/+99nwYIFrFq1itdff53169fz8Y9/nIKCAtavX8/BgweJRCL8/u//Pt///vePmU92xx13cPnll7N161be8573sH37dr7zne8AkEgk+OIXv8iKFSvo6+sjFovx6quvsmvXLpLJJEuXLmX37t20tbVRU1NDU1OTy1dmevI2xLZuDmLCPTSPdk/sC722372CRMTTMtVB2rBhA62trQwPD7Nnzx5WrlzJvn37iMVinH322dx8883HfP/KK68EYMuWLRP7jo4qX7hwIZ/97Ge5/fbbufXWW7nzzjsnvrN9+3ZWrlzJLbfcwstv60K+613v4tlnn6Wnp4fm5mZaW1s9G2CQx/PEDu+upmrRfszePdDUxN7C+czv7nC7LBE5w61evZqODud3UUtLC/39/QQCAXbs2MH8+fP57ne/y9jY2MT3jTEYY0ilUu+YTxYIBAAIhUIT3z1qxYoVvPbaazzyyCMkEomJ/ZFIhKKiIt544w2WLFnChg0baGtry/rfd7ZkbJ7YTGVynlhyfIxgOEHrh19ha88fQTDIs/tS1B3ooLjrv5hXW5GRdkRyheaJZZfmiWVXTswTyyWbd7XBSBnnLC+APXtg6VLGz21hKXt4/Kc73S5PREQyJC9D7PltPQBctMhCVxcsXcq8Sy/CT4q9T2x3uToREcmUvBzYse115/7vf6uMOTuWLmXRMmfl58Br+9wqS0REMiwve2J79qTAN8a5qfQimEuX4lvWwigBGg4fcrc4EZGTWLNmzTHbu3bt4jOf+Qzbtm3j937v91i3bh0bN2485bHHLxD8zDPPnPSYfJCXPbH2dj8F5V0E9r/p7FiyBAIB9hYtYEn0oLvFiYg3ZWi281TmiT3++OP4fD727NnD8PAw/f39bNq0ieXLl7N8+XKstXzuc5/jrLPOYv/+/QC88MILE6MdlyxZQiwWY/v27RPH5Ju8DLG+ziLC1X3OoI6GBigpAeBg7ULOadvFSDJJKD00VURkNk1lntgFF1zAokWLaG1t5eDBg7S2thKNRifCqKuri/Lycm677Ta2bt06cdy5557Lnj176O7uZsWKFdTW1uZlgEGehli8t5L5zf0TIxOP6l+0hIVtT/H8lje4+D0rXKxQRDwnQ7OdV69ezbPPPktFRQUtLS1s2rTpHfPEPvWpT1FQ8M5fz/PmzeOxxx6jubmZc845h7q6OoaGhvjRj340MfcMnHArKSnhtdde44orrjjmmHyTd/PEkuNjBIuG+Y1rtvPi8x+Fyy6DH/wAgB9//ttcc++dPPS1v+fjf3bLjNsSyRWaJ5ZdmieWXZon9jZ72rsgWcKSmgS0t0Nz88TP5v7WuwAY3fyGW+WJiEgG5V2Ibd8bAWBl0RFnx7JlEz8790MXkaCI8K433ShNREQyLO9CbMdeZ27YeabT2dHSMvGzwsIgr/mbmdN5wI3SREQkw/IuxN48MAJAy1AHGHPMwA6AXeEFNMc04VlEcsM999zDAw88wEMPPcRf/uVfMjQ0dNLvrl+/fmJF+uPng82mtWvXEo1GT/iz/fv3n/adaMfPh5uJvBud2HYoBUBj7yFYsACKio75+f6a+TQM/Bv09EBNjRsliogHfe3fXuP19oEpHXP2nDK+etWxIwLfPk/sYx/7GD/72c+44447+MEPfsBv//Zv8+tf//qYeWSbNm0ikUiwePHiY97/9cILL5BMJlm+fDklJSVs2rSJgoICYrEY3d3dfP3rXycQCHDgwAH+6q/+irPPPptbbrmFL3/5y6xbt441a9Zw7bXX8vDDD3PBBRcwZ84ctm7dSmVlJZFIhJtuuon/+I//IJVK0d7ezt13380HPvABPv3pT7N7924efvhhbrzxRioqKnjxxRfZuHEjS5YsYeHChbz00kts3ryZrq4udu7cyejoKNdffz1f+MIXuPnmm98xH24m8q4n1nHEjwn3ULB39zG3Eo/qnL8QgOSvt77jZyIi2bZhwwYWL15MY2Mjhw8f5uyzz+aaa66htbWV1atXH/PzPXv2sGPHDtasWcPVV19Nc3MzV1999cT7v1avXs1jjz3GD3/4Qz7xiU/w5JNPUl1dTXFxMZ2dziOVuro65s2bR29vL6OjoxN1HB2ZvmrVKm6//XZ+8YtfAHD11Vdzww038NRTT7F3717+4A/+gPLycnp6ejj//PO5/vrraW5unggwgMWLF1NZWUlvby+LFi3i3e9+NytXriQWi1FeXs6vf/1rAC655BKuuuqqiflwMw0wyMOeWLQnRKi8F3buhFveOYx+5NxmeAY6nnmBeZddOvsFiognHd+jmq7j54k98cQTp/x5W1sb9913H0uWLJl4/1dVVRXgvEcsFAoxOjpKaWkpH/nIR4jFYlRXV1NXVwdAZ2cn4XCYQ4cO0d/fTzKZ5JFHHqGrqwuAZ599lo6ODt773vfyyiuv8Oijj9LR0cFnPvMZRkdH+fa3v01/fz81NTX4fE6/Z9myZTzwwAPcdtttVFZW0tHRQWlpKa+88gq1tbW88sorvPjii+zYsYPm5maSySTAxPGnmw83FXk3T6ysZRtNtpPX93wYvvtduOOOY36+9sHNfOq2Kxn4rffQ8vTGGbcnkgs0Tyy78nWe2DPPPEM0GuXaa68FnGdda9asmehhzZaZzBPLu57YSCzMOZV7nI0T3E5c0VzBNs7n7J2ZeQGniIhXfeADHzhme+3ata7UMRN590wsOVjGOSY9+vBtc8SOOn9pDa9wHvUd++BtrwAXERHvyasQGxsfxyYqWT5+wBmVmH74+XaL55bzijmb4HgSdu1yoUoREcmUvAqxtq4opAIsHTnkLDfle+ffns9neLUkHW7bts1ugSIiklF59UzszfYoUM38gYNw0ckfcB+oqWEs5qfgtddmrTYR8bZMzRM73j333ENpaSklJSUcOnSIO++8k6Lj5rcetX79elpbW2ltbWXDhg1cf/31U6onU6Y7ACQbA0fyKsT2H4kRYJSa6JETPg87qqh2lK4D1cxJz6MQEZkt+TjZuaenh7vuuoumpiaWLl3K1q1baWxsZMuWLdx111380z/9E6FQiOeeey6jq3VAnoXYwY4Ei3kTX2r8hCMTj6quHaXH1jCnu3sWqxMRL8vUPLG3vxTz7ZOdt27dyurVq/mzP/uzY16auWPHDu69914AIpEIra2tx0x2/upXv0ogEOBLX/oSN998M1dddRXxeJzOzk6ampomNdn5lltu4fOf/zxlZWVcffXVjIyMTEx2vvfee7n77ruPmey8Y8eOYyY7P/PMM4RCIaqrqzl06BAAH/vYx6irq2PHjh3s2rWLBx54gIMHD2bkGr5dXj0Ta+8cYRk7nY1T9MQa56TosfUkO7tmqTIREcfq1asnXmDZcoL/2D7+52eddRb33Xcf//7v/z4x2bmtrQ14a7Lz2NjYaSc7d3V1nXSy891338173/teAB599FG+973v8cEPfpAlS5accrJzX18fAO9///sBGB4e5rzzzgPAGIMxhlQqxbJly3jkkUcm1n3MpLya7Hz1mp+x/L6tfIs/gmgUystP+L1Prn2Oy772ba5auJnifXtn1KZILtBk5+zSZOfs0mTntJ5eSwu7sHV1mJMEGMDi+YX0UIOvp3cWqxMRL7PWYoxxu4yMyoXJzjPtSOXV7cRon6HGdwTT2HjK7y1fVE43tQTjA5rwLCKnFQgEGB4edruMvDQ8PEwgEJj28XnVE+vvC1DqH4Di4lN+75xFVfycGnzWQiQC6XvHIiInUlNTw/79+90uI281nqbjcSp5FWLx/kLCvjiEq0/5veZ5lXSbSrA47xVTiInIKVRUVMz6cyKZnLy6nTgcC1Ni4qftifn9hr7idH739MxCZSIikg15FWJj8RJKGIJw+LTfHShPh5jmiomIeFbehJi1lvGhUooZOm1PDGCkptD5oJ6YiIhn5U2IJZJDMFRB8fjwpHpiNCrERES8Lm9CrL23H2wBoUmGWEVDAf2UkUzPjBcREe/JmxA72BWjgCSB1Nikbic2NvjooYZYW/ssVCciItmQNyHW3p0gTNzZmERPrKkxSA81jBzWSvYiIl6VNyF2pHuIYhLOxiR6YouaiummFrT0lIiIZ+VNiHX2jkypJ7Z0Xhk91BDs78tyZSIiki15E2I9kbEp9cSWLaikm1pKBqPZLUxERLImY8tOGWMuBK4DioGvWGvjxph7gA6gyVr7uUy1dSK9kfGpPROrLaXHVBAaG4FEYlLBJyIiuSWTPbEbgLXARuDS9L4CoATI+oOnaNROqSfm8xkihem5Ylq1Q0TEkzJ9O/H4F8McsNZ+DTjhy72MMbcaYzYbYzYnk8kZNdzf76PEH3E2JjPZGYiWaMKziIiXZTLEHsHpiV0DNBljfMBiY8ydwAlfxGOtfdBau9Jau3Im75MBiA34KQ2mO3yTDLFEuUJMRMTLMvZMzFq7Bdhy3O4/yNT5TycRC1AajMIQk36+NVIdhj3odqKIiEflzejEocEQZYEBZ2OSPTHTWAJAqqsrW2WJiEgW5U2IjcaLKA8OOhuT7IkVzy1hlACx/YeyWJmIiGRL3oRYMl5CeUEcfD4IhSZ1zNy5QbqoI7bvYJarExGRbMiLELPWkhoqpawg/S4xYyZ13Pw5hXRSz1i7VrIXEfGivAix4bERGK6g3De5tzoftaSplE7q8XdpYIeIiBflRYh198cgFaDUTO6tzkctW1BBJ/UU90eyWJ2IiGRLXoRYZ5+z3FTYjEypJ9Y8r5JO6imNR8EeP09bRERyXV6EWFdkCIASOzKlnlhRqICuQAnBVBKi0SxVJyIi2ZIXIdbd5ywIUpyaWk8MoLc4/f1OvRxTRMRr8iLEevtHACgaG55yiEXL0j03hZiIiOfkRYhFoqMAFI4NT/mVKvEq9cRERLwqL0Ksr38cgODIEJSWTunYsfoy54NCTETEc/IixKKxMQACw3EoKZnSsYGmEsbwM3LocDZKExGRLMqLEBvoTwEWXyI+5Z5YQ0OAbmoZ2NuWneJERCRr8iPEYlDEECaVmnJPbN6cIJ3UM3KoPUvViYhItuRFiMXjhhJf+oWYUwyxhXOL6aQe06mlp0REvCY/QmzQR1kw/XbmKYbY0nlldFJPYV9vFioTEZFsyosQS8T9lB8NsSk+E1u+ML301GBES0+JiHhMXoTYSKKA8mCfszHFnlhDZSmdvkqC40kYGMhCdSIiki15EmJBKgJRZ2OKIebzGboLtWqHiIgX5UWIjQ6FqAime1FTDDGAvlKFmIiIF+VFiI0NF1JRMOhsTPGZGECsQiEmIuJFeRFi48PFVPidd4pNpyc2XJdeP7GjI4NViYhItuVFiKWGw1T60z2xaYSYaSxhHB9WISYi4imeD7GRsREYLaHcNwQ+HxQWTvkctQ1+uqllcN+hLFQoIiLZ4vkQ6x2MwXiIcpNewd6YKZ9jTmMBHTQw1KZFgEVEvMTzIdYZSQBQZoamdSsRYH5jIR00YI/odqKIiJd4PsS60iFWyvC0Q2zxvDAdNBDs1fqJIiJe4vkQ644OA1A6Pv2eWMv8CjpooHSgV0tPiYh4iOdDrKdvBIDi8eFpzREDaJlXTSe1FKTGoK8vk+WJiEgWeT7EIv2jABSPTb8nFg4V0hnSXDEREa/JgxBLAhAanX6IAfSEi5wPWrVDRMQzPB9i0f5xAIIjiRmFWLQiHWLqiYmIeIbnQ2wglgKgIBGf9jMxgESNbieKiHiN50MsFrOAxcQHIRye9nlMXYgRgnDkSOaKExGRrMqDEDOETT/GWigvn/Z5austXdSR7NBcMRERr/B8iCUSPspD6VuAZWXTPk99vaGHGhKHdDtRRMQrvB9ig36qAl3OxgxCbN6cIL1Uk+zQ6EQREa/wfIgNxwuoDPY6GzO4nbhwbhE91OCL9GaoMhERyTbPh9jIUICqQMTZmEFPbElTGT3UEBqIZqYwERHJOs+H2OhQiMpAv7MxgxBbtqCSHmoIDw3A2FiGqhMRkWzyfIglh4qoKph5iM2rrqbHn54sHYlkoDIREck2z4fY+HAh1f4BZ2MGIeb3+YkUBZ2Nnp4MVCYiItlWkKkTGWMuBK4DioGvWGvjxpjrgfnAfmvtjzLV1tulRsJU+gadjRmEGEB/SRAGUYiJiHhEJntiNwBrgY3Apel9n8CJhRMyxtxqjNlsjNmcTCan3GByPAkjpVSYuLNah98/9arfJlEecj4oxEREPCHTtxOPf6NkyFr7t7wVasd+2doHrbUrrbUrA4HAlBvrS8RgrMgJsRn2wgBGawudD70aZi8i4gUZu50IPILTEysG9hljfMATxpg7gawsSNgRGQSqKLeJjISYaSgGINXV4/2HhSIiZ4CMhZi1dguw5bjdf52p859IV2QIgLLxOFTOPMQq5gQZJIw92Mn018MXEZHZ4ukOR0/UCbGSscz0xBobCuihhsGD7TM+l4iIZJ+nQ6y7bwSAcDIxoyWnjpo/p5Aeakge6ZrxuUREJPs8HWK90VEAikYyM7BjcVOYXqoxGtghIuIJng6x6ICzPFRweDAjIdY8v5weaggO9M34XCIikn2eDrG+/jHAEkhkKMTm1tBDFSXx6IzPJSIi2efpEOsfSBEmjkmlMhJiFUVl9AQLCSfjMDqagQpFRCSbPB1isUFLGel1EzMwsMMYQ19ResKzVu0QEcl5ng6xwRiUk35+VZqZmV39pekQ6+7OyPlERCR7vB1igz4qA+nFQCorM3LOWEXY+dDZmZHziYhI9ng6xIbiPqoC6TldGQqx0TqFmIiIV3g7xBIBagrSz64qKjJyTjvXGSAyclAhJiKS6zwdYiPxAFUF6YnJGQqx0qYShgkxsPdQRs4nIiLZk8lV7Gfd6HCQan/E2chQiDXNCdJJPRxQiImI5DpP98SSQ4VU+/qhqAhCoYycc8HcIjqpJ9Wh24kiIrnO0yE2PlRMlenP2KAOgKXzSumknoJeDbEXEcl13g6xkSIqiWXsViJA87wKuqgjPKBFgEVEcp1nQ2wsNQYjpVSkYhntiTVV1dLpL6dsqA9SqYydV0REMs+zITYwPAjJEirGM9sTKw4U01VYTIEdh0gkY+cVEZHM82yIdUYGASgdG8xoTwwgEi5KN6LBHSIiucy7IdaXAKB0JLM9MYD+ivT6iQoxEZGcdsoQM8Z80RjzI2PMlbNV0GR19w1jSFE0MpjxEEtUaekpEREvOF1P7Gxr7WrgqtkoZip6+oYpJYbPpjJ+O3GssQSA8XaFmIhILjtdiNUYY64A6o0xV6Q/54Te/lEqiDobGe6JFTaFSVJAYn9HRs8rIiKZdbplpx4DaoF/Tf/VZr2iSYpEk1QefZdYhntijY1BuqjDv/8QmXlLmYiIZMMpQ8xa+w+zVchURQfGstYTm5deP7H28OGMnldERDLLs6MT+wdSWQuxRU1h2plDQZeeiYmI5DLPhtjAQIoihpyN4uKMnrt5XjntzKG4TyEmIpLLPBtisThvhVhRUUbP3TK3nnZTR2miD5LJjJ5bREQyx7MhFh/0UezvdzYyHGI1xdUcCYXxYTVXTEQkh3k2xBKDfooL0iFWWJjRcxtj6AqnJzy3t2f03CIikjmeDbGhhJ9wQczZyHBPDCBS4Ux4VoiJiOQuz4bYSCJIsT8BBQXOnwxL1KRD7MiRjJ9bREQyw7MhNpoIEvYnMn4r8Sg7p4RxfNjD6omJiOQqz4ZYcihEiT+RlVuJANUNBXRSz/D+Q1k5v4iIzJxnQ2xsuIiwbyhrIdbUGKCdOQztb8vK+UVEZOY8G2Kp4TDFvpGshdiCuUUcoRGrpadERHKWJ0NsPDWOHQ0TNsNZeya2tKmMduYQ6unKyvlFRGTmPBlisZFBGC0hTPZ6YmctqqKdOZQM9sHoaFbaEBGRmfFkiHVH42D9FDGavRBbUEM7Dc6GVu0QEclJngyxzr44QFZDrDBYQGdRemFhTXgWEclJngyxroiz8G9hajRrz8QAesrT51aIiYjkJE+GWHd0GIDC8ew9EwMYqE2fW6t2iIjkJE+GWKTfGWgRzHKI2TkhxvCrJyYikqMyFmLGmAuNMX9hjPkbY0w4vc8YY+4xxqzJVDsAkajzjq+CZPaeiQHUzoFO6km2aa6YiEguymRP7AZgLbARuDS97w7gX052gDHmVmPMZmPM5uQUXj7Z1z8GQEFyJKvPxJqaDO3MIb73QNbaEBGR6cv07UR79IMxpgpoBq4A3m+MCb3jy9Y+aK1daa1dGQgEJt3IQGwcsPhHhrPaE1s8P0Q7cxjXIsAiIjkpk+8weQSnJ1YM7AOi1to7jTELgWuttSOZaqh/wFKIM7gjmyF21uIyjtBIqOeXWWtDRESmL2MhZq3dAmw5wf79wLpMtQMQi/FWiGXxduL5zTU8whxK4lFn1Y5gMGttiYjI1HlydGI8bijyR5yNLPbEWuY00O6vcjY6OrLWjoiITI83Q2zQR0kw6mxkMcQK/H46w+nza5i9iEjO8WSIDcULCIf6nI0shhhAtEqrdoiI5CpPhthIooCSUMzZyOIzMYBEfdj5oBATEck53gyxoRClgUFnI8s9Mf+8MGP4sQoxEZGc48kQSw6FKA/OTojNnefnCI3E9mjCs4hIrvFkiI0NF1IWTDgbWQ6xxfNDHKGRxJttWW1HRESmzpMhNj4cpiyQ/XliAMsXl3KYufjatX6iiEiu8VyIJceTMFJCWTC9AEiWe2LnLa2mjfmU9naAtac/QEREZo3nQmxgJAajJZQVzE6Inb+0jjYzl6LRIejvz2pbIiIyNZ4LsZ6BGKQClM9SiBUGAxwuLnE2Dh7MalsiIjI1nguxjl5nQEdZQfrVLVl+JgbQXVXsfGjT4A4RkVziuRDrijgDOsr9o+D3z8qivAON6Z6YQkxEJKd4LsQ6I0MAlJkRCIfBmKy36VsUZpQAqf0KMRGRXOK5EOuNjgJQyggUF89Km/MX+jjMXPp3vDkr7YmIyOR4LsQifWMAlJB0emKzoHlxiDbmM7p336y0JyIik+O9EOt3QiycGpm1EDuvpZw25hM4cmhW2hMRkcnxXIj196cAKBobnrXbie8+u5E25lMe7YLx8VlpU0RETs9zITYw4Pw1MDo0az2xRbX1HAxW4LfjesOziEgO8VyIxWI+8CXxDSdmLcSMMXSUp9vSMHsRkZzhuRAbjPnwFQ5i4vFZCzGAaF16rtj+/bPWpoiInJrnQiwxWIC/KAHx+Kw9EwMYWlgFgN2rYfYiIrnCcyE2HA8SKBqCxOzdTgSoX1JEO40Mbt8xa22KiMipeS7ERuJBQsXDTk9sFkOsZXEhe1jK0Os7Z61NERE5Nc+F2OhQEaVFcRgbm9XbiectK2cvSwgdPDBrbYqIyKl5LsTGhoqpKkqPs5/FntjFKxrYw1LK+7udW5kiIuI6z4VYajhMdZGzCPBshtiSOdXsDdY5G29qcIeISC7wVIilbAo7XEp1YdzZMYshZozhcHX69uWePbPWroiInJynQiyaGIRkmOqg806x2XwmBhCZV+Z82Lt3VtsVEZET81SIHekZBKA6lA6xWeyJAZQ1h4hQydgu9cRERHKBp0KsI+IMqKgJOe8Um+0QW97iZw9LGdj2+qy2KyIiJ+apEOvsdQZ01PjTPbHy8llt/4KznGH2RrcTRURygrdCrM/pidX6R5wdZWWz2v4lrfXsooXy3iMwMjKrbYuIyDt5KsR6Ik5wVBt3Qqx1yVx2+efhsykN7hARyQHeCrG+JACVpEOstHRW2/f7fByoTgfnrl2z2raIiLyTp0IsEh0DoCI14gzq8PtnvYaeeenncDu1hqKIiNs8FWLR/nEASsaGZv1W4lEVzQV0UM/YDoWYiIjbPBVi/eklEwPDg66F2NlnG3ayjMGtr7rSvoiIvMVTIRaLGUwohokNuBZiv3F+KbtooeBNTXgWEXGbp0IsPlBAQVECBtwLsUt/Yz47WUbJYB/09blSg4iIODwVYomBEMFw3NUQW1RXx55wpbOhEYoiIq7yVIgNDxZSWDrkhNgsD68/yhjDkTnp5a4UYiIirirI1ImMMRcC1wHFwFestXFjzKeBasBaa/9ipm2MxsNUzR2BTvd6YgBjy8sZ2+3Ht+MNb/1XgIhInsnk7+AbgLXARuBSAGvt/cA3gaZMNDCWKCVcmnT1diJAy7kh9rGIvi3bXatBREQyfzvRvn3DGFMI3J3+8w7GmFuNMZuNMZuTyeQpTzyeGscOlVNfEofxcVdDbFVrBTtZxthrO1yrQUREMhtij+D0xK4BmowxPmADMAJcdqIDrLUPWmtXWmtXBgKBU548OhSDkXLmFqcni1VXZ67yKfrwqnlsZwVVR/bD6KhrdYiInOky9kzMWrsF2HLc7msydf62zgGggqaQ82JMqqoydeopa2mqYXvRPAJDY/D669Da6lotIiJnMs+MSzjcFQdgTsD9EDPGsG9+hbOxbZtrdYiInOk8FGLOu8Tm+p0wczPEAOz55SQoYnTzVlfrEBE5k3kmxDp7nGdPdb7cCLGVFxXzKucS/c+XXK1DRORM5p0Q63XeIVZnh5wdLofYFe+bwzbOp3jna2Dt6Q8QEZGM80yIdfU4Q/CrxxMQCkFRkav1fOhdS9hW0ELJ0AAcPuxqLSIiZyrPhFhvxHmXWPlo3OmFGeNqPcGCAnY3pHuDL7/sai0iImcqz4RYXxTwjxKI9bl+K/Go/hUNjONj/L/0XExExA2eCbH+qA9/UQwTieRMiJ2zKsx2VtD3xM/dLkVE5IzkmRAbHAgQCMehpydnQuzqD9byPBcTfmWrsxSWiIjMKs+E2FAsSGHJMHR2QkOD2+UA8JF3t/BC8ByKRuPOyh0iIjKrPBNiI7ESyssHnZ5Yfb3b5QAQLAiwY3Gts/H88+4WIyJyBvJEiFlrScYqWRjucuZk5UhPDKB0VQVd1DK46ZdulyIicsbxRIjFk3FIVLO4uMfZkSM9MYDLPlDO81zM6C/+0+1SRETOOJ4IsUM9EUiGWRSMODtyqCf2iSuW8Z9cTFVnG3R0uF2OiMgZxRMhtvdwPwALC/qcHTnUE2uqqeCl+nnOxrPPuluMiMgZxhMhtr/dWfR3rnHCLJdCDGDo4nIGCTP8s01ulyIickbxRIgdPOIs+ts4HoVwGEpK3C3oOB/5SDnPcQmxnzztdikiImcUT4TYkU5n8d+6wR5oanK5mnf61HXn8ktzCbWHdkN3t9vliIicMTwRYp3dKQDKetthwQKXq3mnOdXlPD9vibPx05+6W4yIyBnEEyHW3Q34xihoP5iTIQYQuryOLmqJbNjodikiImcMT4RYT1eAkpJDmK4umD/f7XJO6JM3NvAEl1Pw1FOQSrldjojIGcETIdbfU0xz6Q5nI0d7Yte97xyeLL2QsqEovKRXs4iIzAZPhFgiUs7y4jedjRztifl9Ptret4gRgsQf+me3yxEROSPkfIhZa0n2V3ORL90Ta2lxt6BTWP0/F/AkH2b0hxt0S1FEZBbkfIh1x6IQr+Wyvl/CBRdAY6PbJZ3U7f9jBY8Vf4jKaCe8+KLb5YiI5L2cD7FX93VTRzdndb0K11zjdjmnFCjwc+DD80hQRPQ7D7pdjohI3sv5EHtjXz9X8u/4sDkfYgCfvbOFR/gdQv/yKAwMuF2OiEhey/kQ27kvxo08zGDjfDj/fLfLOa2Pvv8c1jdeRlFyiNRDP3S7HBGRvJbzIRZ9uY3f5OeM/+5NYIzb5UzKkv/VwFZa6fnmfc5LPEVEJCtyPsTe9dLP8WEp+/TvuV3KpP31H17E/aGPU9e2E555xu1yRETyVm6H2OgoH937EzYFL8YsWuh2NZNWVRrmwPXL6aCeji9/1e1yRETyVm6H2KOPMifZzd83/Y7blUzZ/Xet4j7/bTS89KxW8BARyZLcDbHxcey3vsVrZhk7zlrpdjVTtrSpim03ttJFLUduuUPPxkREsiB3Q+yhhzDbt/N1u5aFi/xuVzMtf3/fb/G1wjU0vr6Z5D9vcLscEZG8k5shFovBn/4pR5Ys51E+xrtbS92uaFoaKssp+OrF/IqVJD55O3R1uV2SiEheyc0Q+9KX4PBhvvOeT2LxcdmquW5XNG33fun9/OG5n6FwOMHh/36jbiuKiGRQ7oXYj38MDzwAn/sc/9p/LiaY4PzlZW5XNW0+n+H+f7ucPw79CXOff5rIH/6p2yWJiOSN3Aqxbdvg4x+Hiy6Cu+7i0J5KSpsO4sutKqfsnIX1tPzzlfyjuZGqv/kG0b/9O7dLEhHJC7kTD6lxuPRSKC+H//t/iaaSDO5vYfFZ+bH+4Kf++7t47S9/n6f5Tco+fSvdf/Ndt0sSEfG83AmxRAIKCmDTJmhq4qGfbYfhSi7/YKHblWXMN7/0m/z0W1/mZ3yQ2i98ll3X3Qyjo26XJSLiWbkTYj4f/OpXEy+9/Nf/iALwyesWu1hU5n3zi5ex75FvcF/wk7T86z+wr7aFnn/5f26XJSLiSbkTYsXFMNcZhZiyKZ57soHw3H0sXRB2ubDM+9T1F3H57m/yyRXfIDXgp+aj17C18UL2PviPMDbmdnkiIp6ROyHGWyvU3///XmTkwIVc97sRF+vJrmXzq/k/r/wx//nYj/hq42ep6ehmyW030Ruq5afLL2fTH/4V0Vd3aki+iMgpGJuhX5LGmAuB64Bi4CvW2rgx5vNACrDW2vtOdXzVgrNs5MAOfvnqHi777QSj3QtobwvRUJM/z8RO5ann9/DzP/kh5/5qMx9JPEsF/QB0m0oOFDXRWVlPf30D1Nfgb6giNLeG4oZaSqrLKakoo7gqTFFFCSXVpRSVhAkEghivD+uUSbv+ey8AsOG2VS5XIjIzxpgt1tpJrzVYkMG2bwD+GLgYuBTYCMyz1n7OGHPv6Q6ODVpMwQiMLwX/CN94YC8NNWdnsLzc9qGLl/KhZ5wV71954zD/8IMnGfv5dur3v8ncgS7OPbyTeYefdt5wPUkpDCl8E3/G8ac/v7XfMrV3tGXt+4Yp/J1Nr5Z8Nvo7fwRAx+25//ZzkUzKZIjByX8PnXC/MeZW4FaAYO1SLvofz1FXHeB/37aMVeefOQF2vPOWz+W8bx77/jRroatngN3bd9O79wix/d2Md0cYjcUZjw9hhkcww0n8w6P4xpIwnoJUypm6kLL4rMWkLD6bmtj2pVIn+Qdm3/a/bzEn7LWfPEjMVGJpincETnzuMzfU+kPOggC/aFJPTDzu4NQGumXyduK7gGtxbifuA+4H7sT5XZiy1n77VMcfvZ0oIlOn24mSL1y7nWit3QJsOW73aW8jioiITJee/IuIiGcpxERExLMUYiIi4lkKMRER8SyFmIiIeJZCTEREPEshJiIinqUQExERz1KIiYiIZ2Vs2amZMsbEgJ1u1+ExNUCP20V4kK7b1OmaTY+u29Qts9aWTvbLmV4AeCZ2TmW9LAFjzGZds6nTdZs6XbPp0XWbOmPM5ql8X7cTRUTEsxRiIiLiWbkUYg+6XYAH6ZpNj67b1OmaTY+u29RN6ZrlzMAOERGRqcqlnpiIiMiUuDI60RhzIXAdzlugv2KtjRtjPg+kAGutvc+NunLdSa7bp4FqnOv2F64WmKNOct0M8C3gsLV2nZv15aKTXLPrgfnAfmvtj1wtMEed5LrdA3QATdbaz7laYA4yxrQAfwJstNZuTO+7CWd6Qtha++enOt6tntgNwFpgI3Bpet+89C+Tha5U5A3vuG7W2vuBbwJNrlWV+07079sdwL+4VI8XnOiafQIYdKkerzjRdSsASoBed0rKbdbaXcD643a3Wmv/GsAYU3Gq4928nXiyh3F6SHdqx1wfY0whcHf6j5zcxHUzxlQBzcAVwPuNMSHXqsptx/9/MWSt/Vve+uUsJ3b8dTtgrf0aUO5GMR532jxwa7LzIzj/tVIM7DPG+IA2Y8waYL9LNXnBia7bBuA14DLg++6VltOOuW5A1Fp7pzFmIXCttXbExdpy1Yn+XXvCGHMncMTNwnLcia7b4vR1G3azsFxljGkAPgoUGWPKgSeBl40xXwCw1kZPebxGJ4qIiFdpdKKIiHiWQkxERDxLISYiIp6lEBMREc9SiImIiGcpxERExLMUYiIi4ln/HwSJAApkZUJuAAAAAElFTkSuQmCC", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "grid points NUM (output):178.0\n", "grid points FFT (output):94.0\n" ] }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "grid points NUM (output):237.0\n", "grid points FFT (output):133.0\n" ] }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "grid points NUM (output):336.0\n", "grid points FFT (output):210.0\n" ] }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAbEAAAEhCAYAAADxtp7yAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAAsTAAALEwEAmpwYAAA5DklEQVR4nO3dd1xW5f/H8dfFBjeae4K4ByoOXDjLLV9zYe6VpaVmaT/LpNSsNFOzNEfiyEQzzVyluXAi7oHi3rgQRRFZ1++PmyxLE/SGw4HP8/G4Hz7gPve5356H8uY693Wdo7TWCCGEEGZkY3QAIYQQ4nlJiQkhhDAtKTEhhBCmJSUmhBDCtKTEhBBCmJaUmBBCCNOyMzpASjhmzakrlilpdAwh0rUzN+4D4PZSFoOTCJFye/fuvam1fim525uqxLLkLkBISIjRMYRI1zp9txOAwNe9DU4iRMoppc6nZHs5nSiEEMK0TDUSE0III1y7do2IiAijY2RYrq6u5MuX77leKyUmhBDPEBERQalSpbC1tTU6SoaTkJBAWFjYc5eYnE4UQohkkAJLHS96XGUkJoQQyTBk3RAOhB9I0Ws883syudnkx77n7+/PkCFDyJkz5/NnGTKEN954gwcPHuDp6WnVfZuNlJgQQqShkydPsmjRImrXrs2YMWPo1asXGzZsYPLkyUyePBlfX1+WLFmCg4MDkZGR+Pv7A3DlyhXGjx9PmTJlALh69SqRkZGsXr2aHDlyUKlSpUf77tKlS6YpMikxIYRIhn+OqJ6Xh4cHXbp0ITIykjp16tCqVSs2bNgAwJ+3xvrjjz/w8/MjPDyc2NhYHBwcCAoKol27dnh7e/P+++8/2l/16tU5fPgwERERj/adWQoM5DMxIYRIU6VLl2bGjBncvn0bGxvLj+BKlSrx7bffEhwcDEDTpk25f/8+7u7uODg4AFCvXj1+//13AgMDH9tfZGQkjo6OHD9+/LF9ZxbKTDfFdC1WVkecD7XqPhPiE4l5GIOTgz229vZW3bcQRpDFztYXGhpK2bJljY6RYf39+Cql9mqtvZL72kxzOjEhIYG1c1YSPvc38p46SfHIy+SLv8VL3CILliKPxpmbKhc37XNxMXsBbhYqhF3lUpRpV5/qrWpjYysDVyGESE8yfIldOHuBDa+NoXbwRlolnAHgnE1hwrIW53iO0kRnzw4O9iQmauwfPMD5bhS57kVQKeI4xW7+gc1BDfPhusrN/hzluFLRE/c32lK3Y0MpNSGEMFiGLbG4uHjmtnmX/61bSG9usd25GvMbvkuND7tTxrsixZOxj9vXItj+0x9cXbUL1wOhVLoeyitBQRD0NWe7FmF34WrY+TWj9Uc9cXRxTO2/khBCiH/IkCV28thJztTqRf+o7Wxz9mLf2Om88k4H6qRwP7nyudJqYAcY2AGwzBwKXruNI1OXU3B3CK0urCfr5yu4/vmHbCxaG4cerWn7YU9sHTLkYRUiUxsyBA4cSNlrPD1h8uSUvMcQJqfkBSnY76hRo9i/fz9NmjR59P2AgAA8PT0fW2tmNhnup+3ezXtwaNKNRgmnWdBkCK+tnYiNnXVW2iulqNGiHjVa1APgRvgNlo6cRe6VG2l9YQNZxqzkwtjRbKz0MhU/H0C1V2pa5X2FEBnH9u3bWbt2LUopevTowaxZsyhWrBje3t4cO3aMgIAAunbtip2dHQEBAVy8eJGIiAj69u3LrFmzHltPNnDgQJo1a8b+/fupVasWhw8f5uuvvwYgOjqa9957j4oVK3L79m2ioqI4cuQIYWFhxMXFUbJkSU6ePMmFCxfIkycPhQsXNvjIPJ8MVWKhh0JxatKFognh/PbhdLqN6Zuq7/dS/pfo9f1IYCTXLl4ncMS3FP91Hd0PzoNm89iYtQZX2rfl1SlDcM7unKpZhBCpy1oDpMDAQDw9PYmJieHUqVN4eXlx9uxZoqKiKFeuHD179nxs+1atWgGwd+/eR9/7c1Z58eLFeeutt3jjjTfo378/gwcPfrTN4cOH8fLyolevXhz42xCyWrVqBAUFcfPmTTw8PPD09DRtgUE6WCemlPJUSvm/6H6iHzzgsndvPBLOs3n0t7RK5QL7p3xF8tJ7kT+Nonaxb9125lfuTsn7F+kaMJLbOUsQUK0vJ/edSNNMQoj0p0OHDoSHhwNQqlQp7ty5g729PaGhoRQtWpRp06YRHx//aHulFEopEhMT/7WezD5pWZCjo+Ojbf9UsWJFjh49yuLFi4mOjn70/YiICJydnTl+/Dju7u4EBgZy4cKFVP97p5ZUWSemlCoFjARWABeAdoALMApoDLyctOlHWusIpdQArfWMZ+33v9aJTav5OoOCZxLY9v/otOJTK/wtXtzDmIcEvvs1heYto/G9XcTgyKoCjcj1yQAa921jdDyRQck6MeuTdWKp60XWiaXKSExrHQYEJH3pB/hjKbSmWuuVWutBSY8IpVQJoKJSquCT9qWU6q+UClFKhcTFxT3x/dYv/50+wfPZkKseHX8eZ+2/znNzdHKk+7R3aRy1k40L1rCiSHOaX91C435t2Zq1BktHzCIxIdHomEIIYVppdTrxqcM9rfVZrfVArfWVpzw/U2vtpbX2sn/KFTXu9J2IRlHsl+koG/XEbYzWqGtzOl9YzrXDR5hZox8loy/Q4Yv+7HXxZH6/CcTHxT97J0IIIR6TKiWmlMoPtAdaA6uwjMTaAhus/V6Bs3/ifxF/sLpiOzzqlbf27q3OrUIJ+u+eifONUGY3H4pr/B26zx7OCZdyzO00mofRD42OKIQQppFapxPDk04X9tFab9Faj9JaD9Na37P2e8WPmkssDtRflH5OIyZHrty56LtmEoWiTjC300cA9FryCZeylSKg3SgpMyEyoSFDhjz2dVhYGIMGDeLgwYP07t2byZMns2LFiv987T8vELx58+anviYjMPUU+5D9R2kbvoXfir2Mb4ViRsd5Lk4uTvRa/DHxcaOY++aXVJo/n57LxxKW/Qd2dOzJawEjsZfF00IYz0qrnVOyTmz16tXY2Nhw6tQpYmJiuHPnDhs3bqRMmTKUKVMGrTVDhw6lbNmynDt3DoCdO3c+mu3o7u5OVFQUhw8ffvSajMbwKfYvYsvwmWTlPoX/L22n06cGO3s7es0agWf0IQL6juOhsqfnj6MJy1KOeb0/lQkgQmQQgYGBuLm5UaBAgUfrxO7du/fYOjE7O8svrlWqVKFRo0ZUq1aNGjVq4OPjQ6NGjR6V0fXr18mRIwevv/46+fPnf/QeFSpUwN7enhs3buDh4fHYazIaU5dYtW07OGVbDK/+rYyOYjW2trb0nDWSMvePMLfLx9jpBHrM/YBDzhVYMvhrdKJ5bp0jRIYyeTJs3pyyxxNWSKd0ndjfFSlShA0bNnD06FEA8ubNy4MHD1i6dOmjfYKl3LJmzcrx48f/9ZqMxrT3E9u2LQTvejX5qUp3Ou2ba3Cy1PMw+iE/dB2Dzy8LcE+8wDZnL+5+OoIWQ9obHU2kU7JOzPpknVjqSnfrxNLCzgnLsCWRkgPaGR0lVTm6ONL757G8FHGEmU3exiPmHC2GdmBlnqbs/CXI6HhCCGEo05ZY/p0HiSQ7VXs1NzpKmsieIxv9108h7vQ+5lbsSuNbO6jm25gf3NsTdiDM6HhCCGEIU5bYg7gYKt88x2HXCij7zDVzr3CJIvQ6tIAzQdtZUfgVOp9ZTt4q1fm+1gAir0caHU8IIdKUKUts1abdlNcniKpQwegohqlY15OOF38laMEadueoRO/d33E3f3kWdh0rMxmFMJEJEyYwY8YMFi5cyGeffcaDBw+eum1AQMCjK9L/cz1YWvL39ycyMvKJz507d+6Z90T753q4F2HKYczxwB3YkkjBlg2NjmK4Bl1fga6v8OOHMyj9xdd0/WEUO5f9zN0vPuCVt141Op4QGcbHvx7l2JW7KXpNuYLZGd368SsJ/X2dWMeOHVm/fj0DBw5k7ty5tGzZkn379j22jmzjxo1ER0fj5ub22P2/du7cSVxcHGXKlCFr1qxs3LgROzs7oqKiuHHjBmPGjMHe3p7z588zceJEypUrR69evXj//feZPHkyQ4YMwdfXl0WLFlGlShUKFizI/v37yZUrFxEREfTo0YM1a9aQmJjIlStXGD9+PA0aNODNN9/k5MmTLFq0iC5dupAzZ0527drFihUrcHd3p3jx4gQHBxMSEsL169c5ceIEsbGxdOrUiWHDhtGzZ89/rYd7EaYciTnsPg1AOT8psT/5jR1A+bv7mNXqPdweXqTp2x1YVrAlobuOGB1NCPE3f18ndvnyZcqVK0fbtm3x9PSkQ4cO/1pHFhoaypAhQ2jTpg0eHh60adPm0f2/OnTowE8//cQPP/xAt27d+O2338idOzcuLi5cu3YNsEzDL1KkCLdu3SI2NvZRjj9npnt7e/PGG2+wZcsWANq0aYOfnx8bNmzg9OnTvP322+TIkYObN29SuXJlOnXqhIeHx6MCA3BzcyNXrlzcunWLEiVKUKNGDby8vIiKiiJHjhzs27cPgDp16tC6det/rYd7EaYciblduMBF2wIUKZLP6CjpiqOTI/1+/YKLpwexsMVwOof9zEPvrXxfqwvtV08gu2t2oyMKYVr/HFE9rw4dOhAUFETOnDkpVaoU69at+8/nL1y4wJQpU3B3d390/y9XV1fAch8xR0dHYmNjyZYtG82bNycqKorcuXOTN29eAK5du0aWLFm4dOkSd+7cIS4ujsWLF3P9+nUAgoKCCA8Pp27duhw6dIglS5YQHh7OoEGDiI2NZerUqdy5c4c8efJgY2MZ95QuXZoZM2bw+uuvkytXLsLDw8mWLRuHDh3ipZde4tChQ+zatYvQ0FA8PDz48w4kf77+z/VwAwYMeOEiM906scun9nHSqSq3XV/C58ZWoyOla9t+2si9vv40uxPEKZtiBPd/C79v3km3V/oX1iHrxKwvo64T27x5M5GRkfj6+gKWz7qGDBnyaISVVjLVOrEDF05RNPEqDwqa93baaaVu+0Y0i9zKj+9OI9bGni4z3mVrDm92Lt1idDQhRDrQoEGDRwUGlhJL6wJ7UaYrsb07zpKTOzh6mPOCv0bwmzCQYrcPMtNnIJXvhVKtY1MWlO/Gzcs3jY4mhBAvxHQldmX3OQDyV8uYF7NMLVmyutB/8zQu7wpiZb5GdDu2kPtFPVnQ7wuZki+EMC3TldjDY5YZN8W9pcSeR/malWgfvo6f/Gdz1yYL3WaPYFOuuuz4ebPR0YQQIsVMNzvR5fItAJzLyOnEF9F+dB8evNuF2S3eo+PW+Ti++goBFTvS5vfJuObPbXQ8IdIda60T+6cJEyaQLVs2smbNyqVLlxg8eDDOzs5P3DYgIABPT088PT0JDAykU6dOKcpjLc87ASQ1Jo6YrsRcb0cQgyNOSdNHxfNzzuJM3y3TOLK9PyfbDafn4YWcLbSZ3we8Q+dvhhodT4gMKSMudr558ybjxo2jcOHClCxZkv3791OgQAH27t3LuHHjWLBgAY6Ojmzfvt2qV+sAE5ZYoXsRXHHMj5uN6c6EplsV6lSiwrV1LPloFuXHT6Dzt++wbtEvFFj2FZUbVTE6nhDpgrXWiQUGBuLp6UlMTMxji533799Phw4d+Oijjx49/+di56+++gqAiIgIPD09H1vsPHr0aOzt7Rk+fDg9e/akdevW3L9/n2vXrlG4cOFkLXbu1asX77zzDtmzZ6dNmzY8fPjw0WLnr776ivHjxz+22Dk0NPSxxc6bN2/G0dGR3Llzc+nSJQA6duxI3rx5CQ0NJSwsjBkzZnDx4kWrHMO/M1kTaIrG3uJ6lgJGB8mQOn7Sj2K39jGrZl/qRwbj1rg+3zcYTGxMnNHRhMgw/nlTzGc9X7ZsWaZMmcKqVaseLXa+cOEC8Ndi5/j4+Gcudr5+/fpTFzuPHz+eunXrArBkyRK+++47GjdujLu7+38udr59+zYAPj4+AMTExFCpUiUAlFIopUhMTKR06dIsXrz40XUfrclUi51zFi2tj1+M5KB7HV459bPRcTK0nWu2cq/z+zSN2sk+h/Jc+/Jjmg+SazGagSx2tj5Z7Jy6Ms1iZ52YSH6uc6eou9FRMjzvFvVpfHsbc7r6UyDuBi+/1ZEfSnYg/NxVo6MJYQgz/cKfXOlhsfOLHldzlVjSeqaE0jK9Pi3Y2NrQZ8Fo4o4Fs7RoK/xOLyPOrRoLX59gdDQh0pS9vT0xMTFGx8iQYmJisLe3f+7Xm2tiR6KlxJyrVjY4SOZStEwxip7/hRWfLcB91Di6zhzO2qWrKPjzJCo3qGZ0PCFSXZ48eTh37pzRMTKsAgWef56D6Uosiqzk9yxndJJMyff9bkQPfJXvmw6l8+4FJDRsQECjPry2ZgL2js//m5QQ6V3OnDlNd03BzMJUpxOV1oRSlnx5XIyOkmm5ZHOh967v2L9iHcFZK9Bz4xQO5PBi84LfjY4mhMiETFViNjqRo5QnWzajk4g6bevTMHI7s9p/QImHl6jdvRXzqvTh/p37RkcTQmQipioxBVJi6YiNrQ39lo7lxp6trM7jQ48D33M2T1VWTwo0OpoQIpMwVYkBhNp44OhodArxd2W9yvO/G+uZ/+YX5Ey4S7NhXfjBoyM3Lt8wOpoQIoMzXYmFuZQwOoJ4iu7fvIc+uZslRVvx2qmlRBWtxpL/m2F0LCFEBmZ4iSml2iulXlVK5XzWthoId5EL/6ZnRdyL4nf+F5aOnkWCsqXjZ2/wU6GWXAg9Z3Q0IUQGlColppQqpZQKUEr5KqWqKqXGKqUmKaWyKKXaKKWmJT1cgZpANPDMKYeJ2ODgnJAakYWVdfDvS+7Le5lfxg/fK79hX74mC/t+ZnQsIUQGkyolprUOAwKSvvQD/IEVQFOt9Uqt9aCkRwRwDHACnnieUCnVXykVopQKiVc22NtnvEu/ZFSu+VzpHrqI9V8Hcs0uN13n/B9rcjciLDjU6GhCiAwirU4nPrV5tNZztdbLtdbbn/L8TK21l9baKxZ7XuDqJMIgzQe9SqlbIcyp3ptGETvIU7M28zuPQSfKLyRCiBeTWqcT8wPtgdbAKiwjsbbAhhfdt73Di+5BGMElmwt9guewfeFyTjoWoXvgR/zm2pDju44ZHU0IYWKpdToxPOl0YR+t9Rat9Sit9TCt9b0X27PCwUF+ezezxq81p/LtYGbV7o/Pnd3k9a7DvE4fy6hMCPFcDJ+dmFIyEjM/J2cn+m3/jp2LlhPmWJQeS/z5PXcDju04YnQ0IYTJmK7EHOQzsQyjkV8zqkQGM7v269SPDCZ/nXoEdPInMemWO0II8SwmKzGFg4MyOoSwIkcnR/pun8HuH38hzKk4PZd8zO+5G3B0x2GjowkhTMBcJabBUUosQ2rQ+WWq3t7N7Dpv4HNnDwXq1Gdux1EyKhNC/CdzlRjg6CglllE5ODnQd9u3BAeuIsypOL2WjuX33A04sv2Q0dGEEOmU+UpMRmIZnk/HxlS9vZs5dQfic2cPherWZ37H0TKDUQjxLyYrMYWTg8kii+fi4ORAn6BpBAeu4rhTCbov/YTfczeQdWVCiMeYrhGcnGyNjiDSkGVUtouZdQZQPzKYPN71WNDzc6NjCSHSCfOVmKPpIosX5OjkSP9t09mx4CfOOxSg27z3+SXvK1w4dt7oaEIIg5msERTOjjISy6wad21J2Vu7mVOlBy1ubMS2Qi0WD51mdCwhhIFMVmLgJCWWqblkzUKffQH89vVCIm2z0XnyWwQW8eXa+WtGRxNCGMB0JeZoL7MTBbQa1IlCV3czv3RHOlxayX236iwfE2B0LCFEGjNdidnbmy6ySCU58+Si+/FAfv5kNhpF2496s7BUJyJvRhodTQiRRkzXCLY2MhITj2s/qjdZzuwisEgbup5cwtX8XqyZutToWEKINCAlJjKE/MUK4HdhBYuGTiVbYjQvD/YjwLMH0VHRRkcTQqQi85WYrekiizTUZdJbJBzZwa95m9Dz4HyO56nO5oXrjI4lhEglpmsEWxvTRRZprFi54vzv2joCeo6nSOw1anXzJaD+QOJj44yOJoSwMtM1gq2tnE4UydNz7vtc37mZTTlq0jPoW4Jz1mT/uj1GxxJCWJH5Skw+ExMpUL5WBV65tYmZbUZQ/sFp3Js3Zl47uZiwEBmF6UrMRkpMpJCNrQ39f/mMo6t+5bBzSXos/4Q1eZpw5tAZo6MJIV6QCUvM6ATCrGq3rE/12zuZXbMvTW8H4eRZm8Ch3xgdSwjxAkxXCVJi4kU4ODrSd9csNkxfxG3b7HSaPIjFxV8lIjzC6GhCiOdgukpQcjZRWEGLAe0pcGUXC93b0fn8z1wvXIO105YZHUsIkUKmKzEZiQlrcX3Jla6nlrFo+DSyJt6nyVudCajel9gHD42OJoRIJtNVgpSYsLYunw8k7vB21uTxoWfIHPa51mLXyiCjYwkhksF0lSCnE0VqKFHejTbX1/N9p48oE3OG8m1bMLfNCBITEo2OJoT4D6YrMRmJidSilKL34o85/ft69ruUodevX/BbnoaE7Qs1OpoQ4ilMVwlSYiK1VWtag9qRO5lT500aRe4iu5cPi96aZHQsIcQTmK4S5HSiSAt29nb02fYNW2cv44atK12mDSOwWFtuXblpdDQhxN+YrsRkJCbSUtM+rSgaHsx8j050uPArEUWrs27yEqNjCSGSGFYJSilPpZT/n38m93VSYiKt5cidne5hiwkcOR3HxFiaDO3C/Op9iY2Rq+ILYTSrVoJSqpRSKkAp5auUqqqUGquUmqSUyqKUaqOUmpb0cNVaHwDC//zzP/bZXykVopQKsXxtzcRCJJ/fuNeJPxLEr3ka0j1kDiG5arFvrVwVXwgjWbXEtNZhQEDSl36AP7ACaKq1Xqm1HpT0iFBKlQAqKqXqJP1Z8Cn7nKm19tJae4GMxISx3Mq54Xv9d2a3H0mFmJO4t2jCfL8xRscSItNK7Up46v0utNZntdYDtdbbk/68kpwdSokJoyml6Lt0HEdX/UqoUwm6L/6I5fmac+X0ZaOjCZHpWPt0Yn6gPdAaWIVlJNYW2GC997DWnoR4Md4tfah8cyffe3an9fX1PCzlzcrxC42OJUSmYu3TieFJpwv7aK23aK1Haa2Haa3vWes9ZCQm0hPnLM703j+PleNno4GWI3swz7MnD6Pl+otCpAXTVYKUmEiP2r3fE/uwbazI15QeB+dx0LUGwau2Gx1LiAzPdJUgpxNFelXEvSivhq9jrt9oSj08R5nWzQloPwqd+NSPhoUQL8h0JSYjMZHe9Vrkz8nf1nHI2YOey8ayKl9TLpw4b3QsITIk01WClJgwg+ove1M9YgdzvHrT7OYWdLk6/Pzx90bHEiLDMV0lyOlEYRaOTo702TOHtRPnE4s9vv59mV+hK9FR0UZHEyLDMF2JyUhMmE2bYX5kPb2DZQVa0P3oDxzLU5MdP28yOpYQGYLpKkFKTJhRgeIF6HBlFfN6jMUt9hKVXm3NXN//k5tuCvGCTFcJcjpRmFmPgA84t349+1zK0euXz1ibrwkXj50zOpYQpmW6EpORmDC7qk28qHVrG7Nq9KPprW2oCt6sGD3X6FhCmJLpKkFKTGQEDk4O9Ns9kzVfzee+jTNtPunDwgrdiLkXY3Q0IUzFdJUgpxNFRuI7pDPZTm9jaYHmdD26kKN5qhPyq1zpQ4jkMl2JyUhMZDQFixWk4+VVzO7mT4mHlyjdphmLOo0GLVf6EOJZTFcJUmIiI1JK0Xf+aE6sXcV+pzJ0WfIJq/K/zPWzybpDkRCZlukqQU4niozMu1kdvG5tZbpnL5pd30R0yRqs/3KR0bGESLdMV2IyEhMZnYuLM2/s/54lY2aTgB2N3u3G4pq9SHgYZ3Q0IdId01WClJjILLp82JPEI5v5KfcrdA4OYK9rdU5s2Wt0LCHSFdNVgpxOFJmJR9nidLi+mimtP6B09FnyN2jIiv7jjI4lRLphuhKTkZjIbGxsFINXjmXnjz9z1N4D31kfsrrYK0SF3zQ6mhCGM10lSImJzKpZ58aUDt/ENx49aXZhAzeKVGXXnOVGxxLCUKarBDmdKDKz3K7ZGRg2l1lDv8UmAbz6dmB54/4kxsUbHU0IQ5iuxGQkJgQMmPQ6ETt/Z0W2Jvxv4yyC81Tn0r4jRscSIs2ZrhKkxISwqFqzDG1uruJzn/cpf/cUWbzqsH7El0bHEiJNma4S5HSiEH9xcLBjxObxrJ6+hJM2bjT94l0i9hxGx8vpRZE5mK7EZCQmxL91HtCcfGfX83XhHrhGRxCzI4TQn38zOpYQqc50lSAlJsSTFSuSh4Hn53IhX0lstMb91db8/upgSJS7R4uMy3SVIKcThXg6GxtF0TKFiK5UgdXODXn556nszleDqFPnjI4mRKowXYnJSEyIZ8uVKxsNry3H33MYFW6G8rB0FfZ9PtvoWEJYnekqQUpMiOTJmc0F//0TmTl6NucpStX3+7G5ejv0/WijowlhNaarBDmdKETKDPX3Q+9fzhTXrjQIWc6pl8pzY/Muo2MJYRX/WWJKKTulVAel1LdKqQVKqVFKqVLWeGOllKdSyl8p1V4p9apSKmeyApuudoUwnlclNwaEz2XYK5+R5cFDsjf0Ye/rI2XShzC9Z1XCV8ADYBzwOrACaK+UavakjZVSpZRSAUopX6VUVaXUWKXUJKVUFqVUG6XUtKSHq9b6ABAO1ASiAZdkBZYSE+K5ONrb8eW6EayePZ/f7XyoNnM8+91qk3g13OhoQjy3Z1XCCOAycEVrHa21Pqy1/lRrve5JG2utw4CApC/9AH8sxddUa71Saz0o6RGhlCoBVAQiASegxJP2qZTqr5QKUUqFWL5OyV9PCPFP/fo0odTphYwo+i5lzh/kVtHyXJ63xOhYQjyXZ5VYANAMGP+c+9dPfULrs1rrgVrrcVrr5Vrr7U/ZbqbW2ktr7QUyEhPCGkoXzcunZz9nRLdpXIkvRKGenTjY4jWIiTE6mhAp8qxKuKG1Hg84J2dnSqn8QHugNbAKy0isLbDhBTL+4z2stSchMjdbGxumzu/DsV/nMtW5J5XXLuJ0wfLEHThkdDQhks3uGc+/rJRaAngqpQoAaK07Pm1jrXU4MOhv39ry4hEfJyUmhHX5tarGlYtT6NmgLJ8f+ZL4qjW4Osqfov4j5D+cSPf+cySmtfbQWnfUWpdK+vOpBZZW5P+UENZXMHd25h56j8+Hf8dm6lP0k//jhKcP3LhhdDQh/tOzpth/ppTyUkrZJ32dRynVWynVNG3iCSHSilKKSZ/7ooO+4d0c/0fxQ7u5WaQMD1atMTqaEE/1rM/EPgO8gR+UUsuB0cAhrfX6VE8mhDBEizoefHjpI16r/y3XHubHuXVLznd7HWJjjY4mxL8863RiJDAH6AV0BQZrrUPSIJcQwkA5szrx05Y+LJ74DdNte1Ns4UwulqgIJ04YHU2IxyRnwvpWYHHSI1gp9UHqRhJCpBdjhjXA88AndCowBecrt4gu58ndKd+AfurqGSHSVHJKbK3WurXWujWwBsieypmEEOmId4VCzDv3Jn18v2NHYh2yDxnEJZ9XICLC6GhCJKvESiiluimlumG5qoZco0aITMbJwY5flr/KgYAvGO74EXmDNhNRvDSJGzcZHU1kcskpsT7AbSAC6Ku1/ip1Iwkh0qt3e1Sl+7FBNC/5PTeiXKFxY+4Mfhfi4oyOJjKp5JTYy0B3oBuWS1AJITKxCm4v8dvxLrzf5yvm0IscU7/kRoVqcOqU0dFEJpScEmudtNC5M1JiQgjAztaG5bNboFcMpkOWGdiGXSK6XCUS5wbIpA+RppJTYs5KqaJKqaJAltQOJIQwj/5tK/HFyY68XHkOwXE1sOndi7tt20NkpNHRRCbxrCt2tAB2AcuSHsFpEUoIYR4lCuQieJ8v04eNZKTNx7j8+gt3PcrDtm1GRxOZwLNGYi8B94BpSY+7qZ5ICGE6NjaKwIkvU/G3V/FxXcyNm04k1PchYdRoiI83Op7IwP7zKvZa63lpFUQIYX5+TcrjE1aYl32deG/bUnqM/YT7a9aRZVkgFC9udDyRAcktJoUQVlUwdw4Ob23JJv8e+Nl+T/y+UB6Wqwg//mh0NJEBSYkJIaxOKUXA6EZ03OhN9ZeWE/KgEnTpQkK37hAVZXQ8kYFIiQkhUs3/6pdh+8ma9Gn8Mf6MhoU/EFO+IuzebXQ0kUFIiQkhUtVLObISur4xV8c1xMduLeGXEkmsXQfGjYOEBKPjCZOTEhNCpDqlFN+N9GFkkBu18v9EYGIH+PBDEho0hIsXjY4nTExKTAiRZlrUKsmxExUY06wf3ZlH9Pa9xFeoBD/9ZHQ0YVJSYkKINOWazYVjaxuRc4IbVey3sS/KDTp0gL594f59o+MJk5ESE0IYYuq7dZmxPSdNCn/POEaSOOd7EqtUgb17jY4mTERKTAhhmCZeJbgYWprA1k1pxEaunrlLYi1vmDABEhONjidMQEpMCGGoHFmcOLSyAdUnO1LRbhfLE5vB8OHw8stw5YrR8UQ6JyUmhEgXJgz2ZsUuW3oU+ZS+zOLB5u0kVqwEK1caHU2kY1JiQoh0o75nEcJDS7H/fx54JhzgUFReaNsW3nwToqONjifSISkxIUS6ktXZgb0/+9Dx27vUst3IBNu3YPp0qF4dDh0yOp5IZ6TEhBDp0pg3qrMpOJExxfvRlN+5cTocXb06TJkid48Wj0iJCSHSLe+KBbl2tCz3OjlQ7uFxVtvUgSFDoEULuHbN6HgiHZASE0Kka86Oduxc7MNbM8/TRi3hTdtJxG7YCJUqwZo1RscTBjOsxJRS3kqpAUqpakopf6NyCCHM4aN+XuzeG8cPbo2oEr+PE9FZoWVLy8gsJsboeMIgVi0xpVQppVSAUspXKVVVKTVWKTVJKZVFKdVGKTUt6eGqtd4J2AJngHBr5hBCZEzVyxYg/HA5cvhdo/K9w3yTpbvlM7KaNeHoUaPjCQNYtcS01mFAQNKXfoA/sAJoqrVeqbUelPSIUEoNwlJiJYGKSqmCT9qnUqq/UipEKRVizaxCCHNydrRnx6JGfPj9Ed5iIi1sl3H39EXw8rLMYpRJH5lKap9OfOq/Jq31NK31VK31Hq31QK31E5fma61naq29tNZeqRdTCGE2H/aqwe6QWLaXLI7H/VC2unha1pP5+sLNm0bHE2nE2qcT8wPtgdbAKiwjsbbABmu+jxBCAFQvU4hrhyri3vUQDSKCeDfbhySsXWeZ9LFBfuxkBtY+nRiedLqwj9Z6i9Z6lNZ6mNb6njXfRwgh/uTkYM+OBU0ZE7CHSXoQVfUWrsY7QtOm8N57EBtrdESRimSKvRAiQ/ighzfBe+M4V9IO9xtHWVSoHUycCN7ecOKE0fFEKpESE0JkGF6lCnPtYGU8X9vOa5eX0iHXdGJPn4WqVWH2bJn0kQFJiQkhMhQnB3t2LGzKx3N2syz2VYrfD+ZEgXLQr5/lDtIREUZHFFYkJSaEyJA+6u3Nrj0Pued2l7KndzPR4030L79A5cqwebPR8YSVSIkJITKsGmULE36oAtU7b+S9k99QJ9cS7it7aNQIPvgA4uKMjihekJSYECJDc3F0YPePTfho5k523a9PvvDt7PJqBZ9+CnXrwunTRkcUL0BKTAiRKXzcz5vtwdGoYtfx3rOSdzw/QYeFgacnzJ8vkz5MSkpMCJFpeJcvQvjhsnh12MhXB0ZRynk5t0uVhx494LXX4M4doyOKFJISE0JkKlmcHNizpBEjv93J6cjK5DmylrXNX4clSyyTPrZvNzqiSAEpMSFEpjTuDW+27o7CufAlWqydQVfvr0m0sYH69cHfH+LjjY4okkFKTAiRadWtWJTwI6Wp0m4TP2x7g4Lxiwlv7gsffww+PnDunNERxTNIiQkhMrWszg7sW9aQEVN3ce1GaQr88T0/dveHI0cspxcXLzY6ovgPUmJCCAF89lYtNu+8g0u+y3SZP5pWNb8joVx58POzTPyIijI6ongCKTEhhEji41mUq0fdqdRmC6vXd8b16rdcGDAEFi6EKlUgONjoiOIfpMSEEOJvsmdx5OAvPgybtIu74SUoPu8jZg751nJ1jzp1LIukExKMjimSSIkJIcQTTBxaiz+2R+KU5xqvT3qdBpWnEe/7P8vlqho3hosXjY4okBITQoinalStGFePlaBCi61s+bU1rvs+4PS4ryAkxDLp46efjI6Y6UmJCSHEf8iR1ZHDq+vz9oQdRF1yw2NcN74eOR9KlrTc2qVfP7h/3+iYmZaUmBBCJMOUd2uzbutNHHPd5O0P2lHfbTzxw0fAnDmWm27u22d0xExJSkwIIZLplZoluHSsCKWabiEosDF5VvgRFvCTZSRWqxZMnAiJiUbHzFSkxIQQIgVyZ3fhxO8+9Bu7lTtnS1LmzfpMHbkQWreG996DV16BK1eMjplpSIkJIcRzmPlBfX7ZeAX77BEMHlSfhlkGEz99BuzYAZUqwcqVRkfMFKTEhBDiObWp68GFowUo0WArmxfUJ9/XNTm54g8oWhTatoU334ToaKNjZmhSYkII8QLy5crG6T986PbRRiJOlqLMq258M3QODBsG06dD9epw6JDRMTMsKTEhhHhBSinmf9yIxevOYut8l0E9KtH8bjsS1v4GERFQowZMnSp3j04FUmJCCGElnRqV58zRPBSuE8S6WbUp+P5LnFm7DZo2hcGDoWVLuHbN6JgZipSYEEJYUeE8OTm/xYf2w9dz/WhZSjVwYW7fCTBtGmzaZJn0sXat0TEzDCkxIYSwMhsbxdLPm/L9LyfALpbe7dxpf6oKibuDIW9eaNEChgyBmBijo5qelJgQQqSSXi0qc+JQVvJWCWbZ5NoU6x/DpdWb4O23YcoUqFkTjh0zOqapSYkJIUQqci+YmyvB3jR7cz2X9njiVi2apW3eglWr4OpVqFbNMotRJn08F8NKTCnlrZQaoJQaoZR6VSmV06gsQgiRmmxtbFj7TVOmLD5EQpwdHZsVptcuV/TBQ+DjY1lP5usLN28aHdV0rFpiSqlSSqkApZSvUqqqUmqsUmqSUiqLUqqNUmpa0sNVa70TsAVKAtGAS/Lew5qJhRAi7bzdoRoH99uSq/QhAsZ6U6rLGW4uWgZffQXr1lkmfWzYYHRMU7FqiWmtw4CApC/9AH9gBdBUa71Saz0o6RGhlBqEpcTCACegxJP2qZTqr5QKUUqFWDOrEEIYoUKJfFzdX5V6PTZwanMtCle4ytqavrB7N+TMaZmOP3w4xMYaHdUUUvt04lNP8mqtp2mtp2qtJ2itl2uttz9lu5laay+ttVfqxRRCiLTjaG/H1oAmjJsbQuzdHLRokIfBv8dYbrY5YABMmADe3nDihNFR0z1rn07MD7QHWgOrsIzE2gIyPhZCiH8Y2bMGu/bEkq3YKaaOqEXFDvu4O3EKLF8O585Z7lM2Z45M+vgP1j6dGJ50urCP1nqL1nqU1nqY1vqeNd9HCCEyihplC3H1UDmqtd/IkTV1KVDuDFuLe1mut1irFvTtCx07wu3bRkdNl2SKvRBCGCyLkwMhSxvx/rSdRF/PTwPvbHz4yxVYvx4+/xxWrLBM+tiyxeio6Y6UmBBCpBPjB3qzaccdnPJeZtzA6tToFMSDwe/Azp3g7AwNG8IHH0BcnNFR0w0pMSGESEcaVCnGlaNulGuxmT0/+ZC/4lFCshaCffugVy/49FOoWxdOnzY6arogJSaEEOlMzqxOHF3dgDc/28bd8+7U8LLji+VhlkkeS5ZAWBh4esL8+Zl+0oeUmBBCpFPfjKjLqk3XcMgeyYjunjTstZlY33Zw8CBUqQI9esBrr8GdO0ZHNYyUmBBCpGMta7tz4WhB3Hx2sDmgAQWr7udYorPlti5jxlhGZp6esGOH0VENISUmhBDpXN5cWTi5sQ7dP9jGreMVqOgZz7crjsCHH8K2bZbr8dWrBx9/DPHxRsdNU1JiQghhAjY2inlj67J4zQVs7WMZ2LE8rQZtIrFGTThwwHJa0d8fGjSwLJTOJKTEhBDCRDo1LcXpo7ko6LWX1d80pFDN3ZyP1pZJHgsXWhZJV64MixcbHTVNSIkJIYTJFMmbnYs7a+D79lbC91WjZIVIFv123DIaO3gQypcHPz/LxI+oKKPjpiopMSGEMCEbG8XyKfX5btlxdII9r7UqTrcPtpFYrDhs3QoffWQZmVWpAsHBRsdNNVJiQghhYv19K3LkgAO5yx5m4ad18Wi4k+tRsZZJHps3W67uUacOjB8PCQlGx7U6KTEhhDC5MsXycHVfVRr23siZoJoULXeVNTvOWWYsHjwI7drByJHQuDFcvGh0XKuSEhNCiAzA3s6WjXMa8dm8fcTey0bLBi/x9udJN9pcvBjmzrXcr6xyZVi2zOi4ViMlJoQQGciIbtXZvSeObMXD+Pr9mlRsuZ270XHQsyfs3w/u7tC+PfTrB/fvGx33hUmJCSFEBlO9TCHCD5enWocNHFlThwLlzhJ04Ap4eMD27fD++5brMFatarmwsIlJiQkhRAbk4uhAyJImDJ+2jejrefHxzoL/jP3g4GCZ5PHHH5aRWK1a8OWXkJhodOTnIiUmhBAZ2OcD67Jh222c8l7k4zeqULvTDmIeJljuTXbwILRqBe++C82awdWrRsdNMSkxIYTI4BpXc+PyUTdKN9vAziW1KVD5GEdOR0Du3JZJHt99Z7kGY6VK8OuvRsdNESkxIYTIBHJldSF0TWP6jN1I5Bk3KnsmMC3wqOXiwf37Wz4bK1wY2rSBgQPhwQOjIyeLlJgQQmQSSilmf9CIpevPY+tyh7f8ytDqje0kJGgoUwZ27YJhw+Dbb8HLy3IdxnROSkwIITKZ9j7lOHM0D4VqbWf1jDoUqbGX8+F3wdERJk6E336DW7egRg2YOjVd3z1aSkwIITKhwnlycmFbPdoO3cDVg5UoWf4ugb+ftDz58suWUViTJjB4sGXyx/XrxgZ+CikxIYTIpGxsFCsmNWH6T0dJTFR0blGUXqN2WgZeefNaJnlMm2aZjl+xIqxbZ3Tkf5ESE0KITG6AbxUO7bcjV9mDBIz1plTjnUTcjbFM+hg40HK5qrx5oXlzGDoUYmKMjvyIlJgQQgjKF8/H1X1VqddjA6c21aRQ2Yv8sSfpYsEVKlhu5/LWWzB5MtSsCceOGZr3T1JiQgghAHC0t2NrQBM+mbOHh5GuNKmXgxFTku5F5uxsmeSxahVcuQLVqsH06YZP+pASE0II8ZhRvWuybXc0WQqd44shNfBqF8SDh/GWJ1u2hMOHoX59ePNN8PWFmzcNyyolJoQQ4l9qVyjC1cOlqdhmI3uX1yN/hVD2Hr9meTJ/fli7FiZNskz2qFTJMvnDAFJiQgghniibiyOHfmnEoC+CuHuhONW97Ji44IDlSRsbyySP3bshRw5o2hSGD4fY2DTNaFiJKaUqK6X6K6XqKqX8jcohhBDiv339Xj1+3XQN++wRvNejEk37biU+Iemq956esHev5dJVEyZA7doQFpZm2axaYkqpUkqpAKWUr1KqqlJqrFJqklIqi1KqjVJqWtLDFQgDXIHwpMfT9tlfKRWilAqxZlYhhBDJ16p2SS4cLUCxujvYMKc+Bavt49Sl25YnXVxgxgxYvhzOnoUqVSz3K0uDSR9WLTGtdRgQkPSlH+APrACaaq1Xaq0HJT0igPLATSA3UFEpVfAp+5yptfbSWntZM6sQQoiUyZcrK2c216HziC3cOFKRMpXuM2916F8b+PparvRRsyb07QsdO8Lt26maKbVPJz61hrXWIVrr2Vrr3VrrgVrrK6mcRQghxAuysVH8+JkPAStPAZqebd3pPGIriYlJP+4LFYL16+Gzz2DFCsukjy1bUi+PNXemlMoPtAdaA6uwjMTaAhus+T5CCCGM1aNFeY4fysJLFQ4Q+EV93BvsIDzinuVJW1sYMQJ27AAnJ8sNOD/8EOLirJ7D2qcTw5NOF/bRWm/RWo/SWg/TWt+z5vsIIYQwXsnCrlzZ60WTvps4t60WxcuHs2r76b82qF4d9u+HXr1g3DioVw9On376Dp+DTLEXQgjx3OxsbVg/qyFfzDtIbFQOWjfKx9sTdvy1QdaslkkegYFw/LhlNuOCBVab9CElJoQQ4oW9160qwSHxZC96hq+H16ZS6y1ERT/8a4OOHS2TPqpUge7d4bXX4M6dF35fKTEhhBBW4VWmAFcPl6Vauy0cXuVDgQph7Dh86a8NihaFTZtgzBhYssQyKtux46n7Sw4pMSGEEFbj4mRPyDIf3pu8m/tXilG3ljNjv9/z1wa2tpZJHkFBllu91KsHn3wC8fHP9X5SYkIIIazui8E1WR90G8dctxjVpxr1e2wiNi7hrw28veHAAejSBUaPhgYN4Pz5FL+PlJgQQohU0aR6MS4dLULJhjsImt+QglX3c/z83654nz27ZZLHwoWWz8sqV07xe0iJCSGESDW5czgT9kddun8YxK3jFajgGcvslUce3+i11yyjsrJlU7x/KTEhhBCpSimYN6YeC1edRdnG0+9/pWn/zpa/rvIB4OZm+ZwshaTEhBBCpInXXilL2KHs5Kuyj2Vf+VC83i6u3vrbtTDs7FK8TykxIYQQaaZEwZxc2l2dZgM2cXFnDYqXv87KoOe/ioeUmBBCiDRlZ2vD2ukNmfTDIeLvZ6Vt4/wMHL/zufYlJSaEEMIQQ/2qELIvkewlwvh2pDcVW8pnYkIIIUykikd+wg9VwKv9Jo6sqZfi10uJCSGEMJSzoz17ljZk+NSUn1KUEhNCCJEufP6Wd4pfIyUmhBDCtKTEhBBCmJaUmBBCCNOSEhNCCGFaUmJCCCFMS0pMCCGEaUmJCSGEMC0pMSGEEKYlJSaEEMK0pMSEEEKYltJaP3urdEIpFQWcMDqHieQBbhodwiTkWKWMHK+UkeOVfKW11tmSu3HKb6NprBNaay+jQ5iFUipEjlfyyLFKGTleKSPHK/mUUiEp2V5OJwohhDAtKTEhhBCmZbYSm2l0AJOR45V8cqxSRo5XysjxSr4UHStTTewQQggh/s5sIzEhhBDikXQ9O1EpVRVoB7gAo7TW95VS7wCJgNZaTzE0YDrylGP1JpAby7Eaa2jAdOYpx0sBXwCXtdaTjcyX3jzleHUCigLntNZLDQ2YjjzlWE0AwoHCWuuhhgZMZ5RSpYCRwAqt9Yqk7/XAsiwhi9b6k/96fXofifkB/sAKoGnS94ok/YApbkii9Otfx0pr/S3wOVDYsFTp15P+bQ0ElhmUJ7170vHqBtwzKE969qRjZQdkBW4ZEyn90lqHAQH/+Lan1vpLAKVUzv96fXovMYCnfWgnH+b922PHRCnlBIxPeoh/e3S8lFKugAfQAvBRSjkalir9+uf/OUet9XT++kEt/vLPY3Vea/0xkMOIMCb2zJ/z6fp0IrAYy280LsBZpZQNcEEpNQQ4Z1ysdOlJxyoQOAq8DMwyLlq69NjxAiK11oOVUsUBX631QwOzpUdP+ve1Tik1GLhqZLB06EnHyi3pWMUYGSw9UkrlB9oDzkqpHMBvwAGl1DAArXXkf75eZicKIYQwKzOcThRCCCGeSEpMCCGEaUmJCSGEMC0pMSGEEKYlJSaEEMK0pMSEEEKYlpSYEEII0/p/0H4IO7WzKWoAAAAASUVORK5CYII=", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "grid points NUM (output):585.0\n", "grid points FFT (output):404.0\n" ] }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "norm_y_sol = get_P(x, dist_sol)\n", "\n", "def plot_P(accuracy_list_num, accuracy_list_fft, time_list_num, time_list_fft):\n", " for t in range(len(grid_size)):\n", " eff_support = accuracy_list_fft[t].effective_support\n", " print(\"grid points NUM (output):\" +str(time_list_num[t][1]))\n", " norm_y_est_num = get_P(x, accuracy_list_num[t] )\n", " print(\"grid points FFT (output):\" +str(time_list_fft[t][1]))\n", " norm_y_est_fft = get_P(x, accuracy_list_fft[t] )\n", " plt.figure()\n", " plt.rcParams['font.size'] = '6'\n", " #plt.autoscale()\n", " fig.tight_layout()\n", " #plt.subplot(1,2,1)\n", " plt.plot(x, norm_y_sol, color= \"green\", label=\"true dist\")\n", " plt.plot(x, norm_y_est_num, color=\"blue\", label=\"est num dist\")\n", " plt.plot(x, norm_y_est_fft, color=\"red\", label=\"est fft dist\")\n", " plt.axvline(x=eff_support[0], label= \"effective support start\")\n", " plt.axvline(x=eff_support[1], label= \"effective support end\")\n", " plt.legend()\n", " plt.ylabel(\"P\", fontsize=7)\n", " plt.xlim((0,1))\n", " plt.show()\n", " plt.close()\n", " plt.figure()\n", " #plt.subplot(1,2,2)\n", " plt.plot(x, norm_y_sol, color= \"green\", label=\"true dist\")\n", " plt.plot(x, norm_y_est_num, color=\"blue\", label=\"est num dist\")\n", " plt.plot(x, norm_y_est_fft, color=\"red\", label=\"est fft dist\")\n", " plt.axvline(x=eff_support[0], label= \"effective support start\")\n", " plt.axvline(x=eff_support[1], label= \"effective support end\")\n", " plt.legend()\n", " plt.xlim((0,1))\n", " plt.yscale(\"log\")\n", " plt.ylabel(\"log(P)\", fontsize=7)\n", " plt.show()\n", "\n", "plot_P(accuracy_num, accuracy_fft, time_num, time_fft)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "I shall now plot the relative difference between the numerical solutions and the known analytical solution, normalizing by the analytical solution plus a constant epsilon. I always use the same vector of points x for comparison. But look at the numerical solution which has been derived using a varying number of grid points (the number of output grid points is iven as output before each plot). I additionally mark the start and end points of the effective support (calculated by the FFT-based convolution function) and zoom in on areas around these points." ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "FFT grid points (output):55.0\n", "NUM grid points (output):139.0\n" ] }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "data": { "image/png": "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ZMgQ/vWvf1FQUFB8XHKWu+fEo3Pnzr69li51v/HG8Fi6dLt3J1It+o553fuOeT3TYVTK3LlzK73N0qXuI0ZUzXfziy++8Lp16/qsWbPc3b1Pnz7+8MMPu7t7u3btfNq0ae7ufv311/ugQYPc3b1Hjx5+2WWXFe+jR48ePmTIEHd3HzVqlO+9997+1Vdf+fr1633ffff1ZcuWubv78uXL3d197dq13qZNm+L5+++/vy+N3kyjRo1KxPftt99627ZtvaioyOfOneu9e/f2H3/80d3dL7vsMn/wwQf9q6++8v3228+/+eYb/+GHH/ywww7zK664Yqv3+utf/9qHDRvm7u5PP/20A2W+bvL02LFjy9xX4n0ffPDB3qFDB+/QoUPx+6lTp07xvFNPPbXENsnvdXuV9dkBiryc3FCrqhPz86FRo1Aaa9QIBg/OdEQikpCoKYGq+W62bNmSgoICADp37sy8efNYtWoVK1eupEePHgCce+659OnTp3ibfv36ldjHySefDEC7du1o06YNe++9NwAHHHAACxcuJC8vj7vvvpvJkycDsHDhQj755BPy8vLKjcvdOfvss7n66qvp3Lkzo0ePZubMmRxyyCEArFu3jj322IO33nqLnj170rRp0+LYPv744632N336dP75z38C8POf/5wmTZpU+liVFrc6MRvUqiQG4XpY8l8RyQ5V/d2sX79+8XTdunVjVZs1alRypIDEPurUqVNif3Xq1GHjxo1MmzaNqVOn8sYbb9CwYUN69uyZson40KFDadasWXFVortz7rnn8sc//rHEelOmTEkZr9Sya2Iikr3y80MJLJ1tA3bddVeaNGlS3CLv4YcfLi6VbYtVq1bRpEkTGjZsyH//+1/efPPNCtd/6qmnmDp1KnfffXfxvGOOOYbHH3+cb775BoAVK1Ywf/58Dj30UF555RWWL1/Ohg0bmDRpUpn7PPLII3nkkUcAeO6554qv8dUWta4kVtVVFiKSWx588EEuvfRS1q5dywEHHMDY7WjpdcIJJzBmzBhat25Nq1at6Nq1a4Xrjxw5ki+//JIuXboAobpy+PDh3HTTTfTq1YvNmzdTr1497r33Xrp27crQoUPp1q0bu+22W3HVaGk33ngj/fv3p02bNhx22GE0b958m99PLjJPasmSzQoLC70qxhP76CO4+moYORJataqCwETSLBfHE/vwww9p3bp1psOQHFTWZ8fMZrp7YVnr17rqxCefhGefDX9FRCS31brqxPPOgzVrwmPZMt30LCKSy2pdSSzRzH7YMN30LCKS62pdSQzUzF5EpKaodSUxERGpOWplElMfiiIiNUOtTGInnwwnnRT+ioikQy4PxZLc5VRRURE9e/YsN4aePXuSuP2pRYsWdO/evcTygoIC2rZtG/+NVlKsJGZmTc3sQDOrl7ZIqpGa2YtIRTZu3Fil+8uWoVjef/99br/9dl588UXatWvHrFmztko6AN988w3PPffcNr3m999/z8KFC4Fwz1e6VZjEzOwSM3sYuBm4BBhnZn82s5ZlrNvJzG4ys5Fm1iiad7WZXWVmg8ysrpn92sz+YGb/z8wKzOzhaPmuaXl35TjvPBgxQg07RGoqDcVS8nUrOxTL4MGDufnmmyt1zBP69u3LxIkTAZgwYQL9+/ffpv3Elaok9o67/8rdL3b3Ie5+FjCYsls19geGAlOA46J5+7n7KKCFu28CpgE/AdYAPwIrgEbAprJe3MwuNrMiMytaunRpZd5XhfLzQwIbOzbcKyYiWWDZMrj99ir7Un7yySdcccUVzJkzh912240nnngCgHPOOYfbbruN999/n3bt2jFs2LDibX788UeKior47W9/C8COO+5IUVERl156Kaeccgr33nsvH3zwAePGjWP58uUAPPDAA8ycOZOioiLuvvvu4vllGT58OLNnz2batGnsvvvuDBw4kA8//JCJEycyY8YMZs+eTd26dRk/fjyLFy/mxhtvZMaMGbz22mvMnTu3zH0OGzaMI444gjlz5nDaaaexYMGCrdZ58skni3uhv+aaaxg+fDj9+vVj9uzZ7LTTTlut361bN3bccUdefvnl+Ac8csYZZxT3qv/UU0/xi1/8otL7qIwKk5i7v2tme5lZPzM7x8zOcfc17v5JeZtUNN/d/w+4AGjt7nPdfRDwHNC3nNe/z90L3b0wMRxBVVHjDpEsU8VfyrhDsUyfPr14mzhDsdSvX794KBaAu+++mw4dOtC1a9fioVgqUnoolhdffLF4KJaCggJefPFFPv/88xJDsey4445bxZYwffp0zj77bKDqhmIBuO6667jppptKzDOzMtdNnp+Xl0eTJk149NFHad26NQ0bNqySeMoT5z6xPwETgJUp1nuUUBJrCHxhZnWABWZ2FTDPzPYCzgcaAB+ZWUdCia0FMHIbYt8uJ58M06apcYdI1qjiGzg1FMv2Ofroo7nuuutK9Myfl5e3VS/5K1asIL9U10f9+vXjiiuuYNy4cWmPM07Djnfc/Wl3f97dny9vJXef6e7Xu/tv3X20u2929zvdfZS73+3uS9z9Fne/wd3Hu/ssdx/h7pe7+6dV+J5iUeMOkSxTDWOxaCiWyrnuuusYMWJE8fNDDjmEGTNmsGTJEiC0XPzhhx/Yb7/9Smx32mmnMWTIEI4//vgqi6U8cUpiZ5jZccBawN29zKq/XKOSmEjtpKFY4jvppJNIvpSz5557ctddd3HSSSexefNmdt55ZyZMmECdOiXLQ40bN+aaa66psjgqEmsoFjNrDODu36c9onJU1VAsCbffHqrfR4zQuGKS3TQUi9QmlR2KJWVJzMyuA/aPphe6+/CqCDTT1H+iiEjui3NNbHd3v8jdLwIapzug6qJm9iIiuS/ONbHdzOzcaDovncFUt0SLXlCVoohILopTErsEWBY9LklvONVLfSiKiOS2VN1O3U7ocqpn9Ni2fkiylJrZi4jktlTViaNLPU/dlDGHqJm9iEhuS1WdeBpwRfQYGD1qDJXERGqfSZMm0bp1a4466igA+vfvT/v27bnzzjsrtZ+VK1fy5z//ufj5V199xZlnnlmlsWbaLbfckrZ9Jw8Zsz1SlcQmAjtu96tkKTWzF6l97r//fv72t79xxBFHsGTJEt555x0+/bTynQYlktjll18OwD777MPjjz9e1eFmhLvj7txyyy38/ve/z3Q4FUrVAfBiwrWwJcCtQI063auZvUjNVdbwJsOHD+e1117jggsuYPDgwfTq1Ysvv/ySgoICXn31VT777DNOOOEEOnfuTPfu3fnvf/8LwNdff81pp51Ghw4d6NChA6+//jrXXnstn332GQUFBQwePJh58+YVD/7YtWtX5syZUxxLYuDINWvWcP7559OlSxc6duzIv/71r63iXrx4MUceeWTxYJKJLrISw6oAPP744wwYMACAAQMGcOmll1JYWMjBBx/M008/DYQBLE855RR69uzJQQcdVKK3/pEjR9K2bVvatm3LqFGjgDB8TatWrTjnnHNo27YtF1xwAevWraOgoICzzjprqzhfeOEFunXrRqdOnejTpw+rV68GQgnrxhtvpFOnTrRr1674GFY0ZMz2iNPEvi1wNPBQ9LdGUTN7kfQa9tQc5n71XZXu82f77MKNv2hT7vLk4U3q1avH5Zdfzvjx47nhhht46aWXuOOOOygsLOSKK66gd+/ezJ49Gwj9GI4ZM4aDDjqIt956i8svv5yXXnqJK6+8kh49ejB58mQ2bdrE6tWrufXWW/nggw+Kt503b17x6/fr14/HHnuMYcOGsXjxYhYvXkxhYSG///3vOfroo3nggQdYuXIlXbp04dhjjy3R8fAjjzzC8ccfzx/+8Ac2bdrE2rVrUx6PefPm8fbbb/PZZ59x1FFHFZcs3377bT744AMaNmzIIYccws9//nPMjLFjx/LWW2/h7hx66KH06NGDJk2a8Mknn/Dggw8Wd581adKk4veXbNmyZdx0001MnTqVRo0acdtttzFy5EhuuOEGAPLz83n33Xf585//zB133MHf//734iFjbrjhBp555hnuv//+lO8rjjhJbBdC0/r/B/SuklfNImrcIVLzJA9vArBu3Tr22GOPCrdZvXo1r7/+On369Cme98MPPwDw0ksv8dBDDwGhR/xdd921wo52+/btS69evRg2bBiPPfZY8bWyF154gSeffJI77rgDgPXr17NgwYIS3SwdcsghnH/++WzYsIFTTz213D4TS79enTp1OOiggzjggAOKSz/HHXcceXnh9t7TTz+d1157DTPjtNNOK06cp59+Oq+++ionn3wy+++/f8r+HwHefPNN5s6dy+GHHw6Ecdi6ddvSLdrpp58OhCFwEmOLTZ8+vXi6KoeMiZPELgUOBToAV1XJq2aRROOOnj1VEhNJh4pKTOlS3vAmFdm8eTO77bZbmSWPytp3333Jy8vj/fffZ+LEiYwZM6Y4rieeeIJWrVqVu+2RRx7J9OnTeeaZZxgwYABXX30155xzTokxu0oP91J6nK/E8/Lml6f0UDTlcXeOO+44JkyYUObyxLA1devWZePGjbH2ua3i3Ox8DyGJHQmMSWs0GaAbnkVqnvKGN6nILrvsQsuWLYuHPHF33nvvveL9/eUvfwFg06ZNrFq1isaNG/P99+X3id6vXz9GjBjBqlWraN++PQDHH38899xzT/H1oFmzZm213fz589lzzz256KKLuPDCC3n33XeB0IP8hx9+yObNm5k8eXKJbSZNmsTmzZv57LPP+Pzzz4uT5H/+8x9WrFjBunXrmDJlCocffjjd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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Absolute difference at end of effective support: 1.7384585683404502e-16\n", "Absolute difference at end plus epsilon of effective support: 1.7384585669999605e-16\n", "Absolute difference at start of effective support: 0.018129135323272576\n", "FFT grid points (output):94.0\n", "NUM grid points (output):178.0\n" ] }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAbEAAAEhCAYAAADxtp7yAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAAsTAAALEwEAmpwYAAAvLUlEQVR4nO3deZwU1bn/8c8DDiCILAOisgjkIsEZYJBFQBESI0bFBRGI1w0X3OMa0BiVJRgVFJdoLjEqqEFFUIka/elVQRTXUdHLYjQoiCwCgyC7A/P8/qiatmeYma6G6Zlu8n2/XvOa7upanq6urqfPqVPnmLsjIiKSiWpUdwAiIiK7S0lMREQylpKYiIhkLCUxERHJWEpiIiKSsZTEREQkYymJ7WXMbLaZXRg+PtPMXq3k9bc2MzezffZgHZPM7Oa455ea2XdmtsnMss3sSDP7Mnx+aqUEnqHMrI+Z/au64yiLmfUzs2+raFtTzGxcVWwr1fb0O5SK73UmUxJLkpktMbPVZlYvbtqFZja7GsMqk7tPdff+VbnNcP9sNbONZrbezN4xs0vMLHasufsl7v7HcP4sYCLQ3933c/cCYCxwf/h8ZlXGX1ni9sOmuL/7IyznZvZfxc/d/S13b5+iGDM+MZjZjXH7d5uZ7Yx7viDF2z4qPL43mNk6M5trZt0reRu7JLzq+F6nMyWx3VMTuGpPV2KBvfEzOMnd6wOHALcD1wMPlzNvM6AOEH/COaTU88j2pISYAieFibj474rqDmhv4+5/Kt6/wCXAu3H7O6d4vsr+rpnZ/sCLwJ+BxkBzYAywvbK2IdHsjSfQqjAB+J2ZNSzrRTPrbWYfhr/QPjSz3nGvzTazW81sLrAFaBv+0rosrELbaGZ/NLOfhb/yfjCzp82sVrh8IzN70czWmNn34eMW5cQxzMzeDh+PLFUqKDSzKeFrDczsYTNbaWbLzWycmdUMX6tpZnea2Voz+wo4MepOcvcN7v48MBQ418xyw3VOCbdxKFBcVbbezN4ws8VAW+CFMM7aCeIbFv4CvtvMCoDR4TJ3mtk3FlRTTjKzfcP5+5nZt2Z2XViiXmlm58Xts33N7C4zWxp+fm/HLdsz/EzWm9mnZtYv6r4o9bn8l5m9Ga5/rZlNC6fPCWf5NHzvQ61UlZ0FJbwRZvaZmW0O90szM3s5PHZeM7NGcfNPN7NV4bbmmFlOOP0i4Eyg+Lh4IZx+sJk9Ex5fX5vZlaX2zZTwuFsIVFjqMLN7zWxZeAx/ZGZ94l4bHR7Xj4VxLzCzbnGvdzGzj8PXphH80El2P5f1XVtiZr8qFcff455H/YwPBXD3J919p7tvdfdX3f2zcD01zOym8DhaHb7PBuXEWVFMxcfE+vBz6mVx3+tw/kTnmz+G35GNZvaqmTVJYjemP3fXXxJ/wBLgV8CzwLhw2oXA7PBxY+B74GxgH+CM8Hl2+Pps4BsgJ3w9C3DgH8D+4fTtwOsEJ/MGwELg3HD5bGAQUBeoD0wHZsbFNxu4MHw8DHi7jPfQElgBHB8+fw74K1APOAD4ALg4fO0S4PNwmcbArDDefSraP2VM/wa4NHw8JW7ftS69vtLrSBDfMGAH8Ntwf+4L3A08H8ZbH3gBuC2cv184/9hw359AcIJrFL7+QLgPmxOUuHsDtcPnBeH8NYBjw+dNk9kP4WtPAn8I11MHOCruNQf+K+55P+DbUut9j6AE2xxYDXwMdAnX9QYwKm7+88N9UBu4B5gX91rscwif1wA+Am4BahEcf18Bx4Wv3w68Fe7XlsD8+NjKeJ9nERyv+wDXAauAOuFro4Ft4f6sCdwGvBe+VgtYClwTfkanA4XxsZazvWHEHe+U/V0r8bmEcfw9fBz5Myb4rhYAjwLHFx8/pfb7v8N9uB/B+eLxso75BDGVmLf0+yTa+WYxQdLdN3x+e3WfRyvzTyWx3XcL8Fsza1pq+onAl+7+uLvvcPcnCZLASXHzTHH3BeHrheG08e7+g7svIDg5vOruX7n7BuBlgpMU7l7g7s+4+xZ33wjcCvSNGnRYqpgJ3OvuL5tZM4Iv7dXuvtndVxMkgd+EiwwB7nH3Ze6+juBksztWEHzhkhIhPoAV7v5nd99BcGK8CLjG3deF++hPpeYvBMa6e6G7vwRsAtpbUN10PnCVuy/34Bf2O+6+neCE/JK7v+TuRe7+v0B+GFt5Zoa/6Iv/hsdt/xDgYHff5u5vV7COsvzZ3b9z9+UESeV9d//E3bcRJPwuxTO6+yPuvjF8D6OBzuWVCAhKVk3dfay7/+juXwF/o+SxcGu4X5cB91UUpLv/PTxed7j7XQSJNP763tvh/twJPA50Dqf3JEg494Sf0Qzgw4j7prSyvmvlifwZu/sPwFEECeZvwBozez48XiEo5U4Mv8ObgN8Dv7HKr+6Ocr6Z7O5fuPtW4Gkgr5JjqFbpdP0go7j7fDN7EbgBWBT30sEEvyLjLSX4lVdsWRmr/C7u8dYynh8IYGZ1CU7ivwaKq43qm1nN8GSQyMPAv9z9jvD5IQQnjJVmVjxPjbgYDy4Vb+n3FlVzYN1uLJcoPko9bkpQSv0obn4j+LVfrCBMeMW2EPxabkJQmllcThyDzSz+5JBFUDItz6nu/loZ00cCfwQ+MLPvgbvc/ZEK1lNaomNlPwiqggl+5Awm2C9F4TxNgA1lrPcQ4GAzWx83rSZBooQkjwUz+x1wQbicE5Re4quyVsU93gLUCU/yBwPL3T2+d/LdPe7K+q6VJ6nP2N0XEZSKMLOfA38nKO2ewa7ngaUE59tmVK4o55vS+3m/So6hWimJ7ZlRBFU5d8VNW0HwZYjXCvh/cc/3ZOiA6wh+zR7h7qvMLA/4hOBEXSEzu4GgWqFP3ORlBNWXTUqd2IutJKg6KtYq2YAtaLHVHEi2xBElPii5P9cSnMhzwpJKMtYSlOR+BnxaRhyPu/vwXZZKkruvAoZD0MINeM3M5rj7v/d03aX8N3AKQfX3EoKq6e/56VgpfRwuA75293blrK/4WChudFPusRBe/xoJHAMscPeiMGEnPE7D7TQ3M4tLZK0o+8dFIqXf42aCHznFDox7vNufsbt/bsE15ovDSaXPA60IqrG/A0pfw64opkTniijnm72aqhP3QHjSmQZcGTf5JeBQM/tvM9vHzIYChxG0ZKoM9QlO0uvNrDFBIk3IzI4P4xwYVisUv4eVwKvAXWa2f3hB+mdmVlxF+TRwpZm1CBsM3BA10HB9A4CnCOr4/y/qsknEV3r+IoLqnbvN7IAwjuZmdlyEbRUBjwATwwYONcML6bUJfmWfZGbHhdPrWNDoosxGNRUxs8Fxy31PcKIqLiV9R3AdpTLUJ/gBUEBwkvxTqddLb+sDYKOZXW9BI46aZpZrPzUbfxr4vQWNi1oQXIesaNs7gDXAPmZ2C0FJLIp3w2WvNLMsMzsN6BFx2UTmEVTrZYUNSU6Pey3yZ2xmP7egcVCL8HlLghLYe+EsTwLXmFkbM9uPYN9PK+eHWEUxrSE4Nso7JlJ9vkl7SmJ7bixBgwMguGYFDCAoMRUQ/Bod4O5rK2l79xBcoF1L8IWJ+otrKEGV0iL7qYXipPC1cwgupi8kOKnOAA4KX/sb8ApByeRjggvUibxgZhsJftn+geA+sPMqXqRCFcVXlusJLqq/Z2Y/AK9R8lpMRX4H/B/BNZh1wB1AjfAa0CnAjQQnlmXACCr+Dr1gJVuEPhdO7w68b2abCBqgXBVef4LgutWj4TW0IRFjLs9jBFVLywn23XulXn8YOCzc1sywOnoAwTWTrwmOsYcISnAQNCFfGr72KsF1rPK8QnBsfhEus42IVXvu/iNwGkFV3TqCYzfKcRfFzQQl7e8J3s8TcdtN5jPeCBxB8DluJti38wm+9xD8GHqcoHXh1wTvv7ykX1FMWwiqhOeGn1PP+AWr4HyT9qxktbOIiEjmUElMREQylpKYiIhkLCUxERHJWEpiIiKSsZTEREQkY6Xdzc6192voHX/+X4lnFJGYr9ZsBqBt03oJ5hRJbx999NFady/dnV+50i6J1cs+iPz8/OoOQySjDP3ruwBMu7hXNUcismfMLKkuxlSdKCIiGUtJTEREMpaSmIiIZKy0uyYmIumtsLCQb7/9lm3btlV3KJLB6tSpQ4sWLcjKytqj9SiJiUhSvv32W+rXr0/r1q2JG7NNJDJ3p6CggG+//ZY2bdrs0bpUnSgiSdm2bRvZ2dlKYLLbzIzs7OxKKc0riYlI0pTAZE9V1jGkJCYikqTWrVuzdm0wZFfv3r33eH1Tpkzhiiuu2O3tjhgxgpycHEaMGMGaNWs44ogj6NKlC2+99VaJ5fv160f79u3Jy8sjLy+PGTNmAFCzZs3YtLy8PCZPnhx7XKtWLTp27EheXh433BB5TNwqk3bXxNxhwgQ47zxo0qS6oxGRvc2OHTvYZ5/KO/W98847lbau3d3ugw8+yLp166hZsyZPPfUUHTt25KGHHipzualTp9KtW7cS0/bdd1/mzZtXYtp55wXj2LZu3ZpZs2bRJE1PyGlXEisshJEjYfLk6o5ERNLRkiVL6NChA8OHDycnJ4f+/fuzdetWAObNm0fPnj3p1KkTAwcO5PvvvweCEsjVV19Nt27duPfee+nXrx/XXHMN3bp1o0OHDnz44YecdtpptGvXjptuuim2rVNPPZWuXbuSk5PDgw8+WGY8++23HwC33HJLrPTSvHnzWBL4+9//To8ePcjLy+Piiy9m586dAEyePJlDDz2UHj16MHfu3DLXXVBQQP/+/cnJyeHCCy8kfhDj4u2efPLJbNq0ia5du3LHHXcwcuRI/vGPf5CXlxfbL3s1d0+rv4Ytf+7jx7uvWeMiEtGQSe/4kEnvVMm2Fi5cmPQya9Z4pX2vv/76a69Zs6Z/8skn7u4+ePBgf/zxx93dvWPHjj579mx3d7/55pv9qquucnf3vn37+qWXXhpbR9++fX3kyJHu7n7PPff4QQcd5CtWrPBt27Z58+bNfe3ate7uXlBQ4O7uW7Zs8ZycnNj0Qw45xNeEb6ZevXol4vv+++89NzfX8/PzfeHChT5gwAD/8ccf3d390ksv9UcffdRXrFjhLVu29NWrV/v27du9d+/efvnll+/yXn/729/6mDFj3N39xRdfdKDM7cY/njx5cpnrKn7fhx56qHfu3Nk7d+4cez81atSITTv11FNLLBP/XitbWccSkO9J5Iy0q040gxEjqjsKEalMkycHNSxQOd/vNm3akJeXB0DXrl1ZsmQJGzZsYP369fTt2xeAc889l8GDB8eWGTp0aIl1nHzyyQB07NiRnJwcDjroIADatm3LsmXLyM7O5r777uO5554DYNmyZXz55ZdkZ2eXG5e7c9ZZZ3HttdfStWtX7r//fj766CO6d+8OwNatWznggAN4//336devH02bNo3F9sUXX+yyvjlz5vDss88CcOKJJ9KoUaOk91VpUasTM0XaJTER2fuENWux/3uqdu3ascc1a9aMVG1Wr17JHv6L11GjRo0S66tRowY7duxg9uzZvPbaa7z77rvUrVuXfv36JWwSPnr0aFq0aBGrSnR3zj33XG677bYS882cOTNhvBJN2l0TE5G9T5MmQQkslW0DGjRoQKNGjWIt8h5//PFYqWx3bNiwgUaNGlG3bl0+//xz3nvvvQrnf+GFF3jttde47777YtOOOeYYZsyYwerVqwFYt24dS5cu5YgjjuDNN9+koKCAwsJCpk+fXuY6jz76aJ544gkAXn755dg1PvmJSmIistd49NFHueSSS9iyZQtt27Zl8h60EPv1r3/NpEmT6NChA+3bt6dnz54Vzj9x4kSWL19Ojx49gKC6cuzYsYwbN47+/ftTVFREVlYWDzzwAD179mT06NH06tWLhg0bxqpGSxs1ahRnnHEGOTk59O7dm1atWu32+9lbmce1dkkHjQ/p4OuWLqruMEQySlWOJ7Zo0SI6dOiQ8u3I3q+sY8nMPnL3buUssgtVJ4qISMZSEhMRkYylJCYiIhlLSUxERDKWkpiIiGQsJTEREclYSmIiIknK5KFY4rucys/Pp1+/fuXG0K9fP/Lz82Pb7tOnT4nX8/LyyM3Njf5GUyDSzc5m1hTYH/jG3QtTG5KISOr8pw/Fsnr1al5++WWOP/74pLe5ceNGli1bRsuWLVm0KD3u562wJGZmF5vZ48CtwMXAFDP7i5m1qZLoRERK0VAsJbeb7FAsI0aM4NZbb01qnxcbMmQI06ZNA+DJJ5/kjDPO2K31VKZE1YkfuvvZ7n6Ru4909zOBEai7KhFJxtq1wWi3YVXYnvryyy+5/PLLWbBgAQ0bNuSZZ54B4JxzzuGOO+7gs88+o2PHjowZMya2zI8//kh+fj7XXXcdALVq1SI/P59LLrmEU045hQceeID58+czZcoUCgoKAHjkkUf46KOPyM/P57777otNL8vYsWOZN28es2fPpnHjxlxxxRUsWrSIadOmMXfuXObNm0fNmjWZOnUqK1euZNSoUcydO5e3336bhQsXlrnOMWPGcNRRR7FgwQIGDhzIN998s8s8zz//fKwX+uuvv56xY8cydOhQ5s2bx7777rvL/L169aJWrVrMmjUr+g4PDRo0KNar/gsvvMBJJ52U9DoqW4VJzN0/NrMDzWyomZ1jZue4+2Z3/7KqAhSRvUDxWCyVNNpt1KFY5syZE1smylAstWvXjg3FAnDffffRuXNnevbsGRuKpSKlh2J5/fXXY0Ox5OXl8frrr/PVV1+VGIqlVq1au8RWbM6cOZx11llA5Q3FAnDTTTcxbty4EtPMrMx546dnZ2fTqFEjnnrqKTp06EDdunUrJZ49EaVEdRfwJLA+taGIyF6rksdi0VAse+aXv/wlN910U4me+bOzs3fpJX/dunU0KTX0wNChQ7n88suZMmVKVYSaUJTWiR+6+4vu/oq7v5LyiERk71MFY7FoKJbk3HTTTYwfPz72vHv37sydO5dVq1YBQcvF7du307JlyxLLDRw4kJEjR3LcccdVWix7IkpJbJCZHQtsAdzdh6Q4JhGR3aKhWKI74YQTYiNLAzRr1ox7772XE044gaKiIvbbbz+efPJJatQoWdapX78+119/faXFsaciDcViZvUB3H1jqgPSUCwiydNQLJKJKmMoloQlMTO7CTgkfLzM3ccmG6iIiEgqRKlObOzuwwHMbEJ5M5nZSUAvoCHwHbAJqOfuY81sNLARWO3uj+9p0CIiIhCtYUdDMzvXzM4FsiuYbyvQGKgLNHT3uwDMrBFQFD4/vKwFzewiM8s3s/zCQnUIIiIi0URJYhcDa8O/iyuYrz1wBTAZ6BdO83L+l+DuD7p7N3fvlpWVFSEkERGRBNWJYfWhA8V3u/UFRpYz+1rgJqABcI+ZXQfg7t+bWU0zuxb4uFKiFhERIfE1sftLPS+3KaO7T6vgtdFJxCQiIhJJourEgcDl4d8V4Z+ISFqaPn06HTp04Be/+AUAZ5xxBp06deLuu+9Oaj3r16/nL3/5S+z5ihUrOP300ys11ur2pz/9Kan5p0yZwooVK5LezsyZM8vtG7IyJEpi04AHwr/7w/8iImnp4Ycf5m9/+xuzZs1i1apVfPjhh3z22Wdcc801Sa2ndBI7+OCDmTFjRmWHWy3cnaKioipJYjt27KjeJObuKwkaaawCbgcqp+MzEZE9UNbwJmPHjuXtt9/mggsuYMSIEfTv35/ly5eTl5fHW2+9xeLFi/n1r39N165d6dOnD59//jkA3333HQMHDqRz58507tyZd955hxtuuIHFixeTl5fHiBEjWLJkSWzwx549e7JgwYJYLMUDR27evJnzzz+fHj160KVLF/7xj3/sEvfKlSs5+uijY4NJFneRVTysCsCMGTMYNmwYAMOGDeOSSy6hW7duHHroobz44otAkFBOOeUU+vXrR7t27Ur01j9x4kRyc3PJzc3lnnvuAYLha9q3b88555xDbm4uF1xwAVu3biUvL48zzzyzRIw7d+5k2LBh5Obm0rFjR+6++25mzJhBfn4+Z555ZmyIl7Fjx9K9e3dyc3O56KKLYsPExA97c8cdd/D8888zYsQI8vLyWLx48Z587GWKcp9YLvBL4LHwv4gIAGNeWMDCFT9U6joPO3h/Rp2UU+7r8cObZGVlcdlllzF16lRuueUW3njjDe688066devG5ZdfzoABA5g3bx4Q9GM4adIk2rVrx/vvv89ll13GG2+8wZVXXknfvn157rnn2LlzJ5s2beL2229n/vz5sWWXLFkS2/7QoUN5+umnGTNmDCtXrmTlypV069aNG2+8kV/+8pc88sgjrF+/nh49evCrX/2qRMfDTzzxBMcddxx/+MMf2LlzJ1u2bEm4P5YsWcIHH3zA4sWL+cUvfsG///1vAD744APmz59P3bp16d69OyeeeCJmxuTJk3n//fdxd4444gj69u1Lo0aN+PLLL3n00Udj3WdNnz499v7izZs3j+XLlzN//nwgKJU2bNiQ+++/P7ZvAa644gpuueUWAM4++2xefPHF2NAsxcPeQDBszoABA1JWHRslie1P0LT+N8CAlEQhIhJR/PAmAFu3buWAAw6ocJlNmzbxzjvvMHjw4Ni07du3A/DGG2/w2GOPAUGP+A0aNKiwo90hQ4bQv39/xowZw9NPPx07Ob/66qs8//zz3HnnnQBs27aNb775pkS3St27d+f888+nsLCQU089tdw+E0tvr0aNGrRr1462bdvGSpDHHnss2dnBrbunnXYab7/9NmbGwIEDY4nztNNO46233uLkk0/mkEMOSdj/I0Dbtm356quv+O1vf8uJJ55I//79y5xv1qxZjB8/ni1btrBu3TpycnJiSay8oWVSIUoSuwQ4AugMXJ3SaEQko1RUYkqV8oY3qUhRURENGzYss+SRrObNm5Odnc1nn33GtGnTmDRpUiyuZ555hvbt25e77NFHH82cOXP45z//ybBhw7j22ms555xzSozZVXq4l9LjfBU/L296eUoPRVOeRo0a8emnn/LKK68wadIknn76aR555JES82zbto3LLruM/Px8WrZsyejRo0vEHXVblSHKzc5/JkhiRwOTUhuOiEjFyhvepCL7778/bdq0iQ154u58+umnsfX9z//8DxBcD9qwYQP169dn48by+zsfOnQo48ePZ8OGDXTq1AmA4447jj//+c+xa0OffPLJLsstXbqUZs2aMXz4cC688EI+/ji4dbZZs2YsWrSIoqIinnvuuRLLTJ8+naKiIhYvXsxXX30VS5L/+7//y7p169i6dSszZ87kyCOPpE+fPsycOZMtW7awefNmnnvuOfr06VPme8jKyqKsHpLWrl1LUVERgwYNYty4cbEY4/dJccJq0qQJmzZtqrDRS6J9uaeiJLF/ufu97j4BWJmySEREIjjssMNiw5t06tSJY489lpUrE5+apk6dysMPP0znzp3JycmJNby49957mTVrFh07dqRr164sXLiQ7OxsjjzySHJzcxkxYsQu6zr99NN56qmnGDLkp5Gpbr75ZgoLC+nUqRM5OTncfPPNuyw3e/ZsOnfuTJcuXZg2bRpXXXUVALfffjsDBgygd+/eHHTQQSWW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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "data": { "image/png": "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rFlDmzZtuOOOOxg4cCD//Oc/KSgoKD4vWcvds+LWpk0b31mffeberVtwL5Iteo1+y3uNfivdYVTKnDlzKr3P0qXuw4YF9zvrq6++8lq1avmHH37o7u5nnXWWP/744+7u3rx5c58+fbq7u990001+1VVXubt7p06d/LLLLis+RqdOnXzgwIHu7j5y5Ejfb7/9/JtvvvENGzb4AQcc4MuWLXN39+XLl7u7+7p16zw/P794/cEHH+xLwzdTr169EvGtXLnSmzVr5kVFRT5nzhzv3r27//jjj+7uftlll/mjjz7q33zzjR944IH+3Xff+caNG71Dhw5+xRVXbPdef/e73/mQIUPc3f25555zoMzXjV8eM2ZMmceKve/DDz/cW7Zs6S1btix+Pzk5OcXrTj/99BL7xL/XnVXWZwco8nJyQ42qTnzmGXjhBejcGQYMSHc0IhIvVlMCyfn/bNKkCQUFBQC0adOGefPmsXr1alatWkWnTp0AOO+88zjrrLOK9+ndu3eJY5x66qkANG/enPz8fPbbbz8ADjnkEBYuXEhubi733nsvTz/9NAALFy7k888/Jzc3t9y43J3f/OY3XHvttbRp04ZRo0Yxc+ZMjjzySADWr1/PT37yE9599106d+5Mw4YNi2P73//+t93xXn/9dZ566ikATjnlFBo0aFDpc1Va1OrETFCjkli/frB2bXBbtkztYiKZJKxZK77fWbvttlvxcq1atSJVm9WrV3KmgNgxcnJyShwvJyeHzZs3M336dKZNm8bbb79N3bp16dy5c8Iu4oMHD6ZRo0bFVYnuznnnncef//znEttNmTIlYbxSw9rE8vKgXj0YMkTtYiKZJi8vKIGl8sflXnvtRYMGDYp75D3++OPFpbIdsXr1aho0aEDdunX57LPPeOeddyrc/tlnn2XatGnce++9xetOOOEEJk+ezHfffQfAihUrmD9/PkcddRSvvfYay5cvZ9OmTUyaNKnMYx577LH84x//AODFF18sbuOrKWpUSQyS/2tPRLLLo48+yqWXXsq6des45JBDGLMTv2hPPvlkRo8ezRFHHEHTpk1p165dhduPGDGCr7/+mrZt2wJBdeXQoUO55ZZb6Nq1K1u3bqV27drcf//9tGvXjsGDB9O+fXv23nvv4qrR0gYNGkSfPn3Iz8+nQ4cOHHTQQTv8frKReVxPlkxWWFjo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hgwZwuLFi1m8eDGFhYXccMMNHH/88TzyyCOsWrWKtm3bcuKJJ5YYePgf//gHJ510En/84x/ZsmUL69atS3g+5s2bx3vvvcfcuXM57rjjikuW7733Hp988gl169blyCOP5JRTTsHMGDNmDO+++y7uzlFHHUWnTp1o0KABn3/+OY8++mjx8FmTJk0qfn/xli1bxi233MK0adOoV68ed9xxByNGjODmm28GIC8vjw8++IC//OUv3HnnnTz00EPFU8bcfPPNPP/88zz88MMJ31cUUZLYngRd638NdE/Kq2aQWDf7zp01/JRIdfHyyy+XOb1JRdasWcNbb71VYmqWjRs3AvDKK6/w2GNBx+patWqx1157VTjQbq9evejatStDhgzhiSeeKG4rmzp1Ks888wx33nknABs2bGDBggUlhlk68sgjOf/889m0aROnn356uWMmln69nJwcDjvsMA455JDi0k+XLl2Kp4Xp2bMnb775JmZGjx49ihNnz549eeONNzj11FM5+OCDE47/CPDOO+8wZ84cjj76aCCYh619+23DovXs2RMIpsCJTROTqiljoiSxS4GjgJbA1Ul51QyikphIalVUYkqV8qY3qcjWrVvZe++9yyx5VNYBBxxAbm4uH3/8MRMnTmT06NHFcT355JM0bdq03H2PPfZYXn/9dZ5//nn69u3Ltddey7nnnltizq7S072Unucr9ri89eUpPRVNedydLl26MH78+DKfj01bU6tWLTZv3hzpmDsqysXO9xEksWOB0SmNJg10wbNI9VPe9CYV2XPPPWnSpEnxlCfuzkcffVR8vL/+9a8AbNmyhdWrV1O/fn1++KH8MdF79+7NsGHDWL16NS1atADgpJNO4r777ituD/rwww+322/+/Pnsu+++XHTRRVx44YV88MEHQDCC/KeffsrWrVuLJ+GMmTRpElu3bmXu3Ll8+eWXxUny3//+NytWrGD9+vVMmTKFo48+mo4dOzJlyhTWrVvH2rVrefrpp+nYsWOZ76F27dps2rRpu/Xt2rVjxowZxdWWa9euLXPCznipmjImShL7r7vf4+7DgcVJedUM0q8fDBq0rYeiiGS/X/ziF8XTm7Ro0YIuXbqweHHir69x48bx8MMP07JlS/Lz84s7Xtxzzz28+uqrNG/enDZt2jBnzhxyc3M5+uijadasGQPKaIs488wzmTBh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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Absolute difference at end of effective support: 8.013509976798817e-17\n", "Absolute difference at end plus epsilon of effective support: 8.013509971238708e-17\n", "Absolute difference at start of effective support: 0.00025930022969111613\n", "FFT grid points (output):133.0\n", "NUM grid points (output):237.0\n" ] }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "data": { "image/png": "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z+OPP07dunXJyckhMzOTd999l/79+/PSSy8VllS2bt3Kk08+ydixY/nf//5Hv379uP322wE477zzWLVqFTt27GDo0KEMHjx4v3hq167Nli1bGDFiBC+++CIA+fn5dO/encmTJ/P0008zceJEfv31Vzp06MDDDz9MlSpVmDx5MmPHjuWwww6jVatWVK9efb9jFxQU0L9/f3744Qc6duxI+ETHodc955xz2LJlC23btqV///489NBDbN++nby8PN577z0OPvjggP4ScaCqKXFr27atHqgvvlDt0cPdG5Mq+k5aqH0nLUx0GGWybNmyMu+Tn686bpy7P1Dff/+9VqlSRT/55BNVVe3Tp48+9dRTqqraokULnTdvnqqqDh8+XIcOHaqqql27dtWrr7668Bhdu3bV3NxcVVWdMGGCHnXUUfrjjz/qjh07tH79+rp+/XpVVS0oKFBV1W3btmmzZs0Klx977LGa772ZWrVqFYlv48aN2rx5c83Ly9Nly5Zpz5499ddff1VV1auvvlqfeOIJ/fHHH/WYY47RdevW6c6dO7VTp0567bXX7vde//SnP+no0aNVVfXll19WoNjXDX88efLkYo8Vet8nnXSStmrVSlu1alX4ftLS0gqXnXfeeUX2CX+vB6q4zw6QpyXkhkrVxf7FF+HVVyEnx0pixiSbWNeUNG7cmMzMTADatm3L8uXL2bx5M5s2baJr164AXHrppfTp06dwn379+hU5xjnnnANAixYtaNasGUcddRQAxx13HKtWrSI9PZ2JEyfy/PPPA7Bq1Sq+/vpr0tPTS4xLVbn44ou58cYbadu2LQ8++CCLFi2iXbt2AGzfvp0jjjiCDz74gJycHEL9Afr168dXX3213/Hmz5/Pc889B8DZZ59N3bp1y3yuIvmtTkwGlSqJDRwIW7e62/r11i5mTDLxmlcK7w9UeNVblSpV2L59e9R9atUqOlNA6BhpaWlFjpeWlsbu3buZN28ec+fO5b333qNmzZrk5OREvcB71KhRNGjQoLA9SVW59NJLGTt2bJHtZs+eHTVeU8mGncrIgFq1YPRo96vPGJM8MjJcCSzIH5eHHnoodevWLeyR99RTTxWWyspj8+bN1K1bl5o1a/LFF1/w/vvvl7r9Sy+9xNy5c5k4cWLhstNOO41Zs2axbt06ADZs2MCKFSvo0KEDb7/9NgUFBezatYuZM2cWe8xTTjmFf//73wC89tprbNy4sdzvJxVVqpIYxP7XnjEmtTzxxBOFHTuOO+44Jh/AL9ozzzyTSZMm0bRpU5o0aUJ2dnap248fP54ffviB9u3bA666csyYMdx+++10796dvXv3UrVqVR566CGys7MZNWoUHTt25LDDDiusGo00cuRI+vfvT7NmzejUqRMNGzYs9/tJRaJa0qVdySUrK0tjMZ+YdbM3qSYV5xP7/PPPadq0aaLDMCmouM+OiCxS1azitq9U1Ymwr/HYqhONMSb1VcrqROvcYYwxFUOlK4lZ5w5jjKk4Kl1JDKxzhzHGVBSVriRmjDGm4qiUScw6dxhjTMVQKZPYOedAjx7u3hhjgpDKU7GEDzmVl5dHTk5OiTHk5OQQuvypUaNGdOnSpcj6zMxMmjdv7v+NlpGvJCYi9UTkeBGpGlgkcRQaQ9EbTNoYY4rYvXt3TI+XLFOxfPrpp9xzzz288cYbtGjRgk8++WS/pAOwbt06XnvttXK95i+//MKqVasAd81X0EpNYiJypYg8BdwBXAlMEZGHRaRx4JEFaOBAGDlyXzd7Y0zFsnz5cpo2bcoVV1xBs2bN6N69e+HYiYsXLyY7O5uWLVvSq1evwmGacnJyuP7668nKyuL+++8nJyeHG264gaysLJo2bcpHH31E7969OfHEE7ntttsKX+u8886jbdu2NGvWjEceeaTYeGrXrg3AiBEjCieSrF+/fuH4iU8//TTt27cnMzOTK6+8kj179gAwefJkTjrpJNq3b8+CBQuKPXZBQQHdu3enWbNmXH755ftNxQIUmYrl7rvvJjc3lxdeeIHMzMxix5QcNmwYd9xxR5nOeUjfvn2ZMcNNETlt2jT69+9fruP4Fa0k9pGq/lFVB6tqrqpehJsTLKV7NVo3e2OS0Pr1cM89Mftl+fXXX3PttdeydOlSDjvsMJ599lkALrnkEu6++24+/fRTWrRowejRowv3+fXXX8nLy+PPf/4zANWqVSMvL4+rrrqKc889l4ceeojPPvuMKVOmUFBQAMDjjz/OokWLyMvLY+LEiYXLizNmzBgWL17MvHnzOPzwwxkyZAiff/45M2bMYMGCBSxevJgqVaowdepU1qxZw8iRI1mwYAHvvvsuy5YtK/aYo0eP5uSTT2bp0qX06tWLlStX7rfNiy++WDgK/U033cSYMWPo168fixcvLnYusY4dO1KtWjXeeust/yfcc/755xeOqv/SSy/xhz/8oczHKItSk5iqfiwivxGRfiJyiYhcoqpbVfXrQKOKA2sXMybJxLjHld+pWObPn1+4j5+pWKpXr144FQvAxIkTadWqFdnZ2YVTsZQmciqWN954o3AqlszMTN544w2+++67IlOxVKtWbb/YQubPn8/FF18MxG4qFoDbbrutcOLPEBEpdtvw5enp6dStW5fp06fTtGlTatasGZN4SuKnTezvwFbgJ+9WIVi7mDFJZuBAGDcuZhdwRk7F4qed60CmYlmyZAmtW7cu91QsixcvZvHixXz55ZeMGjXK79sMzO9//3u2b99eZGT+9PT0/UbJ37BhAxkRQx/169ePa6+9NvCqRPCXxD5S1ZdV9XVVfT3wiOIkxv8vxpgDFYe5WGwqlrK57bbbGDduXOHzdu3asWDBAtauXQu4nos7d+7kmGOOKbJfr169yM3N5YwzzohZLCXx07Z1voh0A7YBqqp9A47JGGMCY1Ox+NejR4/CmaUBjjzySO6//3569OjB3r17qV27NtOmTSMtrWh5qE6dOtx0000xi6M0vqZiEZE6AKr6S+ARlSBWU7GE3HOPq34fNy42U6EbExSbisVUJmWdiiVqSUxEbgOO9R6vUtUxsQg00Ww0e2OMSX1+2sQOV9UrVPUKoE7QAcWLdbM3xpjU56dN7DARudR7nB5kMPF2zjkwb551szfGmFTlpyR2JbDeu10ZbDjxZd3sjTEmtZVaEhORewAFQleydQVygw4qXqwkZowxqS1adeKDEc+jd2VMIaGSWE6O9VA0xphUFK06sRdwrXcb4t0qDBsI2JjKZ+bMmTRt2pRTTz0VgP79+9OyZUvuu+++Mh1n06ZNPPzww4XPf/zxRy644IKYxppod955Z2DHDp8y5kBEK4nNAKod8KskqVAPxdxcd2+lMWMqvscee4x//etfnHzyyaxdu5aPPvqIb775pszHCSWxa665BoCjjz6aWbNmxTrchFBVVJU777yTW2+9NdHhlCraAMBrgBxgLXAXUOEGabKBgI2pmIqb3mTMmDG8++67XHbZZQwbNozu3bvzww8/kJmZyTvvvMO3337LmWeeSdu2benSpQtffPEFAD/99BO9evWiVatWtGrVioULF3LzzTfz7bffkpmZybBhw1i+fHnh5I/Z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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Absolute difference at end of effective support: 6.016677776968387e-17\n", "Absolute difference at end plus epsilon of effective support: 6.016677773066425e-17\n", "Absolute difference at start of effective support: 2.2223082256677138e-05\n", "FFT grid points (output):210.0\n", "NUM grid points (output):336.0\n" ] }, { "data": { "image/png": "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kfzrX/8iOzs7Vi57NHev9L9GLX/h48a5r17tIlJOgye+7YMnvl3p+124cGHC66xe7Un7zH/11Vdes2ZN//jjj93dfdCgQf7444+7u3uHDh181qxZ7u5+4403+lVXXeXu7n369PFLLrkkto0+ffr4yJEj3d39nnvu8QMOOMBXrlzpW7du9ebNm/uaNWvc3T0vL8/d3Tdv3uxZWVmx+QcffLCvDl9M/fr1i8T3ww8/ePv27T03N9cXLlzo/fv39+3bt7u7+yWXXOKPPvqor1y50lu2bOnff/+9b9u2zY844gi/7LLLdnutV1xxhY8ZM8bd3V988UUHStxv4elJkyaVuK2C133ooYd6p06dvFOnTrHXU6NGjdi8U089tcg6hV9rspV0LAG5nkA+qZLmRDMYMaIq9iwiVWHSpKD1BZLz2W/dujXZ2dkAdOnShaVLl7J+/XrWrVtHnz59ADj33HMZNGhQbJ0hQ4YU2cbJJ58MQIcOHcjKyuKAAw4AoE2bNixfvpzMzEzuu+8+nnvuOQCWL1/Ol19+SWZmZqlxuTtnnXUW1157LV26dOH+++/nww8/pFu3bgBs2bKFfffdl/fee4+cnByaNWsWi+2LL77YbXuzZ8/m2WefBeCkk06icePGCZdVcVGbE9OFficmIikXtqzF/ldU7dq1Y9M1a9aM1GxWv37Ru/0XbKNGjRpFtlejRg127NjBrFmzeO2113jnnXeoV68eOTk5cbuEjx49mhYtWsSaEt2dc889l9tuu63IcjNmzIgbr0Sj3okiknJNmwY1sFT2Ddhnn31o3LhxrEfe448/HquVlcf69etp3Lgx9erV47PPPuPdd98tc/kXXniB1157jfvuuy8279hjj2X69Ol8//33AKxdu5Zly5bRo0cP3nzzTfLy8sjPz2fatGklbvPoo4/miSeeAODll1+OXeOTH6kmJiJ7jEcffZSLL76YzZs306ZNGyZVoPfYr371KyZOnEi7du1o27YtPXv2LHP5CRMmsGLFCrp37w4EzZVjx47l5ptvpm/fvuzatYuMjAweeOABevbsyejRo+nVqxeNGjWKNY0WN2rUKM444wyysrI44ogjOOigg8r9evZU5oV6u1SWJge387XLFlX6fkX2JFU1ntiiRYto165dpe5T9kwlHUtm9qG7dy1lld2oOVFERNKWkpiIiKQtJTEREUlbSmIiIpK2lMRERCRtKYmJiEjaUhITEUlQOg/FUviWU7m5ueTk5JQaQ05ODrm5ubF99+7du8jz2dnZtG/fPvoLTYFIP3Y2s2bA3sDX7p6f2pBERFLnpz4Uy/fff8/LL7/MCSeckPA+N2zYwPLly2nZsiWLFlWP3/qWWRMzs4vM7HHgFuAiYLKZ/dXMWldKdCIixWgolqL7TXQolhEjRnDLLbckVOYFBg8ezNSpUwF48sknOeOMM8q1nWSK15z4gbuf7e4XuvtIdz8TGIFuVyUiiVizJhgJN2wKq6gvv/ySyy67jAULFtCoUSOeeeYZAM455xzuuOMOPv30Uzp06MCYMWNi62zfvp3c3Fx+97vfAVCrVi1yc3O5+OKLOeWUU3jggQeYP38+kydPJi8vD4BHHnmEDz/8kNzcXO67777Y/JKMHTuWefPmMWvWLJo0acLll1/OokWLmDp1KnPnzmXevHnUrFmTKVOmsGrVKkaNGsXcuXN56623WLhwYYnbHDNmDEcddRQLFixgwIABfP3117st8/zzz8fuQn/dddcxduxYhgwZwrx586hbt+5uy/fq1YtatWoxc+bM6AUeGjhwYOyu+i+88AK//vWvE95GspWZxNz9IzPb38yGmNk5ZnaOu29y9y8rK0AR2QMUjMWSpJFwow7FMnv27Ng6UYZiqV27dmwoFoD77ruPTp060bNnz9hQLGUpPhTL66+/HhuKJTs7m9dff50lS5YUGYqlVq1au8VWYPbs2Zx11llA8oZiAbjhhhu4+eabi8wzsxKXLTw/MzOTxo0b89RTT9GuXTvq1auXlHgqIkqN6i7gSWBdakMRkT1Wksdi0VAsFXPMMcdwww03FLkzf2Zm5m53yV+7di1Niw09MGTIEC677DImT55cGaHGFaV34gfu/qK7v+Lur6Q8IhHZ81TCWCwaiiUxN9xwA+PGjYs97tatG3PnzuXbb78Fgp6L27Zto2XLlkXWGzBgACNHjqRfv35Ji6UiotTEBprZ8cBmwN19cIpjEhEpFw3FEt2JJ54YG1kaYL/99uPee+/lxBNPZNeuXTRo0IAnn3ySGjWK1nUaNmzIddddl7Q4KirSUCxm1hDA3TckY6caikWk4jQUi6S7ZAzFErcmZmY3AAeH08vdfWyigYqIiKRClGtiTdx9uLsPBxqmOiAREZGoolwTa2Rm54bTmakMRkREJBFRamIXAWvCv4tSG46IiEh0ZdbEzGw84EDBr936ACNTHZSIiEgU8ZoT7y/2OH5XRhERkUoSrzlxAHBZ+Hd5+CciUi1NmzaNdu3a8ctf/hKAM844g44dO3L33XcntJ1169bx17/+NfZ45cqVnH766UmNtardeuutCS0/efJkVq5cmfB+ZsyYUeq9IZMhXhKbCjwQ/t0f/hcRqZYefvhh/vGPfzBz5ky+/fZbPvjgAz799FOuueaahLZTPIkdeOCBTJ8+PdnhVgl3Z9euXZWSxHbs2FG1SczdVwE5wLfA7UBybnwmIlIBJQ1vMnbsWN566y0uuOACRowYQd++fVmxYgXZ2dnMmTOHxYsX86tf/YouXbrQu3dvPvvsMwC+++47BgwYQKdOnejUqRNvv/02119/PYsXLyY7O5sRI0awdOnS2OCPPXv2ZMGCBbFYCgaO3LRpE+effz7du3enc+fO/Otf/9ot7lWrVnH00UfHBpMsuEVWwbAqANOnT2fo0KEADB06lIsvvpiuXbty6KGH8uKLLwJBQjnllFPIycnhkEMOKXK3/gkTJtC+fXvat2/PPffcAwTD17Rt25ZzzjmH9u3bc8EFF7Blyxays7M588wzi8S4c+dOhg4dSvv27enQoQN3330306dPJzc3lzPPPDM2xMvYsWPp1q0b7du358ILL4wNE1N42Js77riD559/nhEjRpCdnc3ixYsr8raXKEoX+/bAMcBj4X8REQDGvLCAhSv/l9RtHnbg3oz6dVapzxce3iQjI4NLL72UKVOmcNNNN/HGG29w55130rVrVy677DL69+/PvHnzgOA+hhMnTuSQQw7hvffe49JLL+WNN97gyiuvpE+fPjz33HPs3LmTjRs3cvvttzN//vzYukuXLo3tf8iQITz99NOMGTOGVatWsWrVKrp27cof//hHjjnmGB555BHWrVtH9+7dOe6444rcePiJJ56gX79+/OlPf2Lnzp1s3rw5bnksXbqU999/n8WLF/PLX/6S//73vwC8//77zJ8/n3r16tGtWzdOOukkzIxJkybx3nvv4e706NGDPn360LhxY7788kseffTR2O2zpk2bFnt9hc2bN48VK1Ywf/58IKiVNmrUiPvvvz9WtgCXX345N910EwBnn302L774YmxoloJhbyAYNqd///4pa46NksT2Juha/xugf0qi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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "data": { "image/png": "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HU8//TTp6em89957JCUlFR2XqKWqUflo166dHpOlS3X52T21OUt1+PBj25UxFaHP2LnaZ+zccIfhyZIlS8q9TW6u6vDhzs9jtWrVKq1WrZouXLhQVVWvv/56ff3111VVtVWrVjpjxgxVVR0yZIjed999qqrarVs3vfPOO4v20a1bN01PT1dV1VGjRulpp52mGzZs0L179+oZZ5yheXl5qqq6detWVVUtKCjQxMTEouWNGzfWXPfLxMXFHRbf9u3btWXLlpqTk6NLlizRXr166b59+1RV9c4779Tx48frhg0btGHDhrplyxb99ddf9fzzz9e77777iO96zz336NChQ1VV9YMPPlCgxM/1f56ZmVnivgq/d4sWLbRNmzbapk2bou8TExNTtOzqq68+bBv/73qsSjp3gBwtJRdU3erErCzOXDqNl3p2p2XqoHBHY0yV51aOADAoCH+STZs2JSkpCYB27dqxevVqdu7cyY4dO+jWrRsAN998M9dff33RNn379j1sHykpKQC0atWKxMRETjvtNACaNWvGunXriI+P5/nnn+fdd98FYN26dfz000/Ex8eXGpeq8sc//pEHHniAdu3aMXr0aBYsWED79u0B2LNnDyeffDJfffUV3bt3p379+kWx/fjjj0fsb9asWbzzzjsAXHnlldStW7fcx6o4r9WJkaDqJrHUVPLz4XtSaRnuWIwxuDVrRT+P1fHHH1/0vFq1ap6qzeLiDp8hoHAfMTExh+0vJiaGAwcOMGPGDLKzs/niiy+IjY2le/fuAbuIZ2Rk0KBBg6KqRFXl5ptv5sknnzxsvalTpwaM11TlNjGfj0xSWTM0k0mjrVHMmHDz+ZwSWCj7BtSpU4e6desW9ch7/fXXi0plR2Pnzp3UrVuX2NhYli5dypdfflnm+u+//z7Z2dk8//zzRcsuvvhi3nrrLbZs2QLAtm3bWLNmDR07dmTmzJls3bqV/fv3M2XKlBL3eeGFF/LGG28A8NFHHxW18VUVVbckBqSSSRzpTJ8DeXmDrJOiMVXA+PHjGThwIAUFBTRr1ozMzMyj3tfll1/O2LFjOeecc0hISKBTp05lrj9y5Eh+/vlnOnToADjVlcOGDePxxx+nR48eHDp0iOrVqzNmzBg6depERkYGnTt35qSTTiqqGi3u0UcfpV+/fiQmJnL++efTqFGjo/4+0UjUrydLNElOTtZjnk8sL48ZN2dy3bRUBg/3BaUe3phQiab5xH744QfOOeeccIdholBJ546ILFDV5JLWr9IlMYD27SGjPfwhSPXwxhhjKk7VbRMDyMwkbmg6LecffXWCMcaY8KnaSSw1lRk9h3PdtFSOoVrcGGNMmAStOlFEzgN6A7HAEFXNF5EHgEOAAi8Aw4HtQA6wAbgSaAo8A9Quvn2wYiuVz0eDIak8vTKTbl1TAevZYYwx0SSYJbF+QAYwFbjUXdZQVUcBTYA2wLeq+gRwuap+p6pPAV8Ap5Wy/WFE5HYRyRGRnNzc3KAEvf6xTG5dms76x6woZowx0SbY1YmldXXUkn6KyKXASao6K8D2zpuqL6lqsqomF97FfqxajUxl+iXDmZeYamMoGmNMlAlmEpuEU5K6CmggIjHAWhG5H1gNfAO0FpEHgekicr67PiLSqtj22UGMq0zx8VCjBgwfgbWLGWOCJpqnYvEfcionJ4fu3buXGkP37t0pvN2pSZMmdO3a9bD3k5KSaNkydOMieWoTE5H6wInAWlXdX9I6qroAWFBs8bPFXhe/E6tLsdfFtw+9zEy6T0vnrZ7YGIrGGMCmYtmyZQsfffQRV1xxRbk/c9euXaxbt46GDRvyww8/HHXsXpVZEhORO0TkdeAJ4A5gnIj8U0SahjyyipKSwr5LerI8MSXckRhjgsSmYjn8c8s7FcugQYN44oknynXMC/Xp04fJkycDMHHiRPr163dU+/EqUHXifFX9k6rerqrpqnojTmmq8twknZVFjexpLBuRZdWJxoRTXh6MGEGwGqd/+ukn7r77bhYvXsxJJ53E22+/DcBNN93E008/zbfffkurVq0YOnRo0Tb79u0jJyeHv/zlLwDUqFGDnJwcBg4cyFVXXcWYMWP4/vvvGTduHFu3bgXg1VdfZcGCBeTk5PD8888XLS/JsGHDWLRoETNmzKBevXqkpaXxww8/MHnyZObMmcOiRYuoVq0aEyZMYOPGjTz66KPMmTOHzz//nCVLlpS4z6FDh3LBBRewePFirrnmGtauXXvEOllZWUWj0A8ePJhhw4bRt29fFi1axAknnHDE+p07d6ZGjRp89tln3g+469prry0aVf/999/n97//fbn3UR5lJiNV/VpETgW6Ace7y14DfgppVBUpNZUtubB+YSq3WWHMmPAJ8lwsNhXLsXn44Yd5/PHHefrpp4uWiUiJ6/ovj4+Pp27dukyaNIlzzjmH2NjYoMRTGi8dO/4B5AOb3Ufl4vPxZmwqDbIz+WSidU80JmxSU2H48KDNxVJ8KpYDBw4E3OZYpmL55ptvaNu27VFPxbJo0SIWLVrEsmXLyMjI8Po1Q+Z3v/sde/bsOWxk/vj4+CNGyd+2bRu+YqOn9+3bl7vvvjvkVYngLYnNV9UPVPVjVf045BGFQSqZjCCdFnMyrZu9MeFSAXOx2FQs5fPwww8zfPjwotft27dnzpw5bNq0CXB6Lv766680bNjwsO2uueYa0tPTueyyy4IWS2m8tG1d697PVQCoqvYJcUwVLq5fCismzyAtO4UBmcGZVdYYE5lsKhbvevbsif89uaeccgrPPfccPXv25NChQ9SqVYuJEycSE3N4eah27doMHjw4aHGUxdNULCJSG0BVd4U8Io+CMhVLoREjID2dV84ezgVTB5GQEJzdGhNMNhWLqQrKOxVLwOpEEXkYGAmMFJFHghJlpHEHAh68NJWsrHAHY4wxxisv1Yn1VHUAgIiMCHE8YXNuIly6D1Ksh6IxxkQNLx07ThKRm0XkZqD0fqPRLDOTk0ek0yA700pixhgTRbyUxO4Aevg9r3xSU8nPzefKefnMy80jL88Xyg5SxhhjgqTMJOZWHypQeCdbNyA91EFVOJ+PuPpxdJ+Zzocz48isP8h6KBpjTBQIVBIbXex14K6M0Solhd0fzmCnptjIHcYYEyUCtYldA9ztPtLcR+WUlUWtmdOoMyvL2sWMqcSmTJnCOeecw0UXXQRAv379aN26Nc8+W3zSjbLt2LGDf/7zn0WvN2zYwHXXXRfUWMPt73//e8j27T9lzLEIVBKbDNQ45k+JBikp7Js+g4S2KVwdnFFvjDER6JVXXuHf//43F1xwAZs2bWL+/PksX7683PspTGJ33XUXAKeffjpvvfVWsMMNC1VFVfn73//OQw89FO5wylRmSUxVNwLdgU3AU0Dlvby7o9mftdiKYcZUBiVNbzJs2DA+//xzbr31VgYNGkSPHj34+eefSUpKYvbs2axYsYLLL7+cdu3a0bVrV5YuXQrA5s2bueaaa2jTpg1t2rRh7ty5/PWvf2XFihUkJSUxaNAgVq9eXTT5Y6dOnVi8eHFRLIUTR+bn53PLLbfQoUMH2rZty3vvvXdE3Bs3buTCCy8smkyycIiswmlVAN566y369+8PQP/+/Rk4cCDJycm0aNGCDz74AHAmsLzqqqvo3r07zZs3P2y0/pEjR9KyZUtatmzJqFGjAGf6moSEBG666SZatmzJrbfeyp49e0hKSuLGG288Is7p06fTuXNnzjvvPK6//np2794NOCWsRx99lPPOO49WrVoVHcOypow5Fl56J7YEfge85v6snFJTmTEDrpuWymAbesqYoBn6/mKWbPglqPs89/QTefT3iaW+7z+9SfXq1bnrrruYMGECjzzyCJ9++inPPPMMycnJ3H333fTq1YtFixYBzjiGY8eOpXnz5nz11VfcddddfPrpp9x7771069aNd999l4MHD7J7926eeuopvv/++6JtV69eXfT5ffv25c0332To0KFs3LiRjRs3kpyczEMPPcTvfvc7Xn31VXbs2EGHDh245JJLDht4+I033uCyyy7jb3/7GwcPHqSgoCDg8Vi9ejXz5s1jxYoVXHTRRUUly3nz5vH9998TGxtL+/btufLKKxERMjMz+eqrr1BVOnbsSLdu3ahbty4//fQT48ePLxo+a8qUKUXfz19eXh6PP/442dnZxMXF8fTTTzNy5EgeecQZD8Pn8/H111/zz3/+k2eeeYaXX365aMqYRx55hA8//JBXXnkl4PfywksSOxGna/0fgF5B+dRI5PPRamQqb+zLZFFuqnWzNyaK/e9//ytxepOy7N69m7lz5x42Ncuvv/4KwKeffsprr70GOCPi16lTp8yBdvv06UOPHj0YOnQob775ZlFb2fTp08nKyuKZZ54BYO/evaxdu/awYZbat2/PLbfcwv79+7n66qtLHTOx+OfFxMTQvHlzmjVrVlT6ufTSS4umhenduzeff/45IsI111xTlDh79+7N7NmzSUlJoXHjxgHHfwT48ssvWbJkCV26dAGcedg6d/5tOLTevXsDzhQ4hdPEhGrKGC9JbCDQEWgD3B+UT41Q8VmZ9MhO55NsrJu9MUFSVokpVAqnN3nyySc9b3Po0CFOOumkEkse5XXGGWcQHx/Pt99+y+TJkxk7dmxRXG+//TYJZQzQeuGFFzJr1iw+/PBD+vfvzwMPPMBNN9102Jxdxad7KT7PV+Hr0paXpvhUNKVRVS699FImTpxY4vuF09Z4nQLnWHgZseMFnCR2ITA2pNGEW0oKu7v1ZOeFKTb8lDFR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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Absolute difference at end of effective support: 4.54112045709114e-17\n", "Absolute difference at end plus epsilon of effective support: 4.541120454415501e-17\n", "Absolute difference at start of effective support: 8.978842407251341e-07\n", "FFT grid points (output):404.0\n", "NUM grid points (output):585.0\n" ] }, { "data": { "image/png": "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9Wr+8pe/xF5//fXXnH/++ZUaa3X705/+VKHlJ0+ezNdff13h/cycObPMviFFJPNFaZ34AHAb0BPY9Y4Hd2MPPvggf//733nllVdYuXIl7733Hh9++CHXXXddhbZTOokdcMABzJgxo7LDrRbuzvbt26skiW3dulVJTGQ3FyWJrQX+z91HAa+lOJ6MkGh4k1GjRvHGG29w2WWXMXToUHr16sXy5cvJzc3l9ddfZ/HixfziF7+gU6dO9OjRg48//hiAb775hnPOOYeOHTvSsWNH3nzzTW666SYWL15Mbm4uQ4cOZcmSJbHBH7t27crChQtjsRQPHLl+/XouvfRSunTpwlFHHcW//vWvHeJesWIFJ5xwQmwwyeIusoqHVQGYMWMG/fv3B6B///4MHjyYzp07c/jhh/Pss88CQUI566yzyMvL47DDDivRW//48eNp164d7dq149577wWC4WvatGnDJZdcQrt27bjsssvYuHEjubm5XHTRRSVi3LZtG/3796ddu3a0b9+ee+65hxkzZlBQUMBFF10UG+Jl1KhRHHPMMbRr145BgwbFhomJH/ZmzJgxzJo1i6FDh5Kbm8vixYt35c8uImkoSuvEDwDM7F9AxetzUmjkMwtZ9PUPlbrNIw/Ym+G/zCnz/fjhTWrVqsWVV17JlClTuO2223j55Ze566676Ny5M1dddRVnnnkm8+fPB4J+DCdOnMhhhx3GO++8w5VXXsnLL7/MNddcQ8+ePXn66afZtm0b69at484772TBggWxdZcsWRLbf58+fXjiiScYOXIkK1asYMWKFXTu3Jmbb76Zn//85zz00EOsXr2aLl26cPLJJ5foePixxx7j1FNP5X/+53/Ytm0bGzZsSHo8lixZwrvvvsvixYs58cQT+e9//wvAu+++y4IFC6hfvz7HHHMMZ5xxBmZGfn4+77zzDu7OscceS8+ePWnatCmfffYZDz/8cKz7rOnTp8c+X7z58+ezfPlyFixYAASl0iZNmjBhwoTYsQW4+uqrue222wD4zW9+w7PPPhsbmqV42BsIhs0588wzd7vqWBEJREliL7n7d8AUM2uedOnd3L///e+Ew5uUZ926dbz55pslhmbZvHkzAC+//DKPPPIIEPSI37hx43I72r3wwgvp1asXI0eO5IknnohdnF966SVmzZrFXXfdBcCmTZv48ssvS3SpdMwxx3DppZeyZcsWzj777DL7TCy9vxo1anDYYYdxyCGHxEqQp5xySmxYmHPPPZc33ngDM+Occ86JJc5zzz2X119/nd69e9OqVauk/T9CMBTN559/zu9+9zvOOOMMevXqlXC5V155hbFjx7JhwwZWrVpFTk5OLImVHvZGRHZfUZLYjcDvw+nrgJtTF07FlFdiSpWyhjcpz/bt22nSpEnCkkdFtWjRgqysLD788EOmTZvGxIkTY3E9+eSTtGnTpsx1TzjhBF577TWee+45+vfvz/XXX88ll1xSYsyu0sO9lB7nq/h1WfPLUnoomrI0bdqU//znP7z44otMnDiRJ554goceeqjEMps2beLKK6+koKCAAw88kBEjRpSIO+q+RCTzRbkn1ixuOnVjmWSIsoY3Kc/ee+9N69atY0OeuDv/+c9/Ytv761//CgT3g9asWUOjRo1Yu3Ztmdvr06cPY8eOZc2aNXTo0AGAU089lT//+c+xe0MffPDBDustXbqUfffdl4EDB3L55Zfz/vvvA0EP8h999BHbt2+PDcJZbPr06Wzfvp3Fixfz+eefx5Lk//7v/7Jq1So2btzIzJkzOe644+jRowczZ85kw4YNrF+/nqeffpoePXok/Ay1atViy5YtO8wvLCxk+/btnHfeeYwePToWY/wxKU5Y2dnZrFu3rtxGL8mOpYhktihJ7HEze9LMpgNPpTqgdHfkkUfGhjfp0KEDp5xyCitWrEi63pQpU3jwwQfp2LEjOTk5sYYX9913H6+88grt27enU6dOLFq0iKysLI477jjatWvH0AQjUZ9//vk8/vjjXHjhhbF5t956K1u2bKFDhw7k5ORw66237rDenDlz6NixI0cddRTTpk1jyJAhANx5552ceeaZdO/ePTbCdLGDDjqILl26cNpppzFx4kTq1g16IOvSpQvnnXceHTp04LzzzqNz584cffTR9O/fny5dunDsscdy+eWXc9RRRyU8HoMGDaJDhw47NOxYvnw5eXl55ObmcvHFF8dKvMWNTHJzc6lTpw4DBw6kXbt2nHrqqbGq3UR+9atfMW7cOI466ig17BDZDZU7FIuZ1XX3HYYTLmt+ZdNQLNWrf//+CRtFTJ48mYKCAiZMmFBNkVWe3e180lAskukqeyiWO8zMgUXAaqB1+DMFmLuzQYqIiFSGcpOYu19nZs2AbsDewCvuPq5K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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "data": { "image/png": "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deK2226jqKiIp59+msLCwpLjkrfcPS9vnTp18ir55BP3444L7kXywGlj3vDTxryR7TAimTt3boX3WbLEfcSI4L6qvvrqK69du7a///777u7er18/f+SRR9zdvV27dj5t2jR3d7/uuuv8sssuc3f3nj17+kUXXVTyGj179vSioiJ3dx81apTvvffe/t133/mGDRu8WbNmvnTpUnd3X7Zsmbu7r1u3ztu0aVOyfr/99vMl4Ydp2LDhdvGtWLHC27Zt68XFxT537lzv06eP//TTT+7uftFFF/lDDz3k3333nbdo0cJ/+OEH37hxox966KF+ySWX7PBZ//jHP/qwYcPc3f25555zoNT3jV8eO3Zsqa8V+9wHHnigd+jQwTt06FDyeWrVqlWy7qSTTtpun/jPWlWlfXeAYi8jF9Tc6sRnnoEXXoBevWDIkGxHI1LjxSpHIDX/kq1ataKwsBCATp06MX/+fFatWsXKlSvp2bMnAGeddRb9+vUr2ad///7bvcYJJ5wAQLt27WjTpg177703APvvvz/ffPMNTZo04e677+app54C4JtvvuHzzz+nSZMmZcbl7pxxxhlcccUVdOrUidGjRzNr1iy6dOkCwPr169lzzz15++236dWrF02bNi2J7bPPPtvh9WbMmMGTTz4JwPHHH0/jxo0rfKwSRa1OzAU1N4kNGgRr1wa3pUvVLiaSZWHNWsl9Ve28884ly7Vr145Ubdaw4fYzBMReo1atWtu9Xq1atdi8eTPTpk1j6tSpvPnmmzRo0IBevXol7SI+dOhQmjdvXlKV6O6cddZZ3HLLLdttN3ny5KTxSk1uEysogIYNYdgwtYuJ5ICCgqAEls7fk7vtthuNGzcu6ZH3yCOPlJTKKmPVqlU0btyYBg0a8Mknn/DWW2+Vu/2zzz7L1KlTufvuu0vW/eY3v+Hxxx/nhx9+AGD58uV8/fXXHHLIIUyfPp1ly5axadMmJk2aVOprHnHEEfznP/8B4MUXXyxp46spam5JDOCEE2DatOBeRGqEhx56iAsvvJB169ax//77M7YKP2KPPfZYxowZw0EHHUTr1q3p1q1buduPHDmSb7/9lq5duwJBdeXw4cO58cYb6d27N1u3bqVOnTrce++9dOvWjaFDh9K9e3d23333kqrRRDfccAMDBgygTZs2HHrooey7776V/jz5yDyuJ0s+6dy5s1d5PrHbbw8q4UeMULuY5Lx8mk/s448/5qCDDsp2GJKHSvvumNksd+9c2vY1uySmdjERkbyWsiRmZgcDfYEGwHXuvtbMrgC2Ag7cA4wAVgDFwHfA8UAr4A6gUeL+qYqtTLF2saKi4F6lMRGRvJLKjh0DgKHAZODocF0Ldx8FtAQ6AB+6+03Ase7+f+5+K/AmsHcZ+2/HzM43s2IzK16yZElqoh40KKhOTFWXKBERyZhU904sq4HNS7s3s6OB3d19RpL9gyfd73P3zu7eOXbthIiI1FypTGKPEpSkTgSam1ktYIGZXQ7MBz4A2pvZ1cAUMzs03B4za5ew/9QUxlU+DT8lIpK3UtYm5u6zgFkJq+9MeJzY6HRYwuPE/dNP3exFRPJWzb3YOSY2/NQzz2Q7EhGpRvJ5Kpb4IaeKi4vp1atXmTH06tWL2OVOLVu2pEePHts9X1hYSNu2baN/0AqKVBIzs6bArsACd9+UtmiyIdVj3YhI3qvpU7H88MMPvPjii/z2t7+t8HuuXr2ab775hhYtWvDxxx9XOvaoyi2JmdkFZvYIcBNwATDOzP5uZq3SHlmmFBQECWzs2OBaMRHJe5qKZfv3rehULEOGDOGmm26q0DGPOe2005g4cSIAEyZMYMCAAZV6naiSVSe+6+5/cPfz3b3I3U8naNeqXhdJq3OHSPYtXRqMopOiH5Off/45l1xyCXPmzGH33XfniSeeAODMM8/ktttu48MPP6Rdu3YMGzasZJ+ffvqJ4uJi/vznPwNQt25diouLufDCCznxxBO59957+eijjxg3bhzLli0D4MEHH2TWrFkUFxdz9913l6wvzfDhw5k9ezbTpk1jjz32YPDgwXz88cdMnDiRmTNnMnv2bGrXrs348eNZtGgRN9xwAzNnzuT1119n7ty5pb7msGHDOPzww5kzZw4nn3wyCxYs2GGbZ555pmQU+iuvvJLhw4fTv39/Zs+eTf369XfYvnv37tStW5dXX301+gEPnXLKKSWj6j/77LP87ne/q/BrVES5Sczd3zOzn5lZfzM708zOdPe17v55WqPKtBNOgOOOU+cOkWxK8Y/JqFOxzJgxo2SfKFOx7LzzziVTsQDcfffddOjQgW7dupVMxVKexKlYXn755ZKpWAoLC3n55Zf58ssvt5uKpW7dujvEFjNjxgzOOOMMIHVTsQBce+213HjjjdutM7NSt41f36RJExo3bsyjjz7KQQcdRIMGDVIST1midOz4G7AW+D68VT/q3CGSfSkeeCBxKpbNmzcn3acqU7F88MEHdOzYsdJTscyePZvZs2fz6aefMnTo0KgfM21+/etfs379+u1G5m/SpMkOo+QvX76cgoQh+/r3788ll1yS9qpEiJbE3nX359z9JXd/Ke0RZYNKYiLZl4G5WDQVS8Vce+21jBgxouRxly5dmDlzJosXLwaCnosbN26kRYsW2+138sknU1RUxDHHHJOyWMoSpW3rlHBkjXWAu/tpaY4p8zTLs0iNoalYojvuuOOIHx1pr7324q677uK4445j69at7LLLLkyYMIFatbYvDzVq1Igrr7wyZXGUJ9JULGbWCMDdV6c9oohSMhVLzNKlQT38oEEayV5ylqZikZqgolOxJK1ONLNrgZHASDO7PiVR5hp1sxcRyUtR2sT2cPfz3P08gulSqid1sxcRyTtR2sR2N7OzwuUm6QwmqzSGoohI3olSErsAWBreLkhvOFmkbvYiInmn3JKYmd1OMMdX7Eq2nkBRuoPKCpXERETyTrLqxNEJj5N3ZcxX6mYvIpJ3klUnngxcEt4Gh7fqadAguOEGWLtWPRRFqrFJkyZx0EEHceSRRwIwYMAA2rdvz513Jk5/WL6VK1fy97//veTxd999x6mnnprSWLPt5ptvTttrx08ZUxXJSmITgbpVfpd8UFAADRsGPRQbNlRpTKSaeuCBB/jXv/7F4YcfzuLFi3n33Xf54osvKvw6sSR28cUXA7DPPvvw+OOPpzrcrHB33J2bb76Za665JtvhlCvZAMCLgF7AYuBWoHpPuqXhp0SqjdKmNxk+fDivv/4655xzDkOGDKF37958++23FBYW8tprrzFv3jyOPfZYOnXqRI8ePfjkk08A+P777zn55JPp0KEDHTp04I033uCqq65i3rx5FBYWMmTIEObPn18y+WO3bt2YM2dOSSyxiSPXrl3L2WefTdeuXenYsSNPP/30DnEvWrSII444omQyydgQWbFpVQAef/xxBg4cCMDAgQO58MIL6dy5MwceeCDPPfccEExgeeKJJ9KrVy8OOOCA7UbrHzlyJG3btqVt27aMGjUKCKavad26NWeeeSZt27blnHPOYf369RQWFnL66afvEOeUKVPo3r07Bx98MP369WPNmjVAUMK64YYbOPjgg2nXrl3JMSxvypiqiNLFvi3wa+Dh8L76UruYSMoNe3YOc7/7MaWv+at9duWG37Up8/n46U3q1KnDxRdfzPjx47n++ut55ZVXuOOOO+jcuTOXXHIJffr0Yfbs2UAwjuGYMWM44IADePvtt7n44ot55ZVXuPTSS+nZsydPPfUUW7ZsYc2aNdx666189NFHJfvOnz+/5P379+/PY489xrBhw1i0aBGLFi2ic+fOXHPNNfz617/mwQcfZOXKlXTt2pWjjjpqu4GH//Of/3DMMcfwl7/8hS1btrBu3bqkx2P+/Pm88847zJs3jyOPPLKkZPnOO+/w0Ucf0aBBA7p06cLxxx+PmTF27Fjefvtt3J1DDjmEnj170rhxYz7//HMeeuihkuGzJk2aVPL54i1dupQbb7yRqVOn0rBhQ2677TZGjhzJ9dcH42EUFBTw3nvv8fe//5077riD+++/v2TKmOuvv57nn3+eBx54IOnniiJKEtuVoGv9/wP6pORdc5V6KIpUC/HTmwCsX7+ePffcs9x91qxZwxtvvEG/fv1K1m3cuBGAV155hYcffhgIRsTfbbfdyh1o97TTTqN3794MGzaMxx57rKStbMqUKTzzzDPccccdAGzYsIEFCxZsN8xSly5dOPvss9m0aRMnnXRSmWMmJr5frVq1OOCAA9h///1LSj9HH300TZoEl/f27duX119/HTPj5JNPLkmcffv25bXXXuOEE05gv/32Szr+I8Bbb73F3LlzOeyww4BgHrbu3bcNh9a3b18gmAInNrfYjBkzSpZTOWVMlCR2IXAI0AG4PCXvmqtUEhNJufJKTOkSm97klltuibzP1q1b2X333UsteVRUs2bNaNKkCR9++CETJ05kzJgxJXE98cQTtG7dusx9jzjiCGbMmMHzzz/PwIEDueKKKzjzzDO3m7MrcbqXxHm+Yo/LWl+WxKloyuLuHH300UyYMKHU52PT1kSdAqcqolzsfA9BEjsCGJPWaLJNPRRFqoWypjcpz6677kqrVq1Kpjxxdz744IOS1/vHP/4BwJYtW1i1ahWNGjVi9eqyx0Tv378/I0aMYNWqVbRv3x6AY445hnvuuaekPej999/fYb+vv/6avfbai/POO49zzz2X9957DwhGkP/444/ZunUrTz311Hb7TJo0ia1btzJv3jy+/PLLkiT53//+l+XL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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Absolute difference at end of effective support: 5.683814748234242e-17\n", "Absolute difference at end plus epsilon of effective support: 5.683814744804177e-17\n", "Absolute difference at start of effective support: 1.1241695419023114e-08\n" ] } ], "source": [ "epsilon = 1e-11\n", "\n", "def print_relative_diff(t):\n", " print(\"FFT grid points (output):\" +str(time_fft[t][1]))\n", " print(\"NUM grid points (output):\" +str(time_num[t][1]))\n", " eff_support = accuracy_fft[t].effective_support\n", " norm_y_est_fft = get_P(x, accuracy_fft[t])\n", " norm_y_est_num = get_P(x, accuracy_num[t])\n", " plt.figure()\n", " plt.plot(x[2:], ((norm_y_est_fft -norm_y_sol)/(norm_y_sol+epsilon))[2:], 'o', markersize=1, color=\"blue\", label=\"normalized diff FFT\")\n", " plt.plot(x, (norm_y_est_num -norm_y_sol)/(norm_y_sol+epsilon), 'o', markersize=1, color=\"red\", label=\"normalized diff NUM\")\n", " # plt.plot(x, norm_y_est_fft, 'o', markersize=1, color=\"blue\", label=\"FFT\")\n", " # plt.plot(x, norm_y_est_num, 'o', markersize=1, color=\"red\", label=\"NUM\")\n", " # plt.plot(x, norm_y_sol, 'o', markersize=1, color=\"green\", label=\"analytical sol\")\n", " plt.axvline(x=eff_support[0], label= \"effective support start\")\n", " plt.axvline(x=eff_support[1], label= \"effective support end\")\n", " plt.legend(prop={\"size\":10})\n", " plt.xlim((0,1))\n", " #plt.yscale(\"log\")\n", " plt.ylabel(\"(calculation - analytical_sol)/(analytical_sol + epsilon)\", fontsize=7)\n", " plt.xlabel(\"Time\", fontsize=7)\n", " plt.title(\"Normalized Difference Estimated and True Solution\", fontsize=12)\n", "\n", "def print_relative_diff_grids(plot_support_closeup=True):\n", " for t in range(len(grid_size)):\n", " print_relative_diff(t)\n", " plt.show()\n", " eff_support = accuracy_fft[t].effective_support\n", " if plot_support_closeup:\n", " x_support = np.linspace(eff_support[1]-0.1, eff_support[1]+0.1, num=1000, endpoint=False) #create an x vector of points that should be sampled\n", " norm_y_sol_sup = get_P(x_support, dist_sol)\n", " norm_y_est_fft = get_P(x_support, accuracy_fft[t])\n", " norm_y_est_num = get_P(x_support, accuracy_num[t]) \n", " #print(accuracy_fft[t].x)\n", " plt.figure()\n", " plt.plot(x_support[2:], ((norm_y_est_fft -norm_y_sol_sup)/(norm_y_sol_sup+epsilon))[2:], 'o', markersize=1, color=\"blue\", label=\"normalized diff FFT\")\n", " #plt.plot(x_support, norm_y_est_num, 'o', markersize=1, color=\"red\", label=\"normalized diff NUM\")\n", " #plt.plot(x_support[2:], norm_y_est_fft[2:], 'o', markersize=1, color=\"blue\", label=\"normalized diff FFT\")\n", " #plt.plot(x_support, norm_y_sol_sup, 'o', markersize=1, color=\"green\", label=\"normalized diff NUM\")\n", " plt.plot(x_support, (norm_y_est_num -norm_y_sol_sup)/(norm_y_sol_sup+epsilon), 'o', markersize=1, color=\"red\", label=\"normalized diff NUM\")\n", " plt.ylabel(\"(calculation - analytical_sol)/(analytical_sol + epsilon)\", fontsize=7)\n", " plt.xlabel(\"Time\", fontsize=7)\n", " plt.title(\"Normalized Difference Estimated and True Solution\", fontsize=12)\n", " plt.axvline(x=eff_support[1], label= \"effective support end\")\n", " plt.legend(prop={\"size\":10})\n", " #plt.yscale(\"log\")\n", " plt.show()\n", " print(\"Absolute difference at end of effective support: \" +str(get_P(eff_support[1] , accuracy_fft[t])- get_P(eff_support[1], dist_sol)))\n", " print(\"Absolute difference at end plus epsilon of effective support: \" +str(get_P(eff_support[1] + epsilon, accuracy_fft[t])- get_P(eff_support[1]+epsilon, dist_sol)))\n", " print(\"Absolute difference at start of effective support: \" +str(get_P(eff_support[0], accuracy_fft[t])- get_P(eff_support[0], dist_sol)))\n", " \n", "print_relative_diff_grids(plot_support_closeup=True)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The start of the effective support is extremely overestimated for the FFT-based solution, this effect decreases as the grid size increases. However, what is more striking is the underestimation inside the effective support, I wonder if this is linked to the fac that the distributions are normalized and overestimating the left and right bounds would lead the center to be deflated. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Further components to look at in more depth: \n", " - The function performing numerical integration creates a grid where parts are linearly and parts are quadratically spaced, it would be interesting to see how this effects the accuracy and if this is responsible for the osscilation of the numerical approximation difference. \n", " - Apply adjust_grid to the convolution function output and see if this has an effect on the accuracy.\n", " - Look into how BranchLenInterpolator and NodeInterpolator Distribution objects are stored (grid point location), apply this to the dist_1, dist_2 Distribution objects and check how this effects the accuracy. \n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The convolve function creates an output grid which is linearly spaced around the center (estimated peak position) and then quadratically spaced to the left and right, with additional grid points added around 0. I shall add further vertical lines with the start and end position of this center linear grid. (I noticed that this linear center grid would span from -8 to 13 under regular circumstances but as the code will remove points lower than 0 these points are cut off)\n", "\n", "This area will have additional grid points, if the interpolation error is above a pre-specified threshold, I did not check for this but this is most likely occuring as otherwise much less grid points would be used as there is no left quadratic grid. (Code seems to function similarly to adjust_grid function just instead of removing points we add points)." ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "The bounds for the linear grid should be:-0.17200000000000004to 0.272\n", "FFT grid points (output):55.0\n", "NUM grid points (output):139.0\n" ] }, { "data": { "image/png": "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L3DGGWfwyiuv8Pzzz3P44Yczb948jjjiCJ577jkAfvjhB6ZNm0bPnj1Zt24dEydO5KGHHmLMmDG88MILDBkyhGeeeQYIuvTmzp3L+eefz9NPP13q/Y4fP55///vfHHDAAQwdOpQXX3yRli1b8uqrr/K73/2OCRMmMHXqVDp37sz06dNp3LjxDvsYOXIkU6dOZdKkSXzxxRcl1o0aNYoePXowceJERo0aRd++fXdIYEuXLi3uTvz2228BGDJkCNnZ2dx33307d0CTLONaYvn5MGxYMD10aGpjEZH087e/Ve4cceSRRwLQokULNm7cyFdffcVRRx0FwM9//nMWLVpE06ZNi5cBHHTQQdSpU4fmzZtz2GGHUaNGDZo3b86yZcvYvn07Q4cOZenSpXz33Xf07t27zPu+7rrrGDBgAIceeijTpk3jqaeeYsaMGRQUFNClSxfMjI4dOwLQqVOnHW6/ceNGWrZsCcDBBx9c4cce350IlNqdmE4yriVWqxbcfTf0r8yP24vILqt//8qdI8yseNrdadu2LYsWLQJg4cKFtG3bFqDEdbDY28Tf/r333mPLli3MmzeP3/72t7h7qfc7efJk6tWrxznnnAPAIYccwm9+8xvmzJnD/PnzGT16NG3atGHJkiUALF68eId9NGzYkC+++IItW7bwf//3fzt3ADJMxiUxs+DTVSktaRERGjeu2nNEr169+OCDD+jWrRtLly7l3HPPrdDtDznkEJYvX87pp5/O22+/XeZ2t956K/Pnzyc7O5s777yTs88+m5UrV3LyySdz8skn8/LLL9OrVy/eeOMNTjvtNDZu3LjDPm6++WbOPvtsBgwYUNwi29VZWZ8K0lWjVod53mfLUh2GxFEB4PSyKxYAXrZsGYcddliqw5AqFv+8mtkid/951NtnXEtMRESkiJKYiIhkLCUxERHJWEpiIiKSsZTEREQkYymJiYikQDoWADYzZs2aVXy7iRMnsnLlSi6++OId7nflypWYGQsXLgSC33vLysqq9pqKSmIiIpVQWFhYqduPGzcuqT8x069fPzp16sRXX31FgwYNmDdvHkuWLKFr1648++yzJbZt27Yt48ePj7zvTp068fzzzwPwz3/+s7iaSHXKuLJTIiLJsrsXAG7WrBn169fn448/jnS8Dj30UJYtC763O2vWrJSUp1JLTER2LZWsALw7FwAGGDRoUIWK/R566KEsWLCAOnXqULt27ci3qypKYiKyaymqAPy3v+3UzeMLAH/yySclCgAvX74cIFIB4A0bNhQXAO7WrRsPPPAAq1evLvO+YwsAL1u2jKeeeors7Gxuv/128vLyWLFiRaQCwPXr19+pAsBFj/GTTz4pbsnVqVOHbdu2Fa/funUrdevWLZ7v1asXV1xxBWedddZO3V9lRUpiZtbEzNqaWa1kByQiUimVrACsAsBw2WWX8de//hWApk2b8vnnnxcnstdff7040QMcffTRdOrUiTPOOGOn768yyk1iZnaFmT0O3A5cAeSa2Xgza1Mt0YmIVFQVVwDeHQsA9+7dm++//x4IkvLw4cM56aST6NatGwceeCBHHHFE8bZmxiOPPEL9+vV3+v4qo9wCwGZ2lLu/G7esHtDc3VNS518FgNOTCgCnFxUAlkxR2QLA5Y5OdPd3zawZcCJQO1z2GLB7/FCNiIiktSjXxO4BtgBrwz8REZG0EOV7Yu+4+4tJj0RERKSCoiSxc82sB/A94O5+fpJjEhERiSRhEnP3rmbWIJzelPyQREREokl4TczMbgLGAmPN7JbkhyQikj6iFM4tz6RJk4qnf//73ycjxCo3depU8vLyEm4X+9gSee+993j33XcTb1hBUQZ2NHL3ge4+EGhQ5RGIiKSxKIVzyxN7or///vuTEWKVKiwsrPIkVlhYmLQkFuWa2N5mdkk4vW95G5rZmQRfin4OaAzUc/eRZpYDbALWAVOBkQQjHqcQJNJzgD2Bm919S8UfhohI5bn7DkV3hw0bVmrh3GuuuYYBAwawadMmDjvsMMaPH8+aNWvo378///vf/+jSpQtt2rRh6dKlZGdnc//993PVVVfxyiuvcNZZZ/Hvf/8bgO7du/Pyyy8zc+ZM7r77bgoKCrjllls4/fTTi+N6/vnnueOOO6hfvz7XXXcd69ato6CggMsuu4ycnJzin10ZPXo0NWvWZNu2bUyZMoXvvvuOiy66iH333Zd169bx5JNP0qZNG+666y6mTZtG7dq1yc3NpWXLlrRv35527dpx8MEHM336dJYtW8Z5553H0KFDAcjLy+Occ87BzGjXrh2nnHJK8WO78cYbWbhwIdOnT2fr1q1MmDCBjh07kp2dTefOnVm9ejUrVqzgm2++Yfbs2UyePLnKnrMoSewK4NSY6VKZWUegDrAC6ODug83sFjPbByh093vM7F5gM/A88AYwGjBgOHAc0IMgyYmIlOq2Fz7gw9XfVWofhzffi1t/ccQOy4uK7j744IO8/PLLTJgwobhI7sSJE5kzZw6zZs1i1KhRDBkyhOHDh9OlSxeuv/563nzzTZ566ikGDx7MqaeeSmFhITVq1OCxxx4r8RtbtWvXpmnTpqxatYrt27ez//77k5WVxZ/+9CdeffVVCgsL6dmzZ4kk9o9//INnnnmG1q1b4+48+uijpT4ud+fll1/m6aef5uGHH+ZXv/oVeXl5zJ07l0WLFnHXXXeRk5PDq6++yuuvv878+fO54447ePDBB/niiy944403qFevHitWrOCmm27ioIMOKt734sWLyc7OJicnB3cvTmZFj+34449n+PDhLF++nFtvvbU4UfXu3ZsuXbqQm5tbnHirUrlJzMzGAE6QaCD40vOwMjbvSTCCsSNQ9AM7Xs7/2FIhZZcNCeK4HLgcoP5+bcvbVERkpxUV3Z0xYwYFBQV06VJ2xZNly5Zxww03YGZs3ryZzp078/HHH3P77bcDJWsrxjvnnHOYMmUKhYWFnHvuuaxfv55ly5YV/5TJunXrihMFwI033sioUaMoKCjgxhtv3KE+Y5Gi4sAdOnQobum1a9eOrKwsOnTowPLly1m5ciU/+9nPgKDY72233QYE5bHq1atXZszdunVj7ty5XHTRRZx++un07du3xPrHH3+cyZMnU6NGjRLxlVaouColaok9EDdfZrJx99EAZtYaWGxmQ8LlG8ysppn9AXgXmAXcRtC6+ztQE8gh6E68tYx9Pww8DEHZqQQxi8gurLQWVFUpKro7ZMgQAPLz8/nyyy/L3Pbiiy8uPkkXFBTw2muv8dZbb3HKKacUt8RiT+hFevbsSe/evQH43e9+R61atWjXrh0zZsygZs2a5Ofnl7hdq1atmDhxIm+88QZjx47ltNNOY+nSpQAsXbqUk046CaC4OPCSJUuKCxW///77bN++vXhZ69ati7crq6BxrVq1dvi16e3btzNy5EggSJJ9+/YtEeP48eNZvHgxn3zyCQMHDixeXrTfWrVqlaiGX1USJbHeQPNw2giSWFktMQDc/dpSluXELfpD3PyiBHGIiCTd2WefzaBBgzj55JMBuPbaa4tbLfFGjBjB5ZdfzrfffkuNGjWYOHEiN9xwA5dccgmjRo3iuOOOY/To0RxwwAGce+65xS00gLp167L33nuTlZVV/Btcf/jDH+jevTtmxuGHH85f/vKX4u1zcnJ466232Lx5M/fccw+dOnVizJgxvPPOO2Rl/Xgar1WrFqeffjpbt27lueeeY9OmTfzkJz+hV69efP3110yePJlmzZpx0kkncdxxx7HHHnuU2jV52mmncfXVV9OnTx+uvPJKAN5++21GjBhBfn5+cYuxc+fO9OrViyFDhtC5c2e6detGt27dSj1exx57LP369eP999+v0gEuiQoA7wfsEbvM3T+rsnvfCSoAnJ5UADi9qADw7if2el2RlStXctNNN/HEE0+kMLLyVbYAcLlD7N39KyAbWAPcCezcD/SIiIgkQZTRiUcCJwOPhf9FRCTNZGdnFw+1L9K6deu0boVVhShfdt6LYGj9bILBFyIiImkhSkvsSuAYoD1wbVKjERERqYAoLbH7CZJYN2BCcsMRERGJLkoS+8jd73P3McBXyQ5IRCSdqADwzlu5ciX9+vWrfEDliJLELjCzh81sEpBtZncnNSIRkTSiAsDpLco1sYuSHoWISBpQAeCyCwBDUD+y6MvR9913H0cddRTt2rWjXbt2fPDBBzz66KN06NCBW265hdmzZ3P44Ycn/TmLksR6AUe6+0Azu9nd/5jkmEREyqQCwKkpALx+/XqmTZvGvHnz2LBhA5deeilTp05l3bp1TJo0iUWLFvHoo4/StGlT3n77bV577TX+/ve/M3PmzEo9V4lESWJtgVXhtH5PTER2WSoAXHYB4BUrVrBkyZLiOo1FDjroIOrUqUOLFi3YuHEjn332WfH+O3XqlBZJzIG6ZnYkP9ZRFBFJCRUATk0B4DZt2nD00UczZcqU4mMD7JBQW7VqVRzb4sWLyzvcVSJKErsHuBroC4xIbjgiIqmjAsCB0goAN2nSpHiUZs2aNTn55JO5+eabd7jtfvvtR6dOnejatSvt27ffiWehYsotAJyOVAA4PakAcHpRAeDdjwoAi4iIZJgo3YmYWQ13L0y8pYiIpIIKAJcv/heeRUREUq7clpiZNQAaAQ3MrCWAu39eHYGJiIgkkqgl9jOgH3BI+L9fcsMRERGJLtEvO7/u7rcBi9x9pLuPrKa4RESq3Zw5c7jpppuA1BbrnT59Ov/6179KLJszZw45OTmV3ne/fv1YuXJlpfeTLiIN7AAmJzUKEZE0U5XFeou++Bx129iSU1K+SEnM3ecnOxARkXRywgknMH/+fLKzs+nUqRPz5s3jyiuvZMCAASxYsIDrr7+e/Px8LrvsMvr3788dd9zB9OnT2bp1KxMmTKBjx45kZ2fTuXNnVq9eXWKU4IQJE8jNzeXEE09kwYIFzJkzp8S2p5xySnGB30svvZTPP/+cZs2alahlCPD111/vUIQ4JyeHFStWsHr1alq3bs3EiRP59NNP+dWvfkXTpk3ZuHFjNR/J5IraEhMRSQvXTr+W99a8V6l9dGjWgXGnj4u8/cUXX8zo0aPp0aMHAwYM4JZbbmHatGk0aNCAHj16cNFFF3HNNdcwfPhwli9fzq233srkyUEHVu/evUvUYCwoKCA3N5fXX3+dhQsXsmDBguJ1Rdvm5uYC8Pbbb1OzZk1mzZrF6NGj+eGHH0rEdeedd+5QhBiCGoqPPfYYp556Khs3bmTMmDGMHTuWY445plqqaFQnJTERkQSOPPJIatWqVdwluGTJEs4++2wgqO7+9ddf8+KLLzJ58uQd6iUW1VYssn79elq2bEnNmjXp0KFDiXXx265YsaK4qG+nTp2Kk1SR0ooQF8UL0Lx5c7799tvi/WRlZZVZRitTJRpi/yxBAWAAA9zdz096VCIiZahIC6qqxBfx7dixI1OmTKFevXrk5+dTq1Ytxo8fz+LFi/nkk08YOHBg8bbx18IaN27MqlWrKCws5D//+U+JdfHbtmnThtmzZwOlF9MtrQjx0qVLdyjK26ZNG5YsWULnzp2Li/PuKspNYu7eB8DMjiCos/h+tUQlIpLGbrvtNn7xi1/g7jRq1IjnnnuOzp07061bN7p161bubbOysrjkkks47rjj6NKlC7Vq1Spz22OOOYYHH3yQ7t2706pVK1q2bFlifWlFiEtz3XXXceGFF9K0aVOaNm1a8QecxhIWADazccA34WwTdx+U7KDKowLA6UkFgNOLCgCnt4KCArKysliwYAGTJk3ioYceSnVIKVPZAsBRroltL/o1ZzO7u+IhiohIrPvvv5+pU6fyww8/lPkrzRJNlCSWZWa3htN1kxmMiMjuYPDgwQwePDjVYewSEiYxd78mvCaGu3+Q/JBERESiSfgVcjO7FvgcuNvM/pz0iEREyrB9+/ZUhyBVqCqezyjdiS2BU4G7gTMrfY8iIjuhUaNGfPzxx6kOQ6pYo0aNKnX7KElsK3A2MAA4o1L3JiKyk3bF4eFSeVGuiY2Imb0ewMwud/eHkxaViIhIBFF/2TlesyqNQkREZCfsbBITERFJuZ1NYmurNAoREZGdkKgA8Bh2LAA8zN133xopIiKSNhIN7Hggbr78QosiIiLVKFEV+8/M7BigL7BnuPjSpEclIiISQZRrYgOBjUAO8GkygxEREamIKElsLVAHKAT0TUMREUkbUSp2TAZ+AIYBs8rbMCwUfBrQBlgINAbquftIM8sBNgHrgKnASGALMIUgmZ5D0GV5s7tv2YnHIiIiu5koLbED3X15+GOY28rbMKxyvxbYH+jg7vcAmNk+QGE4fxRwCvA8QRflhcCvw+mpQI+deSAiIrL7iZLEToyZ7ppoY3efDEwEWhctKud/7GjHMkc+mtnlZrbQzBbm5+dHCFlERHYHUboTm5hZd4Iks195G5rZ6cDPgLbAVDMbAuDuG8ysppn9AXiXoFvyNoLq+H8HahK0xPYEbo3fb1in8WGARq0O0zB/EREBoiWxQcBF4fQ15W3o7tOB6WWsy4lb9Ie4+UURYhERESlWbneimZ0PXBxuVyOcFhERSQuJWmKfULJOorryREQkbZTbEnP3RcDx7j7X3ecC3asnLBERkcQSFQB+FjjczDqEi35IekQiIiIRJaqd2MfMurr7a9UVkIiISFRRvic2wMzuMLNWSY9GRESkAhIOsXf3fmbWGviLmeUDt7v7wqRHJiIikkDClpiZ9SGoczgLuIoE3xUTERGpLlG+7FwAXOLuDmBmQ5MbkoiISDSJRieOCSe7mBkA7j4s2UGJiIhEkagl9kDcvL7sLCIiaSPREPvPzOwYoC9BcV6AS5MelYiISARRhtgPBDYSVJn/NJnBiIiIVESUJLYWqAMUAk2TG46IiEh0UUYnTiYoNzWUYJi9iIhIWojSEssDOhH8mOVeyQ1HREQkuihJ7E/AFmANJX+WRUREJKWidCcudPcXkx6JiIhIBUVJYueaWQ/ge8Dd/fwkxyQiIhJJlALAXasjEBERkYpKmMTMbABwfrhtTXfPTnZQIiIiUUQZ2NEBeNPduwMvJTccERGR6KIksY3AHmZ2MXBUcsMRERGJLsrAjtEEhX/PAIYnNxwREZHoym2Jmdl1QH133+ru/3D3T83sZDPrXk3xiYiIlClRS2wqcL2Z/RTYDuQDzwD/SHJcIiIiCSVKYh2A29x9UzXEIiIiUiGJkthaYJiZNQQ+Af7l7suTH5aIiEhiiX4U8zXgNQAzawOcZWY/dfdB1RGciIhIeaJ82fnnwEkEFew/Bm5OdlAiIiJRJBqd+DBwLPAG8CTBd8ZGmtlpyQ9NRESkfIm6Ey+PW/Qh8ELywhEREYmu3CRmZs8SfNHZwkWqYi8iImkjUUusT3UFIiIiUlFRBnYMBHoQtMhmu/uEpEclIiISQZTaiT8r6kI0s3HJDUdERCS6KEmsoZmdGE43SmYwIiIiFRHlp1iuBY4M/65NZjAiIiIVESWJnQBMIEhiv05uOCIiItFF6U48HvgOeAU4LrnhiIiIRBelJXYAQTfiTKIlPRERkWoRJSldAtR2981mNhrAzE5195nJDU1ERKR8CVti7p7v7pvD6TXh4mOTGpWIiEgEVdY9aGZdCa6Z/RR4FWgDNASuBwYDhQRfmL4fuBvYACwElgG/D3dzn7t/UVUxiYjIri3KNbHSWPwCd3/N3e8CVgJ93P124H2gPXCAu48DWofz/wnXnw6cS5DY7gfOK/XOzC43s4VmtjA/P38nQxYRkV1NogLAZ8Qvc/eXgDvL2P5C4FNg3zJ26eX83yExxtznw8DDAI1aHeZlbSciIruXRN2JTeLmHcDdt8VvaGbnA78BpgPvmdkIgu7Ex4HPzexaglbaEuBCMxtOMOLxQ37sTvzzTj0KERHZLSWqYv+ome0DdAfqJdj2GeCZMlbfGzc/NG5+WHn7FhERKU2Ua2JjgV8StMJOSW44IiIi0UUZnbgOMHd/zMz2T3ZAIiIiUUVJYnOB7WY2FfggueGIiIhEFyWJrXD3/wIzzOyQZAckIiISVZRrYpfFTF+SrEBEREQqKkpLrImZ1Sb4HlezJMcjIiISWZQkNg6YGE7HD5UXERFJmUQVO9oA2/ixQoeqZYiISNpI1BI7FWjKjyWhHBiZ1IhEREQiSlSx4yEzu9Dd/w5gZhrYISIiaSNRd+JvgZ5mtjdBa6w78Gg1xCUiIpJQou7E9wmK+H5A8HtgU5IekYiISETlfk/M3ecChwJ7hr8XtrZ6whIREUks6pedm5jZU2Z2jZmVW81eRESkukRJYvsCBwLfAWuAR5IakYiISERRvux8HfAXd18BYGarkhuSiIhINIlGJ54BvAocamaHArj7S9URmIiISCKJWmJN4uZVsUNERNJGotGJjwLTgC3VE46IiEh0UQZ2jAV+SdAKOyW54YiIiEQXZWDHOsDc/TEz2z/ZAYmIiEQVJYnNBbab2VSCyh0iIiJpIWESc/eXzKwpcA0a2CEiImkkYRIzs0nAN0ABQRIbkeygREREoojSnfi+u49NeiQiIiIVFCWJ/dLM2hIOs3f3YckNSUREJJooSew3MdO6JiYiImkjShJrBvQF9gznL01eOCIiItFF+bLzQGAjkAN8msxgREREKiJKElsL1CH4ZeefJDccERGR6KJ0J04GfgCGAa8kNxwREZHoonzZ+cNwclCSYxEREamQKN2JIiIiaSlyEjOzrskMREREpKIq0hLrnbQoREREdkJFktizSYtCRERkJ0ROYu7+ZjIDERERqSgN7BARkYwV5adYmgEnArUB3P2xZAclIiISRZSW2D0EFezXhn8iIiJpIUrFjnfc/cWkRyIiIlJBUZLYuWbWA/gecHc/P8kxiYiIRBKl7FRXM2sQTm8qb1szOxgYAUwlqLfYEWgIXA8MJigi7MD9wN3ABmAhsAz4fbib+9z9i514LCIispuJMrDjJqBVOL3K3UeWta27f2xmucDeQA93H2xmvwHaAweE8/eG8/9x98fC+cMJEhvAecC4nX9IIiKyu4gysKORuw9094FAgyq4T0/wfwdmdrmZLTSzhfn5+VUQgoiI7AqiXBPb28wuCaf3LW/DcDj+eUBdYJ6ZjSDoTnwc+NzMrgVWAkuAC81sODAT+JAfuxP/HL9fd38YeBigUavDykx2IiKye4mSxK4ATo2ZLpO7rwF+V8bqe+Pmh8bND4sQi4iISLFyk1jYcmoOWLjoRJRsREQkTSRqiT0NNAI2h/P1kxuOiIhIdOUO7HD3r4Bz3f0zd/8MuKh6whIREUksUXfis8DhZnZkuEhlp0REJG2Um8TcvY+ZHeHuH1RXQCIiIlFFGZ3YxczGhtvWdPfs5IYkIiISTZQvO7cH3nT37sBLSY5HREQksihJbCNQ28wuBo5KbjgiIiLRRelOvD38fwZwQxJjERERqZBEoxPH8GNNQwOORV92FhGRNJGoJfYA5RTmFRERSaVEQ+w/M7O/ESQyC/9fWh2BiYiIJBLlmtiV4f96wMAkxiIiIlIhUZJYzfB/AUExYBERkbQQJYn9haAbcRvwfHLDERERiS5KErvb3ZcBmNnBSY5HREQksihfdh4QM90vSXGIiIhUWJSWWBMzqxNON0tmMCIiIhURJYmNA/4aTt+bvFBEREQqJlHFjsMJBnTcGS7SF59FRCRtJGqJ9Qn/xyavkUmKRUREpEISVey4zcyygI7AnqRBS8wdxoyB/v2hceNURyMiIqkU9XtizYF3gKOBeUmNKIH8fBgWliAeOjSVkYiISKpFGWK/CVjq7iNJcQIDqFUL7r47aImJiMjuLUpLbDGAmf0TWJ3ccBIzUwtMREQCUZLYTHf/GphsZk2SHZCIiEhUUboTr4+ZHpysQERERCoqShJrFDOt8YAiIpI2onQnPmVmzwGFwCNJjkdERCSyRBU76rj7TGBmKcu3JjUyERGRBBK1xO4wMwc+BDYCbcK/ycDryQ1NRESkfIkqdgw2s0ZAF2AvYLa7j6mWyERERBJIeE3M3fOAf1VDLCIiIhUSZXSiiIhIWlISExGRjKUkJiIiGUtJTEREMpaSmIiIZKyMS2JFP4q5fn2qIxERkVTLuCRW9KOYf/tbqiMREZFUy7gkph/FFBGRIlEKAKcV/SimiIgUSYuWmJkdZWajzGysmdVLtP1HH8GZZwb/RURk95UuLbFfA8OB44AewNQyt/z+e/Zu15wJ+c6Gl/ZlNXmA8+0e+9Ig/1s21WpIwx9+XFbR6XTZRzrGVN4+vu//HVlewOr+++nYpMHr5vsLh1PTt7Ns0MCUx5Qu+0jHmHalfVTF/hrkf8uh1OlQ2qm/LObuFdk+KcxsDHADcDzQyN2nxq2/HLgcYJ9GLTrl5X1Z7TFK+bL7Bf/n5KYyCilywa/vAODpJ4enOBKRivk5sNDdom6fLi2xp4AcYE/g1viV7v4w8DBAoyatvOAn+7F5i7N2+7402Jp+n0jS5VNNtbbELGyJ0UjHJg1eN9/bnkFLbI8jUh5TuuwjHWPalfZRVS2xLb5+e3wOKE9atMQqolGrwzzvs2WpDkPiZOdmAzCn35yUxiGBCx56E4Cnr+iS4khEKsbMFrn7z6NunxYDO0RERHaGkpiIiGQsJTEREclYSmIiIpKxlMRERCRjKYmJiEjGUhITEZGMpSQmIiIZK+O+7GxmmwCV/o2mMaCfD41Oxys6HauK0fGK7hB3bxB143QpO1URH1Xk29y7MzNbqGMVnY5XdDpWFaPjFZ2ZLazI9upOFBGRjKUkJiIiGSsTk9jDqQ4gg+hYVYyOV3Q6VhWj4xVdhY5Vxg3sEBERKZKJLTEREREgA0YnmtlRwDkEP5h5s7tvMbM/AIWAu/t9KQ0wjZRxrK4G9iU4VqNSGmCaKeN4GXA38KW7j0tlfOmkjGN1AdASWOnuz6Y0wDRTxvEaA6wB9nf3wSkNMI2Y2cHACGCqu08Nl11C8LWEeu4+srzbZ0JL7NcEv/o8FegRLjsgPMG0TklE6WuHY+Xu44G7gP1TFlX6Ku219VvguRTFk85KO1Z9gc0piifdlXa8soD6wDepCSk9ufvHQG7c4g7ufg+Ame1d3u0zIYkBlHXhThf0dlTimJhZHeCO8E92VHy8zKwR8FPgDOBEM6udsqjSU/z7rba7P8iPJ2kpKf54febutwENUxFMhkp4jk/77kTgKYJPNHsCn5pZDeBzM7sWWJm6sNJSacfqaeAD4FTgr6kLLS2VOF7ARne/xsxaA73cfVsKY0s3pb22ppvZNcBXqQwsTZV2vA4Mj9fWVAaWbsysGXAeUNfMGgIzgPfMbAiAu28s9/YanSgiIpkqU7oTRUREdqAkJiIiGUtJTEREMpaSmIiIZKxMGJ0osssys7rAvUBzYB+gBdDf3eemNDCRDKHRiSJpwMyygSMJvjy8nqBawUnA/wiGsNcK158PnAicCdQFnnP3mdUfsUh6UHeiSPqa4e5XAt3c/SbgbeAIYBCwkSC5dU5deCKpp+5EkfT1Xfj/6/D/D0Btgg+fo9y9ICVRiaQRJTGRzPNnYKKZ5QEL3f3vqQ5IJFV0TUxERDKWromJiEjGUhITEZGMpSQmIiIZS0lMREQylpKYiIhkLCUxERHJWEpiIiKSsf4fObsL17qpcXMAAAAASUVORK5CYII=", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "FFT grid points (output):94.0\n", "NUM grid points (output):178.0\n" ] }, { "data": { "image/png": "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YICBAwcmVey3TZs2zJs3j9q1a1OrVq3Iy1UWJTER2b0UVQD+2992afHSBYCXLVtWogDw0qVLASIVAF6/fn1xAeCuXbvywAMPsHr16rivHVsAeMmSJTz11FPk5ORwxx13kJ+fz/LlyyMVAK5Xr94uFQAueo/Lli0rbsnVrl2brVu3Fk/fsmULderUKX7cvXt3BgwYwDnnnLNLr1dRkZKYmTU2swPNLDvVAYmIVEgFKwCrADD069ePv/71rwA0adKETz/9tDiRvf7668WJHuDoo4+mY8eOnHXWWbv8ehVRbhIzswFm9jhwBzAAyDOzsWbWukqiExFJViVXAP4xFgDu0aMH3333HRAk5RtuuIGTTjqJrl27csABB3D44YcXz2tmPPLII9SrV2+XX68iyi0AbGZHuvu7pcbVBZq5e0rq/KsAcGZTAeDMpALAUl1VtABwuWcnuvu7ZtYUOBGoFY57DPhx3KhGREQyWpRjYqOAzcCa8E9ERCQjRLlO7B13fzHlkYiIiCQpShK7wMxOA74D3N0vTHFMIiIikSRMYu7exczqh8ObUh+SiIhINAmPiZnZzcBoYLSZ3Zr6kEREMkeUwrnlmTBhQvHwH/7wh1SEWOkmT55Mfn5+wvli31si7733Hu+++27iGZMU5cSOhu7e3937A/XjzWRm55rZiPA6stvMbHBR0jOz3PBxr8oKXESkKkQpnFue2B39/fffn4oQK1VhYWGlJ7HCwsKUJbEox8T2NrNLw+F9ypnve6AhUBvY291vN7NbzewnQKG7jzKze4HHSy9oZpcDlwPU2/fApN6AiEhlcfediu4OHTq0zMK5V199NX379mXTpk0ceuihjB07li+//JI+ffrw/fff07lzZ1q3bs3ixYvJycnh/vvv58orr+SVV17hnHPO4d///jcAp5xyCi+//DLTp0/nnnvuYfv27dx6662ceeaZxXE9//zz3HnnndSrV49rr72WtWvXsn37dvr160dubm7xbVdGjBhBzZo12bp1K5MmTeKbb77h4osvZp999mHt2rU8+eSTtG7dmrvvvpspU6ZQq1Yt8vLyaNGiBe3ataNt27YcfPDBTJ06lSVLlvDLX/6SIUOGAJCfn8/555+PmdG2bVtOPfXU4vd20003MX/+fKZOncqWLVsYN24cHTp0ICcnh06dOrF69WqWL1/O119/zcyZM5k4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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "FFT grid points (output):133.0\n", "NUM grid points (output):237.0\n" ] }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "data": { "image/png": "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DxzPVYdftU3Lrl27lscee4wuXbowevRovvKVr9CtWzcuueQSVq5cSY8ePbjsssu44ooruOCCC5g3bx4XXHABAF/4whe455576m8vEt+6Je2iiy7ik5/8JN/61rf47W9/y89+9rP6smeeeYbrr7++wSWq1qxZw/Lly1m7di1btmxhv/32Y8KECQ3WfdZZZ3HOOedw8MEH88ILL3DYYYfV33yypqaG+++/n40bNzJ69GjOPPNM/vrXv2Zab1tQrq6bPjnLAdx9c2XCERFpfocccgi9e/cGYO+99+b5559nw4YNPPnkk3zsYx8DQnKaPHkyAPfffz+LFi3inXfe4fXXX2fMmDH1SSx965bYI488Un97lsMPPzzv9ijDhg0reI3Fhx9+mJkzZ9bfuiS+DUzaypUr8+4t9tZbb9XXGo888ki6dOlCly5dGDBgAK+++mrm9bYF5e4ndr2Z9QEOAXqUmldEJKttrTFVSvoWLVu2bMHdOfTQQ7n55pvz5n3vvff48pe/zOrVqxkyZAgLFy7Mu9VK+tYtWWzLMklbt27l0UcfpWvXrg3KCn22HUmWPrErgM8QamHTKhuOiEjrMGnSJFatWsXf//53AN5++23+9re/1Sesfv36sWnTpswDRD72sY9x6623AqGvLcvtUaZMmcKdd97Ju+++y8aNG7n77sL3JJ4+fTrXXHNN/fu1a9c2yXrbgixDZ14jXO3+BjMbXOmARERag/79+3Pdddcxe/ZsNm8OPSiXXHIJe+65J6eddhpjx45l4MCB9XdfLie+PcqNN97I5MmTGThwIL169apv9itkv/32Y9asWYwbN44BAwYU3dbixYuZO3cuH/3oR9myZQtTpkzhRz8qftesrOttC7LcimUG8C/gTOAJd//35ggsTbdikfZKt2LZMWzevJmOHTvSqVMnqqurOfPMM8vWmNqjStyK5R/uXgP8zsxGN0GMIiLtzgsvvMDxxx/P1q1b2WmnnfjJT37S0iHtELIksVOBr0evTwK+XblwRER2THvssQePPfZYS4exw8mSxPqbWRfCCc4DKxyPiOzA3B0zXStBCivXvVVIliR2FfDT6PWVJeYTESmqa9eurF+/nr59+yqRSQPuzvr16wueJlBKuSt2jAA2k7tCR+PTpIgIMHjwYF588UV0l3YppmvXrgwe3LhB8OVqYtOBD5G7VqIDFzc+NBFp7zp37syIESNaOgzZwZS7YsePzewEd/8lgJmd1DxhiYiIlFeuOXEucISZ7UKojR0CXN8McYmIiJRVrjnxcaA38ASwFajsDXhEREQaoeS1E939QeAjQHd3f9jdX22esERERMrLcgHgUwnnii03s7PMTFezFxGRViFLEusLjATeAl4BflZ6dhERkeaR5WTnrwPXuvs/AMxsXWVDEhERyabc6MQZwP8CHzGzjwC4+73NEZiIiEg55Wpi/VPvdcUOERFpNcqNTrweuAt4u3nCERERyS7LwI4rgM8QamHTKhuOiIhIdlkGdrxGuAP0DWbWuCszioiIVFCWJPYg8C8zu5Nw5Q4REZFWoWwSc/d7zexDwFloYIeIiLQiZZOYmf0cWA9sISSxb1c6KBERkSyyNCc+7u5XVDwSERGRRsqSxD5jZh8mGmbv7gsqG5KIiEg2WZLYiYnXJfvEzGw/4BigO3C+u79tZucSbuPiwDXAIuANYDWhmfILwPvAne6+qtGfQERE2q0s54kNBOYDFwILy8w7O5rnTuDQaNoQd78KGA6MA/7q7pcChxOS1y5AH+DF9MrM7HQzW21mq2trazOEKiIi7UmWJHYasIGQnJ7NMH+x2poXeN4D+HfgO8CnGizgvtTdJ7r7xP7901fAEhGR9i5Lc+KrQFdCk+CAMvMuJyS77sCzZtYBeMHMzgaeA/4CnGBm3wLuA94hDN3fgu4aLSIijZQlid1EaPZbAPxPqRndfQ2wJjX5ytT7+an3D2WIQUREpIEsJzs/Gb38aoVjERERaZQsfWIiIiKtUuYkZmYfr2QgIiIijdWYmtjMikUhIiKyDRqTxG6rWBQiIiLbIHMSc/fqSgYiIiLSWBrYISIibVaWW7EMBKqALgDufkOlgxIREckiS03sh4Qr2L8aPURERFqFLFfs+JO731PxSERERBopSxI71swOJVzn0N39+ArHJCIikkmWy0593Mx6Ra83Vj4kERGRbLIM7DgPGBa9XufuF1c8KhERkQyyDOzY1d1Pc/fTgF6VDkhERCSrLH1iu5jZSdHrvpUMRkREpDGy1MS+BNRFjy9VNhwREZHsStbEojsy7w5YNKmKcHNMERGRFleuOfEWYFdgU/S+Z2XDERERya5kc6K7vwwc6+7Pu/vzwOeaJywREZHyyjUn3gbsbWZjo0m67JSIiLQaJZOYux9nZmPc/YnmCkhERCSrLEPsJ5vZFdG8Hd19amVDEhERySbLEPtxQLW7HwLcW+F4REREMsuSxDYAXczs88B+lQ1HREQkuyzNiZdGzzOAb1YwFhERkUYpNzrxcsDjt8AkdLKziIi0EuVqYkvIJTEREZFWpdwQ++fNbBkhkVn0PKc5AhMRESknS5/YGdFzD+C0CsYiIiLSKFmSWMfoeQvhYsAiIiKtQpYkdi2hGXEzcEdlwxEREckuSxJb5O5PAZjZnhWOR0REJLMsJzt/MfH65ArFISIi0mhZamL9zaxr9HpgqRnNbD/gGKA7cL67v21m5wJbCU2S1wCLgDeA1cAfgbOBt4Dl7v7PbfkQIiLSPmWpiV0F/CR6LCkz72xgIXAncGg0bYi7XwUMJ1yH8a/ufilwOHACYcBIB0KfWx4zO93MVpvZ6tra2gyhiohIe1IyiZnZ3oTk8v3o8V6GdRY7OdoLPHcG/gzcBZzUYAH3pe4+0d0n9u/fP8OmRUSkPSnXnHhc9JxMTBeXmH85oSbWHXjWzDoAL5jZ2cBzwF+AE8zsW8B9wOPA14CDgVsaGbuIiLRz5a7YcZGZdQL2JSSmkpegcvc1wJrU5CtT7+en3p+TIU4R2VHU1cGyZXDKKdCvX0tHI21clj6xa4ELgCoaJiARkcZZtAgWLIADD4Snn25YXlcHCxeGR11d8fXU1cHll5ee5+mn4cgjC2+nsevalnkrve7mXKa1cveSD+AHwHej1/PLzV+px4QJE1ykPapaVuVVy6paOozGqa11X7QoPCfV1Lj37esO4TFqVP48tbXuVVW58mnTGq4jXs+IEWGe+fOLxzBqVOHtpM2fH+arqio9X22t+5Qp2eaN44xjuPDC0vO6h3nieGtqys/fmNi3dzvuYd5p08I2s26rCQCrvViOKlZQPwN8Lnr8BvjPcvNX6qEkJu1Vm0tiyQN9MsEkE1jXrvmJrKamYQKLH+mDczoRdu/uXl3dMI744B4/iiW79PqKJU733MG/3Drj9fbvX/xzlNpvWRJvodhLxVNsO9OmlV8mXi5OyFm31US2N4n1L/S6uR9KYtJetakklk5EXbu6jxvnPn58fuKaOzccPOP3Xbq49+qVe9+nj/vQobn3I0eGRDV3bkha8fROncJzjx75NYrq6tx83boVT3bJJBDPV+wAnaz9xZ+lb9/CNZnkAb/cemPppFtu/uQ24v2QJfGltzNyZPnaWG1t/t8r67aayPYmsR8kXn+33PyVeiiJSXvVKpNYbW04GE6bln8ATB4gO3RoeFBO1kiK1bzixJCuZcQH6jghzZ/vvmJFLll16eI+YID7wIG5JNOjR5inR4/cOubODdtOJro4sSYTTzyfe8NY5s7NvU8nsvTnSq63WK0xGcuIESGxlEqS6X09Z04uwZaq8SU/x4gRuWWyNreC++TJuR8YzVQb294k9vPE66Xl5q/UQ0lM2qsWTWLF+raSB7Vu3dxPOMF94sT8Gsry5eEgOXBgmLbLLvmJIV7/3LnugwaF+SZPzj9oJ2s/xZoPC9Vg4gQWz1dd7d65c66sV6/8pBgf+GtqcgkP3Hv2DIkxWYuM501ut3fvMH3Fivx44+SQXG/nzvnxJ2OLa5TJpsjk54j3yZQpYX8mt5GsKRVKLtXVuRj69w/rSX6GYskvmWDT2yqWlMt9fxppe5PYdOBXwG3A4eXmr9RDSUzaqxZLYsUGMaRrMIWSR7pmsj0HsjjRDR3aMMklywcNytXECs1XXZ1fm0rXzJLzFfp8ce0vnrdQTTJZ+0zXopLJqkOHhrXGdHJLJr54/gEDQo0z3kacjOL548/Xq1euCbamJuyPQk2v6X6udCIrlGDTsaXjTi4bJ+JFi7L+tQva5iQGdG3M9Eo+lMSkvWryJFZT4z5jRv6BbP78UJOKD3yFDtC77RYe8cGwe/dQA+vTJzfPrruW/mXe0pIJb+jQ4rHGB/7ddguJo9i88b5L9t+V6mdK1wgL1RqzzF9sG+nBJB065Ce9Qgkn3VTaq1cuYcZ/60LLJWPr2DH3wyGdNPv3b7maGOFE5SuAU4HPEs4T+w/gY6WWq8RDSUzaq6plVV619KDwa7a6OiSgFStyiai62v0jH8kln2RfVXV1OMAOGhQO3oX6kJIDKuIDX3Jastmt0MGwtjaM2rvwwmYddt2qxMlxxIiGNbu0+G9SqtZYbP4BA3J/y1L9XskkkuUHRvJUgFJ/60KxJZNs167lk+Y22N7mxF2BIwkX951Ybv5KPZTEpKKaosmr1PKlypOJJx6BN3RoqBnNnetV3xzoVad2zP3iTSaWLl1yrzt0cN9559wBJFlWKiEV6yeKm8RWrAjNiuPHh5pJqRqMtB7pHzDlvtvpZtlSNdD0dkaMyO83bOJa+XYlsdbyUBKLVPpguz3LVrK83K/9cidhppvQ0uLzf4qdI1RdHX6pFjoYFDsvKrntUifmJs89KpBkqk4Oj6LJp9wj3aTUvbv7MccU7kOKD3xZaggiSY1Nmo2gJNacKn2gjw94xc7+z3qwLrR8uURR7kAfj3QqNuy2VHlyxFOh2JIH+kLlyZFZ6fJk53WhIcvpkV2Flk/2M6TLk7EVWn9y3enyQqPv4maZ3r1zSWyOuY8Z4z5sWOiHmjIlPMd9O0uX5g4gc+aER7LfJx7RVlWlxCRtjpJYWiVrBOWSTLnyrAf6QokkebAudBZ+Y2oEheJLDsdtbKJIdh4XOiclue30CKn0FQYaW56+ysJHPpJfHn+uwYMbLp/c53FzSbK80Amwyc9XXZ0b+JA+QTY9MmzixPwReFHiqTqrt1ddu3/Dv4dIO6EkllauNlKqRrBoUekDfdbaSqFzMpIHtVIH+vigWapGUGj9yRpBofhKnTNS7jyUeNvx1QnSSTSdCJLLp5NQujydhJLxJ0fRDRtWuDxe9/7750aRxZ8vfZJp8vPX1OSP0Eu+jmtEyaHYkyfnXvfsmT98un//0MQSl3fpkt9/VeIE1VZ5srNIM1ISSytV20kmqWL9G6Uu6FmqvFyzVXywjn+5p8vjuCdOLJwI4nUXOps+eTCPD/bJ9RcanZQsj7cdL5u8cGg6UUD+8N9kbSWOLVlbSybP+LMnr9oQL3vQQfmJ5KCD8hPHlCn5+3fnncNAhOTnSZb37Jl/7kzc75VMNPHr+PMWGsEVnz9UrDxed7ErVJS6Vp8riYkoiSWVa5JLHogKlZe6+nNtbeiPKldbKXbJlvhgHh+Yk9tPxhUfCJMxJGt4yfJ4+WQNMa4RJC//E697xIiQHJLlyabAKVMa1haTSWj+/PxL7Cxfnt+MmDzhtFevkGTiZBGXx/1P6eG6cRNuoURRrIkumYTSnyV+JIcBFypPJtx0H1b6igXJ84sKDY5IjgDL2AGuJCbtnZJYUjIJQcMzyUuVp2tSM2YU7nuJD3LpJJg1ScXDrZO1ofh9ukYQryP5PnmgjS+FEx+Y4/68+DPMmdPwytTJ8p4985vE0peq2XnnXLNYoaSWvIJBnLQLXSao2NUA4ke6HyqZaAoNlpg8ORdX+qTQZKIpNIQ4Lh88uPgVIgpdN7BClMSkvVMSS4oPoHPmFB7FFx/A585tWB6XTZmSS0TJ2lS87uQVuuMklEyAySQVJ6Fkkkomgl13DSPP4ma2dCLo2TN3YmryYJ1MtnEiic+cTya9ZJJJ9iOlazOlLlWTTHBxefpq4+nBEvEVIoolknLDdbOMttve0xFaCSUxae+UxGLJZBH34aRrQ/G5RnGSKNQvlExCyWaqZF9YnPDik0XjJr74YJ6u7fTsmZ+kCg1mSF6+JT3sO/4ssXRtpdR12dJJJi7fntpKen+28UTSkpTEpL1TEosl+4UKDRdP1o7SfV/pJJV+n05qySRj1jDRFKvNJJPU3Lm5S7oUu3ZZqRNT40QTXw8vrdQJvNJqKIlJe6ckFksOrU9fZSF9DlUyyfTu3fC2B8n19erVsCbl3vC6YsX6bkpdyid5XTxpl5TEpL0rlcQ60J7Mng0zZoTnfv3gE58I05cuhQMPhGefhVGjYMGCUD5zZih/803YsCG8njkzlAHMmwf9+8PGjbBpU3i9YEFue5MmwUMPwYgRMHkyrFoFo0fnykePht//Hl56CZ5/PsyfNmkSPPVU4TIRkXaufSWxu+6Ce+8Nz5BLQm++GR6Qn6QWLID582Ho0PC+qio/SfXrF9Y1dGh43HVXbtnYpEnwj3+EZJVMYCIist06tXQAzeqUU/Kf4yR0wgnQt2+omaWT1KJFYdqyZWG5Qknq+eebJ34REcnTvpJYv36hZpUU15Qau5yIiLS49tWcKCIiOxQlMRERabOUxEREpM1SEhMRkTZLSUxERNosJTEREWmzlMRERKTNUhITEZE2y8K1FVs/M6sFKnVpjH5AXYXW3dTaUqygeCutLcXblmIFxVtJjY11mLv3L1TQZpJYJZnZanef2NJxZNGWYgXFW2ltKd62FCso3kpqyljVnCgiIm2WkpiIiLRZSmLB0pYOoBHaUqygeCutLcXblmIFxVtJTRar+sRERKTNUk1MRETarHZxPzEz2w84BugOnO/ub5vZ8cCX3X2qmXUBzgR6AB929zlmtgL4HfDf7v5EC8f6ZaAv4O5+iZktBDYCrwF3AhcDbwO3u/va5oq1EfF+C+gKvOru/9FS+7YR8d4CVAN/iB6LgDeA1e7+u9YSK3A5reR7WyLezwIjgY7AZST2JfAU8JVo8avd/cVWFu81wFlAryjelcBNwH8Dv3L3da0pXnf/XvLvD7xACx0bMuzbnwKfAwYDbwGL2cZ9215qYrOBhYQD/qEA7n4rsDZ6vdndrwJqgf+MlnkF6AlsadZIC8f6H4QDwGAz6wNsdfcfAvsB04A7omVOaOZYoUy80fvvAVcCo6JlWmrfQoZ4CfF1IySKccBf3f1S4PDWFGsr+95CgXiB/wF2BbrQcF8eS0gU1wCfbeZYoUy87r4pivXHwF7AVuBVQlL7oLmDpfz+hfy/f0seG8rt29rou/s2IaFt875tL0kMwgGpnP3d/U8A7n4K8D3gyxWNqrC8WM2saxTL91LlyeeW7NwsGa+Z7Ur4Ql8CLb5voUy87n5WlHg/n5q/JfZxue8CtJ7vLaTidfc33P2bwOZUeUvu06SS8ZrZcGAecLm7v+Xuc4BraaX7t8DfvyWPDeX2bRegr7u/tD37tl00JwLLCQfR7sCzZtYBmArsa2anuftPzGwK8BBAVNs5A9gZeKAVxHoL8AQwPYq1o5mdC/yZ0MRxETAd+GUzx1o2XuAnwG+B3wCHmtl9tNy+zRSvmf074ZftX6LHCVGT6H2tMNbW8r0tFu/XCM1H3Wi4L58k15y4uNmjLROvmfUm1CR+AXzCzGqA44HdgFtbYbzpv39LHhvKfRcAZhG+z5jZCLZx32p0ooiItFntqTlRRER2MEpiIiLSZimJiYhIm6UkJiIibVZ7GZ0o0qqZWTfCuXS7A32AQcAp7v5giwYm0sppdKJIK2JmU4GxwCbCTQP7AZ8A3gVeBjpH5ccDVcCRhCHLv3L35j4FQKTFqTlRpPX7nbufAUxx9/OAPwJjgK8CGwjJ7YCWC0+k5ag5UaT1eyt6ro2e3yecjN0BuMTdW+ISUyKtgpKYSNu1GPipmb1OuDhxS1yxRaRFqU9MRETaLPWJiYhIm6UkJiIibZaSmIiItFlKYiIi0mYpiYmISJulJCYiIm2WkpiIiLRZ/x/Jex3EvAAQjQAAAABJRU5ErkJggg==", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "FFT grid points (output):210.0\n", "NUM grid points (output):336.0\n" ] }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAbEAAAEhCAYAAADxtp7yAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAAsTAAALEwEAmpwYAAAvLklEQVR4nO3deXwU9f3H8dcHEg4BD4SCoBxixYsKoigqGAUP1FLQorZKBQGvWtQieGukiAeV6k+LaBHjQb2wUrSKFCUg3iBSVKoFBFEExIgCCiTk8/tjJnETkuwk2c1m8f18PPLI7Mx3Zz47uzuf/c5897Pm7oiIiKSjOqkOQEREpKqUxEREJG0piYmISNpSEhMRkbSlJCYiImlLSUxERNKWkliaM7NcMxsaTp9rZjMTvP52ZuZmllGNdUw0sxtjbl9iZmvNbJOZ7Wlmx5jZ/8Lb/RISeJoysx5m9nGq4yiLmWWZ2ec1tK0cMxtTE9tKtuq+h5Lxvt6ZKInFYWYrzGydmTWKmTfUzHJTGFaZ3H2Ku59Uk9sM988PZrbRzDaY2RtmdrGZFb+23P1id/9T2D4TGA+c5O6N3f1rYDRwX3h7Wk3Gnygx+2FTzN99Ee7nZrZf0W13f83dOyYpxrRPDGZ2Xcz+3WJm22Nuf5jkbR8bvr6/NbM8M3vdzI5I8DZ2SHipeF+nEyWxaOoCl1d3JRbYGff5L929CdAWuB24GnionLYtgAZA7AGnbanbkVWnh5gEvwwTcdHfZakOaGfj7mOL9i9wMfBmzP4+uKhdot9rZrYr8AJwL9AUaA3cAmxN1DakanbGA2oyjAOuMrPdy1poZkeb2bvhJ7R3zezomGW5Znarmb0OfA/sG37SujQ8hbbRzP5kZh3CT3nfmdnTZlYvvP8eZvaCmX1lZt+E03uXE8cgM5sXTo8q1SvIN7OccNluZvaQmX1pZl+Y2Rgzqxsuq2tmfzaz9Wa2HDgt6k5y92/dfTpwNnC+mR0SrjMn3Mb+QNGpsg1m9qqZLQP2BZ4P46wfJ75B4Sfgv5jZ10B2eJ8/m9lnFpymnGhmDcP2WWb2uZmNCHvUX5rZ4Jh91tDM7jKzleHzNy/mvkeFz8kGM1tkZllR90Wp52U/M5sTrn+9mT0Vzp8bNlkUPvazrdQpOwt6eCPN7D9mtjncLy3M7KXwtTPLzPaIaf+Mma0JtzXXzA4O518InAsUvS6eD+e3MrNnw9fXp2Y2vNS+yQlfdx8BFfY6zOweM1sVvoYXmFmPmGXZ4ev60TDuD83s8JjlXczsvXDZUwQfdCq7n8t6r60ws96l4ng85nbU53h/AHd/wt23u/sP7j7T3f8TrqeOmd0Qvo7WhY9zt3LirCimotfEhvB56m4x7+uwfbzjzZ/C98hGM5tpZs0qsRvTj7vrr4I/YAXQG/gHMCacNxTIDaebAt8AA4EM4Dfh7T3D5bnAZ8DB4fJMwIF/AruG87cCrxAczHcDPgLOD++/J3AmsAvQBHgGmBYTXy4wNJweBMwr4zHsA6wG+oS3nwMeABoBPwPeAS4Kl10M/De8T1NgdhhvRkX7p4z5nwGXhNM5MfuuXen1lV5HnPgGAQXAH8L92RD4CzA9jLcJ8DxwW9g+K2w/Otz3pxIc4PYIl/813IetCXrcRwP1w9tfh+3rACeGt5tXZj+Ey54Arg/X0wA4NmaZA/vF3M4CPi+13rcIerCtgXXAe0CXcF2vAjfHtL8g3Af1gbuB92OWFT8P4e06wALgJqAewetvOXByuPx24LVwv+4DfBAbWxmP8zyC12sGMAJYAzQIl2UDW8L9WRe4DXgrXFYPWAlcGT5HvwbyY2MtZ3uDiHm9U/Z7rcTzEsbxeDgd+TkmeK9+DTwC9Cl6/ZTa70vDfdiY4HjxWFmv+TgxlWhb+nES7XizjCDpNgxv357q42gy/9QTi+4m4A9m1rzU/NOA/7n7Y+5e4O5PECSBX8a0yXH3D8Pl+eG8O939O3f/kODgMNPdl7v7t8BLBAcp3P1rd3/W3b93943ArcBxUYMOexXTgHvc/SUza0Hwpr3C3Te7+zqCJHBOeJezgLvdfZW75xEcbKpiNcEbrlIixAew2t3vdfcCggPjhcCV7p4X7qOxpdrnA6PdPd/dXwQ2AR0tON10AXC5u3/hwSfsN9x9K8EB+UV3f9HdC93938D8MLbyTAs/0Rf9DYvZfluglbtvcfd5FayjLPe6+1p3/4Igqbzt7gvdfQtBwu9S1NDdJ7v7xvAxZAOHltcjIOhZNXf30e6+zd2XA3+j5Gvh1nC/rgL+r6Ig3f3x8PVa4O53ESTS2Ot788L9uR14DDg0nH8UQcK5O3yOpgLvRtw3pZX1XitP5OfY3b8DjiVIMH8DvjKz6eHrFYJe7vjwPbwJuBY4xxJ/ujvK8eZhd//E3X8AngY6JziGWqU2XU+o1dz9AzN7AbgGWBKzqBXBp8hYKwk+5RVZVcYq18ZM/1DG7ZYAZrYLwUH8FKDotFETM6sbHgzieQj42N3vCG+3JThgfGlmRW3qxMTYqlS8pR9bVK2BvCrcL158lJpuTtBLXRDT3gg+7Rf5Okx4Rb4n+LTcjKA3s6ycOAaYWezBIZOgZ1qefu4+q4z5o4A/Ae+Y2TfAXe4+uYL1lBbvtdIYglPBBB9yBhDsl8KwTTPg2zLW2xZoZWYbYubVJUiUUMnXgpldBQwJ7+cEvZfYU1lrYqa/BxqEB/lWwBfuHluNvKqvu7Lea+Wp1HPs7ksIekWY2QHA4wS93d+w43FgJcHxtQWJFeV4U3o/N05wDLWKkljl3ExwKueumHmrCd4MsdoAM2JuV+enAkYQfJo90t3XmFlnYCHBgbpCZnYNwWmFHjGzVxGcvmxW6sBe5EuCU0dF2lQ2YAtGbLUGKtvjiBIflNyf6wkO5AeHPZXKWE/Qk+sALCojjsfcfdgO96okd18DDINghBswy8zmuvvS6q67lN8CvyI4/b2C4NT0N/z4Win9OlwFfOruPy9nfUWvhaJBN+W+FsLrX6OAXsCH7l4YJuy4r9NwO63NzGISWRvK/nART+nHuJngQ06RljHTVX6O3f2/FlxjviicVfo40IbgNPZaoPQ17IpiinesiHK8+UnR6cRKCA86TwHDY2a/COxvZr81swwzOxs4iGAkUyI0IThIbzCzpgSJNC4z6xPG2T88rVD0GL4EZgJ3mdmu4QXpDmZWdIryaWC4me0dDhi4Jmqg4fpOB54kOMe/OOp9KxFf6faFBKd3/mJmPwvjaG1mJ0fYViEwGRgfDnCoG15Ir0/wKfuXZnZyOL+BBYMuyhxUUxEzGxBzv28IDlRFvaS1BNdREqEJwQeArwkOkmNLLS+9rXeAjWZ2tQWDOOqa2SH247Dxp4FrLRhctDfBdciKtl0AfAVkmNlNBD2xKN4M7zvczDLN7AygW8T7xvM+wWm9zHAgya9jlkV+js3sAAsGB+0d3t6HoAf2VtjkCeBKM2tvZo0J9v1T5XwQqyimrwheG+W9JpJ9vEk7SmKVN5pgwAEQXLMCTifoMX1N8Gn0dHdfn6Dt3U1wgXY9wRsm6ieuswlOKS2xH0coTgyX/Y7gYvpHBAfVqcBe4bK/AS8T9EzeI7hAHc/zZraR4JPt9QTfAxtc8V0qVFF8Zbma4KL6W2b2HTCLktdiKnIVsJjgGkwecAdQJ7wG9CvgOoIDyypgJBW/Z563kiNCnwvnHwG8bWabCAagXB5ef4LgutUj4TW0syLGXJ5HCU4tfUGw794qtfwh4KBwW9PC09GnE1wz+ZTgNTaJoAcHwRDyleGymQTXscrzMsFr85PwPluIeGrP3bcBZxCcqssjeO1Ged1FcSNBT/sbgsfz95jtVuY53ggcSfA8bibYtx8QvO8h+DD0GMHowk8JHn95Sb+imL4nOCX8evg8HRV7xxo43qQdK3kaWkREJH2oJyYiImlLSUxERNKWkpiIiKQtJTEREUlbSmIiIpK2UvJl5/qNd/dOB+wXv6Gk1MdfB7V6O+6ZlF8GkWpa/tVmAPZt3ihOS5H0sWDBgvXuXrq8X7lSksQa7bkX8+fPT8WmpRKycrIAyB2Um9I4pGxnP/AmAE9d1D3FkYgkjplVquSYTieKiEjaUhITEZG0pQLAIpIW1q5dS15eVX4YQWqzpk2b0qJF1Yv9K4mJSFrIy8tj//33p27duvEbS1rYvn07n3zySbWSmE4nikjaUALbuSTi+VQSExFJgWOPPRaAK664gu3bo/y+bUk5OTnk5OSUuzwrK6u43YIFC3B3TjvtNHr27MnmzZs55phjGDBgQIn77LbbbmRlZZGVlcWcOXPIzs7m0EMPJSsri8GDB9OnTx+ysrKK2/Xp06fScSeaTieKiFRDYWEhdepUvT9w9913Jy6YMgwaNAiA1atX06RJE/71r3/xxhtv0KNHD26//fYSbTt16kRubm7x7dmzZ3PXXXfRu3fvEu2OPfbYEu1SSUlMRCSUm5vLHXfcQUZGBnl5ebz88ss0aNCAgQMH8sUXX9C6dWsee+wx5s2bx/jx4wG45JJLGDVqFIceeiiLFi3iuuuu4/HHH2fNmjX885//ZO+99+ass85i7dq11K9fn6lTp7Lrrj/+XmhWVhazZs1i+PDhfPTRR+Tl5XHEEUcwadIkLr30Uj7++GMaNmzI448/TqNGjRgwYABbt25ll112oW/fviXif/fdd7nooovYb7/9+OabbwDIzs7m2GOPJScnh9mzZzN06FD++9//smrVKjIyMhgzZkzN7eAkSMnpRHcYNw7W/2R/xk1EkmX9+uodX+rVq8fzzz/PqaeeyiuvvMJzzz3HQQcdxNy5czn44IN59tlnAdi2bRvTp0+nT58+rFu3jkmTJvHAAw8wbtw4nn/+eUaMGMHTTz8NBKf05syZw1lnncVTTz1V5nYnTJjAv//9b/bZZx9GjhzJCy+8QJs2bXj11Ve57LLLmDhxItOmTaNbt27MmDGDZs2a7bCO0aNHM23aNCZPnsznn39eYtmYMWM48cQTmTRpEmPGjGHgwIE7JLDFixcXn0789ttvARgxYgRZWVncc889VduhSZaSnlh+PowaFUyPHJmKCERkZ/Xww9U7vhxyyCEAtG7dmg0bNvDll19y2GGHAXD44YezYMECWrRoUTwPYL/99qNBgwa0atWKAw88kDp16tCqVSuWLFnC9u3bGTlyJIsXL+a7776jf//+5W77qquuYsiQIRxwwAFMnz6dJ598kpdffpmCggK6d++OmdGlSxcAunbtusP9N2zYQJs2bQDYf//9K/3YS59OBMo8nVibpKQnlpkJd94Jg6vzA/YiImUYPLh6xxczK552dzp06MCCBQsAmD9/Ph06dAAocR0s9j6l7//++++zefNm5s6dy+9//3vcvcztTpkyhUaNGnHGGWcA0LFjR373u9+Rm5vLvHnzGDt2LO3bt2fRokUALFy4cId17Lbbbnz++eds3ryZ//3vf1XbAWkmJUnMLPiEVEZvWESkWpo1S+zxpV+/fnz44Yf07NmTxYsXc+aZZ1bq/h07dmTp0qWccsopvPPOO+W2u/nmm5k3bx5ZWVncfvvt9O3blxUrVnDCCSdwwgkn8NJLL9GvXz/eeOMNTj75ZDZs2LDDOm688Ub69u3LkCFDintkOzsr71NBMjVte6DnrVxS49uVylEB4Nrtp1YAeMmSJRx44IGpDkMSrPTzamYL3P3wqPfX98RERCRtKYmJiEjaUhITEZG0pSQmIiJpS0lMRETSlpKYiEgK1MYCwGbGrFmziu83adIkVqxYwXnnnbfDdlesWIGZMX/+fCD4vbeMjIwar6moJCYiUg2FhYXVuv/dd9+d1J+YGTRoEF27duXLL7+kSZMmzJ07l0WLFtGjRw+eeeaZEm07dOjAhAkTIq+7a9euPPfccwD885//LK4mUpNUAFhEJPRTLwDcsmVLGjduzCeffBJpfx1wwAEsWRJ853fWrFkpKU+lnpiI7FyqWQH4p1wAGGD48OGVKvZ7wAEH8Pbbb9OgQQPq168f+X6JoiQmIjuXogrADz9cpbuXLgC8bNmyEgWAly5dChCpAPA333xTXAC4Z8+e3HfffaxevbrcbccWAF6yZAlPPvkkWVlZ3HrrreTl5bF8+fJIBYAbN25cpQLARY9x2bJlxT25Bg0asHXr1uLlW7ZsoWHDhsW3+/Xrx0UXXcTpp59epe1VV6QkZmbNzayDmWUmOyARkWqpZgVgFQCGoUOH8re//Q2AFi1a8NlnnxUnstdff7040QMcccQRdO3alVNPPbXK26uOCpOYmV1kZo8BtwIXATlmNsHM2tdIdCIilZXgCsA/xQLA/fv35/vvvweCpHzttddy/PHH07NnT/bdd18OPvjg4rZmxkMPPUTjxo2rvL3qqLAAsJkd5u7vlZrXCGjl7lVO8yoAnB5UALh2UwFg2RlUtwBwhaMT3f09M2sJHAfUD+c9Cvw0fqhGRERqtSjXxO4CNgNrwz8REZFaIcr3xN519xeSHomIiEglRUliZ5rZicD3gLv7WUmOSUREJJK4Sczde5hZk3B6Y/JDEhERiSbuNTEzuwEYD4w3s5uSH5KISO0RpXBuRSZPnlw8/Yc//CEZISbctGnTyMvLi9su9rHF8/777/Pee+/Fb1hJUQZ2NHX3Ye4+DGiS8AhERGqxKIVzKxJ7oL/33nuTEWJCFRYWJjyJFRYWJi2JRbkmtruZnR9O75nwCEREagl336Ho7qhRo8osnHv55ZczZMgQNm7cyIEHHsiECRNYs2YNgwcP5ocffqB79+60b9+exYsXk5WVxb333ssll1zCK6+8wumnn86///1vAHr16sVLL73EzJkzufPOOykoKOCmm27ilFNOKY7rueee47bbbqNx48ZcddVVrFu3joKCAoYOHUp2dnbxz66MHTuWunXrsnXrVqZOncp3333Hueeey5577sm6det44oknaN++PXfccQfTp0+nfv365OTk0KZNGw499FA6derE/vvvz4wZM1iyZAm//vWvGTlyJAB5eXmcccYZmBmdOnWid+/exY/t+uuvZ/78+cyYMYMtW7YwceJEunTpQlZWFt26dWP16tUsX76cr7/+mtmzZzNlypSEPWdRkthFwEkx0yIiKXPL8x/y0ervqrWOg1rtys2/PHiH+UVFd++//35eeuklJk6cWFwkd9KkSeTm5jJr1izG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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "data": { "image/png": "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9qOOOkomT54cKuuIvE/CngreOvfpUPvNQwqWWLnXbrsVPxG9v+Z+6817YAUVk3+51ACO9zlohlSylKIGXJS7FsF1yaRk5iXlrPpMQXemCsrCyyXoWRueUgsqpJ413XJnvR038k5vSTIjGyZYeVc1pPpcjhcStpMn5qXyhqo/4MIbD/L+JzSeaBXpJ07I5MecvK8ombRfSw0Z+dGEQh5DsPttTqbk3np7H/x4UqpoNoI3Hibd3bI5aS22MKXa7/uvnwS7KGe495etVmLAWOD9wE5R2g/Fa1tUYm+++eZW9zHQpLilGIgS87PnnnvKW2+9JSIiy5cvl3POOSd0/9raWjnwwAOlo6NDRPqvxI466ih56qmnRMTeB6NOiYW51bx1rgVV+70jpPbCvazlBSLTp4uMG2c/77hjX2V29tnWEqutFTnnnMJ6L1Qt6OILWmX+0fugYqoUtOE90fwRCqXa+N2cEfB28xSTuEEZXjLcbHdG7jwxKcvGJ23iWv9O7j0adA1unNSQ78fT7Z6Fs3GSdbMF8QI7zqovuPC8QIcarHvNUyj+gIpEomB5nXhiIXLxttqUJClci6DOz3YX5on1+x4arDDBcgyCIixFOSVWNrDDGPMl4CTgNeAVYH9jzD+BVhHZVKVhulHLE088wcc+9jFOOukk7rvvPvbff39+85vf5JPYehk73v/+93PDDTew9957U1dXx5QpU7j33nuZM2cOt956a75oZC6X46abbuLb3/42Dz30EGeeeSZXXHEFYEuxPP3007z++uvMnz+f8847r488u+++O5s3b+ayyy6j3c0Rk8lkmD17Nul0mp/85CdcffXVbNmyheOOO44f/OAH7LjjjqTTab797W+z1157cdRRRxXlb/To6elhzpw5PPvss5xwwgnen52i4/pLscyZM4drrrmG1157jXXr1rFmzRp22223oj4TiQTf+ta3+NjHPtbva3/GGWfw85//nIsuuojly5czZ84cbr755n73M2yEBUk0NtrJOn/8I9x1Fxy0K7z2uh2tT6WKgza+/GWb0G7cOFi1yo7M3323HVUHWLvWvtfU2PU772wDFDZsgKlTbbBIV5c9TiJRHGThJcLzB5R4E4C84InWVitLMlkcUOIFdnj40zi1ttogj0TCTkAKmVQUNhXMm562W9KhKZkjm4VnNjj5XIM3tMd58b4YrTTT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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "FFT grid points (output):404.0\n", "NUM grid points (output):585.0\n" ] }, { "data": { "image/png": "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Jk6cSMuWLWnfvj3t2rVjv/32Y8aMGSxcuJCzzjqLIWHprlWrVnHGGWdgZrRr144ePXqU/G033HADc+fOZcaMGWzYsIHx48dz6KGHkp2dTceOHfnmm29YvHgxK1eu5JVXXmHSpElV9p5FSWL9gWvDx/2A4VX26iIilXTLcx/y0TdrEy9YgQNb7MzNpx601fTiorv3338/L7zwAuPHjy8pkjthwgTy8/OZNWsWo0ePZvDgwQwbNoxOnTpx3XXX8eabb/LEE09wzTXXcPzxx1NUVEStWrV49NFHS91jq27dujRv3pylS5eyZcsW9txzTzIyMvjTn/7Eyy+/TFFREb169SqVxP7xj3/w1FNPsffee+PuPPJI/LtiuTsvvPACTz75JA8++CC//e1vWbVqFbNnz2bevHncfvvtjBw5kpdffpk5c+bw+uuvM3bsWO6//36++uor3njjDerXr8/ixYtL6icWe++998jOzmbkyJG4e0kyK/7bOnfuzLBhw/j000+5+eabSxLV6aefTqdOnZg4cWJJ4q1KUZLYLmaWFT7erUpfXUQkjSxcuHCrorsVLXv99ddjZvzwww907NiRTz75hFtvDepDxNZWLOuMM85gypQpFBUVceaZZ1JQUMDChQtLbmWyYsWKkkQBcMMNNzB69GgKCwu54YYbtqrPWKy4OPAhhxxS0tJr164dGRkZHHLIIXz66acsWbKE3/zmN0BQ7PeWW24BgvJY9euX3Lt4K926dWP27Nmcf/75nHjiiVx44YWl5j/22GNMmjSJWrVqlYovXqHiqhQlid0N/C18rDsxi0hKxWtBVZXioruDBw8GYPPmzXz99dflLnvBBReUHKQLCwt57bXXeOutt+jRo0dJSyz2gF6sV69eJdXsr7zySjIzM2nXrh0zZ86kdu3abN68udR6rVq1YsKECbzxxhvcddddnHDCCSxYsACABQsWcOyxxwKUFAeeP39+SaHiDz74gC1btpRM23vvvUuWK6+gcWZm5lZ3m96yZQujRo0CgiR54YUXlorxvvvu47333uOzzz7j0kt/HshevN3MzMxS1fCrSqKKHQcCG4Hbwkm68FlEfrFycnK46qqr6N69OwBXX311SaulrOHDhzNgwADWrFlDrVq1mDBhAtdffz19+/Zl9OjRHH300YwZM4a99tqLM888s6SFBlCvXj0aN25MRkZGyT24/vCHP3DcccdhZhx44IH89a9/LVl+5MiRvPXWW/zwww/ceeeddOjQgXHjxvHuu++SkfHzYTwzM5MTTzyRDRs28Mwzz7Bu3Tp23XVXevfuzXfffcekSZPYbbfdOPbYYzn66KOpU6dO3K7JE044gYEDB3L22Wdz+eXBVVbvvPMOw4cPZ/PmzSUtxo4dO9K7d28GDx5Mx44d6datG926dYu7v4466ij69evHBx98UKUDXCosAGxmN4cPSxZy91FV9uoJqABw+lIB4PSkAsA7rtjzdcWWLFnCiBEjePzxx1MYWcWSWgDY3W8xswzgUGAn1BITEZE0EuWc2F8JLnJ+FzgCeDWpEYmISKVlZ2eXDLUvtvfee6d1K6wqRLnYeR2wIOxGVAITEZG0EaUl9h6Amf0T+Ca54YiIiEQXJYm96O7fAZPMbJdkByQiIhJVlO7E62IeX5OsQERE0pEKAG+7JUuW0K9fv+0PqAJRkliTmMfNkhWIiEg6UgHg9BYliT1hZs+Y2dPAP5IdkIhIqrg7V1xxBd27d+fkk0/m+++/L1UAeOjQoUyePJkRI0bw3XffkZOTw7HHHsvAgQMBWLZsGb169SI7O5thw4bx4IMPlhTJXbBgAV26dGHjxo307Nmz5DWPO+44Nm3axPPPP0+3bt04+uijmTFjRqm4nn32WTp27Ej37t2ZPn06EydOZMKECUBwIXR+fj75+fkcf/zx9OrVi+7du7Nq1SqWLFlC586dycnJ4aijjuLzzz8H4Pbbb6dz5850796dL7/8EoD27dtzwQUXMHr0aGbMmMH555/PuHHjSsUxYcIEunbtSteuXUsq0rdr147zzjuP9u3b8/777wNw00030bVrV8aOHVv1b1IZiSp2ZLn7i8CLcaZvSGpkIiJxqABwagoAFxQUMG3aNF599VW+//57Lr74YqZOncqKFSt4+OGHmTdvHo888gjNmzfnnXfe4bXXXuPvf/87L774YtxYq0qigR1jzcyBj4DVQOvwZxIwJ6mRiYhUMxUALr8A8OLFi5k/f35JncZi++67L1lZWeyxxx6sXr2aL774omT7HTp0SG0Sc/drzKwJ0AnYGXjF3cdVtI6ISDKpAHBqCgC3bt2aI444gilTppTsG2CrhNqqVauS2N57772KdneVSDjE3t1XoTs6i8gOQAWAA/EKAO+yyy4lozRr165N9+7dufHGG7dad/fdd6dDhw507dqV9u3bb8O7UDkVFgBONRUATl8qAJyeVAB4x7WjFgCOMjpRREQkLUWp2CEiImlOBYBFRERqGCUxERGpsZTERESkxlISExEJ5efnM2LECCC1xXpnzJjBv/5V+sqm/Px8Ro4cud3b7tevH0uWLNnu7aQLDewQEYmjKov1Fl/4HHXZ2JJTUrH0bom5w7hxUFCQ6khEZAfTpUsXIBj1N3jwYI444ggeeughAN5++22ys7Pp3LkzeXl5AIwdO5ZjjjmGI488sqRSRXZ2NkOHDuWiiy4qte3x48dz1FFHcd1115WMKIxdNrbA78UXX0yPHj1KnseKV4R45MiRXHTRRfTo0YNLLrkEgM8//5wjjzySnJwcFi9eXMV7KrXSuyW2eTMMHRo8HjIktbGISFq4esbVvL/s/e3axiG7HcLdJ94defkLLriAMWPG0LNnT/r3789NN93EtGnTaNiwIT179uT8889n0KBBDBs2jE8//ZSbb76ZSZMmAXD66aeXqsFYWFjIxIkTmTNnDnPnzuXtt98umVe87MSJEwF45513qF27NrNmzWLMmDFs2rSpVFy33XbbVkWIIaih+Oijj3L88cezevVqxo0bx1133cWRRx5ZLVU0qlNSk5iZ7QcMB6a6+9SY6X0J7k1W391HlR9dBpx0EuTkJDNMEZEKHXzwwWRmZpZ0Cc6fP5+c8LhUUFDAd999x/PPP8+kSZO2qpdYXFuxWEFBAS1btqR27doccsghpeaVXXbx4sUlRX07dOhQkqSKxStCXBwvQIsWLVizZk3JdjIyMsoto1VTJTWJufsnZjYRaFxm1iFhceGbzKyxu68unmFmA4ABADvv2gqmT4fsbLXERASgUi2oqlK2iO+hhx7KlClTqF+/Pps3byYzM5P77ruP9957j88++4xLL720ZNmy58KaNWvG0qVLKSoq4r///W+peWWXbd26Na+88goQv5huvCLECxYs2Koob+vWrZk/fz4dO3YsKc77S1GlSczMsoErYybdm2CVrQo3uvuDwIMATVq2de64A3JzqypEEZHtdsstt3Dqqafi7jRp0oRnnnmGjh070q1bN7p161bhuhkZGfTt25ejjz6aTp06kZmZWe6yRx55JPfffz/HHXccrVq1omXLlqXmxytCHM+1117LeeedR/PmzWnevHnl/+A0ltQCwGa2GzACqAeMAg4nuA/ZCQTdiTu5+x/LW18FgNOXCgCnJxUArhkKCwvJyMjg7bff5uGHH+aBBx5IdUgps70FgJPdnbiM0i2zL8Lf8W9LKiKyA7jnnnuYOnUqmzZtKvcuzRJNeo9OFBH5Bbrmmmu45pprUh3GL0J6XycmIhIjne9/KJVXFe+nkpiI1AiZmZls2LAh1WFIFdqwYUOFA1uiUHeiiNQIzZo1+0XV/JPA7rvvvl3rK4mJSI3QuHFjGjdunOowJM2oO1FERGosJTEREamxknqx8/Yys3XAolTHUcM0A1T2Pzrtr8rTPqsc7a/K2d/dG0ZdON3PiS2qzJXbAmY2V/ssOu2vytM+qxztr8oxs7mVWV7diSIiUmMpiYmISI2V7knswVQHUANpn1WO9lflaZ9VjvZX5VRqf6X1wA4REZGKpHtLTEREpFxpNTrRzA4DzgB2Am509/Vm9gegCHB3/0tKA0wz5eyvgUBTgv01OqUBpqFy9pkBdwBfu/vdqYwv3ZSzv84BWgJL3P3plAaYhsrZZ+OAZcCe7q7y9THMbD9gODDV3aeG0/oSXJpQ391HVbR+urXEzgVGAlOBnuG0vcIDy94piSi9bbW/3P0+4HZgz5RFld7ifcZ+BzyTonjSXbz9dSHwQ4riqQni7bMMoAGwMjUhpS93/wSYWGbyIe5+J4CZNa5o/XRLYgDlnaTTybv4Su0XM8sCxoY/El/JPjOzJsCvgZOAY8ysbsqiSl9l//fquvv9/HyAlq2V3WdfuPstQKNUBFODJTzup1V3IvAEwTeYnYDPzawW8KWZXQ0sSV1YaSve/noS+BA4Hvhb6kJLW6X2GbDa3QeZ2d5Ab3ffmMLY0lG8z9gMMxsEfJvKwNJYvH22T7jPdC+ZMsxsN+AsoJ6ZNQJmAu+b2WAAd19d4foanSgiIjVVOnYnioiIRKIkJiIiNZaSmIiI1FhKYiIiUmOl2+hEkR2CmdUD/gy0AH4F7AHkuvvslAYmUsNodKJICplZNnAwwcXDBQRVCo4FfiIYwp4Zzu8DHAOcDNQDnnH3F6s/YpH0ou5EkfQz090vB7q5+wjgHeAg4CpgNUFy65i68ETSh7oTRdLP2vD3d+HvTUBdgi+do929MCVRiaQhJTGRmuP/gAlmtgqY6+5/T3VAIqmmc2IiIlJj6ZyYiIjUWEpiIiJSYymJiYhIjaUkJiIiNZaSmIiI1FhKYiIiUmMpiYmISI31/0H/L4VeycCkAAAAAElFTkSuQmCC", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "data": { "image/png": "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EcZFnJ/PYEREdmQ9evRg+fLlAAwZMmS7jzd58mQuueSSKr/vqFGj6NOnD6NGjWLZsmUcdNBB7L///rzyStlbg4uKiujduzf9+/enf//+PPnkkwA0atSodF3//v2ZNGlS6fOmTZvSr18/+vfvzzXXXLPdn7U8STp2LCVMj7IV2C1vkYiI1GFbtmyhceMkl8xkXnvttWo7VlXf94EHHmDFihU0atSIqVOn0q9fP379619nfd1jjz3GwIEDy6xr0aIFc+bMKbPu7LPPBkLifPHFF2nfvn31foAMSUpijwH3EwbvnZ7XaERE8mTBggXsu+++nHfeefTp04djjjmGDRs2ADBnzhwOPvhgvv71r3PSSSexcuVKIJRALr/8cgYOHMg999xDUVERV1xxBQMHDmTfffflzTff5OSTT2avvfbiuuuuK32vE088kQEDBtCnTx8eeOCBrPG0bt0agBtuuKG09NK5c+fSJPDb3/6WAw88kP79+3PBBRfw1VdfATBp0iT23ntvDjzwQGbOnJn12CUlJRxzzDH06dOHc889l6hzeZn3PeGEE1i7di0DBgzg9ttvZ/To0fz5z3+mf//+peelXnD3Cn+AjsAI4EzgjFz719TPgAEDXKQhGTppqA+dNLS2w6iyuXPnVvo1y5a5jxsXHrfX/PnzvVGjRv7WW2+5u/upp57qjz76qLu79+vXz2fMmOHu7tdff71fdtll7u4+dOhQv+iii0qPMXToUB89erS7u999993eqVMn/+STT3zjxo3euXNnX758ubu7l5SUuLv7+vXrvU+fPqXru3fv7suiD9OqVasy8a1cudL79u3rxcXFPnfuXD/++OP9yy+/dHf3iy66yB9++GH/5JNPvGvXrv7555/7pk2bfMiQIX7xxRdv81kvvfRSv+mmm9zd/emnn3Yg6/umP580aVLWY8Wfe++99/b99tvP99tvv9LPU1BQULruxBNPLPOa9M9aGdm+J0Cxl5MLkpSNf0G4yXlVnvKoiEhWkybB6OimnlHVcIdqz5496d+/PwADBgxgwYIFfPHFF6xatYqhQ4cCcOaZZ3LqqaeWvmbEiBFljnHCCScA0K9fP/r06UOnTmHC+z322IPFixdTWFjIvffey5/+9CcAFi9ezIcffkhhYWG5cbk73/ve97jyyisZMGAAEydOZPbs2QwaNAiADRs2sOuuu/LGG29QVFREhw4dSmP74IMPtjneyy+/zB//+EcAjjvuONq1a1fpc5UpaXViTUuSxIrd/em8RyIikiGqWSt93F7NmjUrfd6oUaNE1WatWrXKeoyCgoIyxysoKGDLli3MmDGD6dOnM2vWLFq2bElRUVHOUUrGjBlDly5dSqsS3Z0zzzyT2267rcx+06ZNyxlvQ5OkTewUM/urmT1hZr/Pe0QiIpH27UMJLJ99A9q2bUu7du1Ke+Q9+uijpaWyqvjiiy9o164dLVu25P333+f111+vcP+nnnqK6dOnc++995auO/LII3nyySf5/PPPAVixYgULFy7koIMO4qWXXqKkpITNmzfzxBNPZD3m4Ycfzu9+9zsAnn322dI2vh1RkgGAD6uJQEREasvDDz/MhRdeyPr169ljjz2YNGlSlY81bNgw7r//fvbdd1969+7NwQcfXOH+48eP5+OPP+bAAw8EQnXlzTffzNixYznmmGPYunUrTZo04b777uPggw9mzJgxDB48mJ133rm0ajTTjTfeyMiRI+nTpw9DhgyhW7duVf48dZ25VzwIh5n9ADiNkPAauXtRDcSV08CBA724WIPpS8NRNLkIgBlnzajVOKrqvffeY999963tMKSOy/Y9MbPZ7j4w2/5JqhP7A7Pc/Ujgme2OUEREpJokSWKrgKZm9j3ggPyGIyIiklyS3ok/Iwz8Oxy4Nr/hiIiIJFdhSczMfgy0dveN7v5Hd59vZkeY2ZE1FJ+IiEi5cpXEpgFXm9lewFfAZuD3wB/zHJeIiEhOuZJYf+Amd19TA7GIiIhUSq6OHUuB0WZ2r5ldZma9aiIoEZEdUX2eiiV9yKni4mKKiorKjaGoqIj4FqgePXpw2GFlbzfu378/ffv2Tf5BK5BrUsxXgFcAzKwncLyZ7eXuP6qWdxcRqSca+lQsn3/+Oc8++yzf/OY3K/2ea9asYfHixXTt2pX33nuvyrFnk7OLvZkNNLNRhBmdVwHXV2sEIiI1QFOxlH3fyk7FMmrUKG699dZKnfPYaaedxuOPPw7AlClTGDlyZJWOk02u3okPAAcDrwFTCEnsZjM7ttoiEBEpz/LlcMcd4bEafPjhh1x88cW8++677LzzzvzhD38A4IwzzuD222/nnXfeoV+/ftx0002lr/nyyy8pLi7mqquuAqBp06YUFxdz4YUX8u1vf5v77ruP//znP0yePJmSkhIAfvOb3zB79myKi4u59957S9dnc/PNNzNnzhxmzJjBLrvswiWXXMJ7773H448/zsyZM5kzZw6NGjXiscce49NPP+XGG29k5syZvPrqq8ydOzfrMW+66SYOPfRQ3n33XU466SQWLVq0zT5/+ctfSkehv/rqq7n55psZMWIEc+bMoUWLFtvsP3jwYJo2bcqLL76Y/IRHTjnllNJR9Z966im+9a1vVfoY5clVnXh+xqq5wFPV9u4iIhWp5rlYNBXL9rnuuusYO3Yst99+e+k6M8u6b/r6wsJC2rVrx9SpU9l3331p2bJltcQDOZKYmT1BuNE5jsbd/bRqe3cRkYpU81wsmopl+xxxxBFcd911ZUbmLyws3GaU/BUrVtA+Y+qBESNGcPHFFzN58uRqjanC6kR3P9XdT4seT82VwMzsADMba2bjzaxVtO5KM7s86t1YYGa/MLOfxlWSZnaQmc2Mng+Pto2z8tK7iDQcNTAXi6ZiqZzrrruOcePGlS4PGjSImTNn8tlnnwGh5+KmTZvo2rVrmdeddNJJjB49mmOPrd7WqJxdbczsPOBoQonsRXe/v4LdRxKGphoSvWYa0NXdrzCzu4D9gHfc/REzu8vM3ovWvRm9/uho3zOi9XMyYjkfOB/YoacWEJGapalYkhs+fHhpdSbAbrvtxj333MPw4cPZunUrrVu3ZsqUKRQUlC0jtWnThquvvrra4oglmYplgrtfGj2/290vr2DfO4BrgEOAXdx9mpndFSWm8cCjQF93fzRa/ghoBpwI3ACcmJbE3nH3OeW9l6ZikYZGU7FIQ1DZqViS3PTQ1szisvUuOfadCowBWgLzzawAWGRmlwMLgLeB083sWuAFd38uCrC7u79kZq3M7CdAW0LCExERKVeSJHY5oZowfl4ud58NzM5YfVfG8jZdjOLSnbs/g+YsExGRhJLMJ3YocD/Ql1QyExERqXVJSmKHAKuBvxM6bIiIiNQJSUpiXQnViC+QLOmJiIjUiCRJ6UygmbuvNbOfAZjZMe7+Qn5DExERqVjOkpi7b3b3tdHzz6LVFd/4ICJSB8WD337yySd85zvfqeVoyjd8+HBWrVq1zfoxY8bwi1/8otrfL1/HrQmqHhSRBmf33XfnySefzOt7VGXqFnfH3XnmGXXSTipJm1g2GhJKROqtBQsWlE7KOHnyZE4++WSGDRvGXnvtxeh4wGHghRdeYPDgwRxwwAGceuqprF27Fggjzw8aNIi+ffty/vnnl051kjl1S7ply5Zx9NFHl06P0r17d5YvX86CBQvo3bs3Z5xxBn379mXx4sVlJrG89dZb2XvvvTn00EOZN29e1s+zbNkyTjnlFAYNGlQ6DBSEEtY555xDUVERe+yxR5mhrZIctz7INQDw8Mx10b1cP89bRCKyw7v8ucuZ89mcaj1m/479uXvY3VV67Zw5c3jrrbdo1qwZvXv35tJLL6VFixaMHTuW6dOn06pVK26//XbGjx/PDTfcwCWXXMINN9wAwPe//32efvrp0ulF4qlbMt10000cccQRXHvttTz33HM89NBDpds+/PBDHn744W2GqJo9ezZTp05lzpw5bNmyhQMOOIABAwZsc+zLLruMK664gkMPPZRFixZx7LHHlk4++f777/Piiy+yZs0aevfuzUUXXcQ777yT6Lj1Qa6yboeMZQdw9035CUdEpOYdeeSRtG3bFoCvfe1rLFy4kFWrVjF37lwOOeQQICSnwYMHA/Diiy8ybtw41q9fz4oVK+jTp09pEsucuiX26quvlk7PMmzYsDLTo3Tv3j3rGIuvvPIKJ510UunUJfE0MJmmT59eZm6x1atXl5YajzvuOJo1a0azZs3YddddWbp0aeLj1ge55hN72MzaAUcCrSraV0QkqaqWmPIlc4qWLVu24O4cffTRTJkypcy+Gzdu5Ic//CHFxcV07dqVMWPGlJlqJXPqliSq8pp0W7du5fXXX6d58+bbbMv22XYkSdrExgPfJpTCjspvOCIidcPBBx/MzJkz+eijjwBYt24dH3zwQWnCat++PWvXrk3cQeSQQw7h97//PRDa2pJMj3L44Yczbdo0NmzYwJo1a3jqqexzEh9zzDFMmDChdHnOnDnVctz6IEnXmc8Jo90/YmZd8h2QiEhd0KFDByZPnszIkSPZtCm0oIwdO5a9996b8847j759+9KxY8fS2ZdziadHefTRRxk8eDAdO3akTZs2pdV+2RxwwAGMGDGC/fbbj1133bXc97r33nu5+OKL+frXv86WLVs4/PDDuf/+8mfNSnrc+iDJVCzDga+Ai4B33f2nNRFYLpqKRRoaTcVSv23atIlGjRrRuHFjZs2axUUXXZSzxNQQ5WMqlv+5+/vA82bWuxpiFBFpcBYtWsRp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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "def get_convolve_linear_grid(dist_1, dist_2, pr=False):\n", " '''\n", " get the location of the start and end points of the linearly spaced output grid \n", " of the convolve function applied to the Distribution objects dist_1 and dist_2\n", " '''\n", " est_new_peak_pos = dist_1.peak_pos + dist_2.peak_pos ##as we have assumed inverse time\n", " est_joint_fwhm = (dist_1.fwhm + dist_2.fwhm)\n", " center_width = 3*est_joint_fwhm\n", " if pr:\n", " print(\"The bounds for the linear grid should be:\" + str(est_new_peak_pos - center_width) + \"to \" + str(est_new_peak_pos + center_width))\n", " return max(est_new_peak_pos - center_width, 0), est_new_peak_pos + center_width\n", "\n", "def print_relative_diff_grids_lin(print_lin_grid=True):\n", " start_conv_linear, end_conv_linear = get_convolve_linear_grid(dist_1, dist_2, True)\n", " for t in range(len(grid_size)):\n", " eff_support = accuracy_fft[t].effective_support\n", " print_relative_diff(t)\n", " plt.axvline(x=end_conv_linear, color=\"green\", label= \"linear grid end\")\n", " plt.legend(prop={\"size\":8})\n", " plt.show()\n", " if print_lin_grid:\n", "\n", " x_linear = np.linspace(end_conv_linear-0.1, end_conv_linear+0.1, num=1000, endpoint=False) #create an x vector of points that should be sampled\n", " norm_y_sol_sup = get_P(x_linear, dist_sol)\n", " norm_y_est_fft = get_P(x_linear, accuracy_fft[t])\n", " norm_y_est_num = get_P(x_linear, accuracy_num[t]) \n", " plt.figure()\n", " plt.plot(x_linear[2:], ((norm_y_est_fft -norm_y_sol_sup)/(norm_y_sol_sup+epsilon))[2:], 'o', markersize=1, color=\"blue\", label=\"normalized diff FFT\")\n", " plt.plot(x_linear, (norm_y_est_num -norm_y_sol_sup)/(norm_y_sol_sup+epsilon), 'o', markersize=1, color=\"red\", label=\"normalized diff NUM\")\n", " plt.ylabel(\"(calculation - analytical_sol)/(analytical_sol + epsilon)\", fontsize=7)\n", " plt.xlabel(\"Time\", fontsize=7)\n", " plt.title(\"Normalized Difference Estimated and True Solution\", fontsize=12)\n", " plt.axvline(x=end_conv_linear, color=\"green\", label= \"linear grid end\")\n", " if (end_conv_linear+0.1 > eff_support[1]):\n", " plt.axvline(x=eff_support[1], color=\"blue\", label= \"effective support end\")\n", " plt.legend(prop={\"size\":10})\n", " plt.show()\n", "\n", "print_relative_diff_grids_lin(print_lin_grid=True)" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "FFT grid points (output):55.0\n", "NUM grid points (output):139.0\n", "FFT grid points, after adjusting grid (output):55\n", "NUM grid points, after adjusting grid (output):139\n" ] }, { "data": { "image/png": "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V3IOK5syZlvE6WLfFjgKeCD6WaPopmeRzBr22HvM/eq7tB7zZ3vvzPW/bFPh68nTm9SrV49LL72U8ePHc9111/Hcc89x2223UVRUxGWXXUbv3r2ZM2cOEMYxHDNmDAceeCCvvfYal156Kc899xyXX345PXr0YOrUqWzcuJFVq1Zx88038+6775bsO2/evJL379evHw8//DDDhg1j0aJFLFq0iKKiIv7whz9w1FFHcd9997FixQq6dOnCMcccU2rg4YceeojjjjuOP/7xj2zcuJE1a9akPB/z5s3j9ddf59NPP+XII48sKVm+/vrrvPvuuzRo0ICDDz6YX/ziF5gZY8eO5bXXXsPdOeSQQ+jRoweNGzfm448/5v777y8ZPmvy5Mklny/Z0qVLueGGG5g+fToNGzbklltuYeTIkVx33XUAFBQU8Oabb/LXv/6V2267jX/+858lU8Zcd911PPHEE9x7770pP1cccZLYzoSu9f8P6J2WdxURyaDk6U0A1q5dy+67717pPqtWreLll1+mT58+Jet++OEHAJ577jkeeOABIIyIv8suu1Q60G7fvn3p1asXw4YN4+GHHy5pK3vmmWd49NFHue222wBYt24d8+fPLzXM0sEHH8y5557L+vXrOfnkkyscM7Hs+9WpU4cDDzyQ/fffv6T0c+yxx9KkSbi999RTT+Wll17CzDjllFNKEuepp57Kiy++yIknnsh+++2XcvxHgFdffZW5c+dy2GGHAWEetm7dNg+LduqppwJhCpzE3GIzZ84sWU7nlDFxktjFwCFAB+CKtLxrDtENzyKZVVmJKVMqmt6kMps2bWLXXXctt+RRVfvssw9NmjThnXfeYdKkSYwZM6YkrkceeYRWrVpVuO8RRxzBzJkzeeKJJxgwYABXXnklZ511Vqk5u8pO91J2nq/E84rWV6TsVDQVcXeOPfZYJkyYUO7riWlr6taty4YNG2Idc2vFudn5LkISOwIYk9FoskA3PIvUPBVNb1KZnXfemZYtW5ZMeeLuvP322yXH+9vf/gbAxo0bWblyJY0aNeL77yseE71fv36MGDGClStX0r59ewCOO+447rrrrpL2oLfeemuL/b744gv22GMPLrjgAs4//3zefPNNIIwg//7777Np0yamTp1aap/JkyezadMmPv30Uz777LOSJPnf//6X5cuXs3btWqZNm8Zh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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "FFT grid points (output):94.0\n", "NUM grid points (output):178.0\n", "FFT grid points, after adjusting grid (output):94\n", "NUM grid points, after adjusting grid (output):178\n" ] }, { "data": { "image/png": "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bVtuv/12Bg0axFNPPUVeXl7hecla7p4Vt7Zt2/qO+uQT965dg78i2aLn6De85+g30h1GuSxYsKDc+yxf7j58ePB3R3399dderVo1f//9993dvUePHv7oo4+6u3uLFi185syZ7u4+ePBgv+KKK9zdvVOnTn7ppZcWHqNTp04+aNAgd3cfOXKk77PPPv7dd9/5+vXrfb/99vMVK1a4u3tBQYG7u69du9abNWtWuPyAAw7w5eGLqVOnTpH4fvzxR2/evLnPmTPHFyxY4N26dfNff/3V3d0vvfRSHzdunH/33Xe+//77+w8//OAbNmzwww8/3Pv377/Na/3zn//sQ4cOdXf3Z5991oESnzf+/pgxY0o8Vux1H3zwwd6qVStv1apV4evJyckpXHbaaacV2Sf+te6okt47wBwvJTdUqerEp5+G55+Hzp1h4MB0RyMi8WI1JZCcz2eTJk3Iy8sDoG3btixcuJCffvqJVatW0alTJwD69OlDjx49Cvfp1atXkWOccsopALRo0YJmzZqxzz77AHDggQeyZMkS6tevzz333MPUqVMBWLJkCZ9//jn169cvNS5355xzzuHqq6+mbdu2jBo1irlz53LooYcCsG7dOvbcc0/efvttOnfuTIMGDQpj++yzz7Y53qxZs3jyyScBOPnkk6lXr165z1VxUasTM0GVSmJhyb3wr4hkjmR/PmvWrFl4v1q1apGqzerUKTpTQOwYOTk5RY6Xk5PDpk2bmDlzJjNmzODNN9+kdu3adO7cOWEX8SFDhtCwYcPCqkR3p0+fPvz9738vst20adMSxitVrE0sNzf4gIwZE3TyEJHMkZsblMBS2Tdgt912o169eoU98h599NHCUtn2+Omnn6hXrx61a9fmk08+4a233ipz+2eeeYYZM2Zwzz33FC479thjmTJlCj/88AMAK1euZNGiRRx22GG8+uqrFBQUsHHjRiZPnlziMY866igee+wxAF544YXCNr6qokqVxCD5VRYikl3GjRvHJZdcwtq1aznwwAMZswM9vU488URGjx7NIYccQtOmTWnfvn2Z248YMYJvv/2Wdu3aAUF15bBhw7j55pvp0qULW7ZsoXr16tx33320b9+eIUOG0KFDB3bffffCqtHibrrpJnr37k2zZs04/PDDadSo0Xa/nmxkHteTJZPl5+d7MuYT+/RTuPpqGDECmjZN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vz/dunVj3rx5QDCO4ejRoznooIN4++23ueyyy3j55Ze5/PLL6dSpE1OnTmXz5s2sXr2a2267jY8++qhw34ULFxY+f69evXj88ccZOnQoS5cuZenSpeTn53P99ddzzDHH8PDDD7Nq1SratWvHcccdV2Tg4ccee4wTTjiBv/71r2zevJm1a9cmPB8LFy7knXfe4csvv+Too48uLFm+8847fPTRR9SuXZtDDz2Uk08+GTNjzJgxvP3227g7hx12GJ06daJevXp8/vnnjBs3rnD4rMmTJxe+vngrVqzg5ptvZsaMGdSpU4fbb7+dESNGcOONwXgYubm5vPfee9x///3ceeedPPjgg4VTxtx4440899xzPPTQQwlfVxRRktiuBF3r/wh0S8qzZpBYu1jnzhpDUaSyiJ/eBGDdunXsueeeZe6zevVq3njjDXr06FG4bMOGDQC8/PLLPPJI0CetWrVq7LbbbmUOtNuzZ0+6dOnC0KFDefzxxwvbyqZPn87TTz/NnXfeCcD69etZvHhxkWGWDj30UM477zw2btzIaaedVuqYicWfLycnh4MOOogDDzywsPRz/PHHU79+cHlv9+7def311zEzTj/99MLE2b17d1577TVOOeUUDjjggITjPwK89dZbLFiwgCOOOAII5mHr0GHrsGjdu3cHgilwYnOLzZo1q/B+MqeMiZLELgEOA1oBVyblWTOISmIiqVVWiSlVSpvepCxbtmxh9913L7HkUV777bcf9evX58MPP2TSpEmMHj26MK4nnniCpmUM2HrUUUcxa9YsnnvuOfr27cvVV1/NueeeW2TOruLTvRSf5yv2uLTlpSk+FU1p3J3jjz+eCRMmlLg+Nm1NtWrV2LRpU6Rjbq8oFzvfS5DEjgJGpzSaNFAPRZHKp7TpTcqy66670qRJk8IpT9ydDz74oPB4//znPwHYvHkzP/30E3Xr1uWXX0ofE71Xr14MHz6cn376iZYtWwJwwgkncO+99xa2B73//vvb7Ldo0SL22msvLrzwQi644ALee+89IBhB/uOPP2bLli1MnTq1yD6TJ09my5YtfPnll3z11VeFSfK///0vK1euZN26dUybNo0jjjiCjh07Mm3aNNauXcuaNWuYOnUqHTt2LPE1VK9enY0bN26zvH379syePbuw2nLNmjV89tlnpZ4LSN2UMVGS2Kfufre73wEs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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "FFT grid points (output):133.0\n", "NUM grid points (output):237.0\n", "FFT grid points, after adjusting grid (output):133\n", "NUM grid points, after adjusting grid (output):124\n" ] }, { "data": { "image/png": "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uKL8XCeddBIdO3akdevW3HnnnRXGs+uuuwJw5ZVXlpdemjZtWp4E/vWvf9GpUydKSko477zz+OGHHwAYP348Bx10EJ06dWLmzJkVHnvZsmX07NmT1q1bc/bZZxM/0XHsvCeccAKrV6+mY8eOXH/99QwbNoz//Oc/lJSUlF+XvOXuKXkAHYG/AH8DBhEkyEuAi4GLwtc3EJTWjgOaATcB1wIlyY7fsWNH31EffODeq1fwUyRf9Bn3ivcZ90q2w6iWuXPnVnufJUvcR48Ofu6ozz//3OvUqeNvv/22u7v37t3b77//fnd3b9u2rU+fPt3d3YcPH+6DBw92d/fu3bv7BRdcUH6M7t27+7Bhw9zdfezYsb7vvvv6119/7evXr/emTZv60qVL3d192bJl7u6+du1ab926dfny/fff35eEb6Zhw4ZbxbdixQpv06aNl5WV+dy5c/3444/377//3t3dL7jgAr/33nv966+/9ubNm/vixYt9w4YN3rVrVx84cOA27/UPf/iDjxw50t3dn3jiCQcqPG/88/Hjx1d4rNj7Puigg7x9+/bevn378vdTUFBQvuykk07aap/497qjKvrsAGVeSW5IWXnZ3WcBsxIW35TwemjC60tSdf4oHnsMnnoKevSAoYmRiEhWxWpKIDV/n61ataKkpASAjh07Mm/ePFatWsXKlSvp3r07AGeeeSa9e/cu36dv375bHeOEE04AoG3btrRu3Zp9990XgAMOOIAvvviCwsJCbrnlFh599FEAvvjiCz7++GMKCwsrjcvdOf300xkyZAgdO3bktttuY9asWRx66KEArFu3jr322ovXX3+dHj160KRJk/LYPvroo22ON2PGDB555BEAfvnLX9K4ceNqX6tEUasTc0Gtuk8sLLmX/xSR3JHqv8969eqVP69Tp06karOGDbeeKSB2jIKCgq2OV1BQwKZNm5g+fTrPPvssr776Kg0aNKBHjx5Ju4iPGDGCZs2alVclujtnnnkm11577VbbTZ06NWm8Usu62BcVBX8g48cHnTxEJHcUFQUlsHT2Ddh9991p3LhxeY+8+++/v7xUtj1WrVpF48aNadCgAR988AGvvfZalds//vjjPPvss9xyyy3ly37+85/z0EMPsXjxYgCWL1/O/PnzOeyww3jxxRdZtmwZGzduZMqUKRUe88gjj+Tf//43AE8//XR5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RK688kqef/55brzxRkpLSxk4cCDHH388s2fPBoJxDMeNG8eBBx7I66+/zoUXXsjzzz/PRRddRPfu3Xn00Uf54YcfWL16Nddddx3vvfde+b7z5s0rP3/fvn158MEHGTlyJAsXLmThwoWUlpbypz/9iZ/97Gfcc889rFy5kk6dOnH00UdvNfDwv//9b4499lj+/Oc/88MPP7B27dqk12PevHm88cYbfPrppxx11FF88sknALzxxhu89957NGjQgEMPPZRf/vKXmBnjx4/n9ddfx9057LDD6N69O40bN+bjjz/m3nvvLR8+a8qUKeXvL97SpUu5+uqrefbZZ2nYsCHXX389Y8aM4corrwSgqKiIt956izvuuIMbb7yRu+66q3zKmCuvvJInn3ySu+++O+n7iiJKEtuNoGv9r4HjU3LWHKIeiiI1T/z0JgDr1q1jr732qnKf1atX88orr9C7d+/yZRs2bADg+eef57777gOCEfF33333Kgfa7dOnDz179mTkyJE8+OCD5W1l06ZN47HHHuPGG28EYP369SxYsGCrYZYOPfRQzjrrLDZu3MhJJ51U6ZiJiecrKCjgwAMP5IADDigv/RxzzDEUFga3955yyim8/PLLmBknn3xyeeI85ZRTeOmllzjhhBPYf//9k47/CPDaa68xd+5cDj/8cCCYh61Lly3Dop1yyilAMAVObG6xGTNmlD9P5ZQxUZLY+cBhQHvg4pScNYeoh6JIelVVYkqXyqY3qcrmzZvZY489Kix5VFfTpk0pLCzk3XffZfLkyYwbN648rocffpji4uJK9z3yyCOZMWMGTz75JP3792fIkCGcccYZW83ZlTjdS+I8X7HXlS2vTOJUNJVxd4455hgmTZpU4frYtDV16tRh06ZNkY65vaLc7HwrQRI7EhhX2UZm1sHMrjazMWbWMFw2xMwuNrPBZlZgZjea2Z/N7FgzKzGz+8P1u6fm7VSfeiiK1DyVTW9Sld12241WrVqVT3ni7rzzzjvlx/v73/8OwA8//MCqVato1KgR331X+Zjoffv2ZfTo0axatYp27doBcOyxx3LrrbeWtwe9/fbb2+w3f/589t57b8455xzOPvts3nrrLSAYQf79999n8+bNPProo1vtM2XKFDZv3synn37KZ599Vp4k//vf/7J8+XLWrVvH1KlTOfzww+nWrRtTp05l7dq1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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "FFT grid points (output):210.0\n", "NUM grid points (output):336.0\n", "FFT grid points, after adjusting grid (output):108\n", "NUM grid points, after adjusting grid (output):177\n" ] }, { "data": { "image/png": "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zjqLTz/9lNtuu43333+fO+64g86dOzNjxgz279/Pjh07eOyxx/j666+Ltl29enXR+/fr14/XXnuNkSNHsmHDBjZs2EBGRgb33Xcfv//973nppZfYtm0bbdq0oVu3bocMPPzPf/6Tiy66iD//+c/s37+fwsLCsPtj9erVfPbZZ/zwww907dq1qGT52Wef8fXXX5OcnEzr1q255JJLEBFyc3P59NNPUVXatm1L586dqV27Nt9//z2TJk0qGj5r2rRpRZ8vmN/v56GHHiIvL4+UlBQef/xxxo4dywMPPACAz+fjiy++4K9//StPPPEEL7zwAiNHjuT888/ngQce4K233uLFF18M+7m88JLEjsPpWv8noGdE3jWe9OoFc+fSbFgvRnexPh7GlAfB05sA7Ny5k5NOOqnUbXbs2MHHH39M3759i5bt3r0bgPfff5+XX34ZcEbEP/7440sdaPfKK6+ke/fujBw5ktdee62orWzOnDnMmjWLJ554AoBdu3axdu3aQ4ZZat26NQMHDmTv3r1cdtllJY6ZGPp+SUlJnHXWWTRs2LCo9HPhhReSmupc3tunTx8++ugjRITevXsXJc4+ffrw4Ycf0qtXL84888yw4z8CLFy4kGXLltGhgzOG+549e2jX7uBwaH369AGcKXBef/11wJkyJnA/klPGeElitwBtgebAnRF513jilsROdLvZ2xiKxkRWaSWmaAlMb/Loo4963ubAgQOccMIJxZY8jtTpp59OamoqX331FVOnTmXChAlFcf3rX/+icePGJW7bqVMn5s+fz1tvvcWAAQMYMmQI11577SFzdoVO9xI6z1fgcUnLSxI6FU1JVJULL7yQyZMnF/t8YNoar1PgHAsvFzs/g5PEOgETohpNLGRlwfDhUFDAS6OdHorjQy8sMMYklAsuuIDp06ezadMmwJnzas2aNaVuc9xxx9GgQQOmTZsGOCfqL7/8suj1/va3vwGwf/9+fv31V2rVqsX27SWPid6vXz9Gjx7Nr7/+SrNmzQC46KKLeOaZZ4rag5YsWXLYdmvWrOHkk0/mxhtv5IYbbuCLL74AnBHkv/32Ww4cOMCMGTMO2WbatGkcOHCAH374gVWrVhUlyXfffZctW7awc+dOZs6cSYcOHejYsSMzZ86ksLCQgoICZsyYQceOHYv9DFWqVGHv3r2HLc/MzGTBggVF1ZYF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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "FFT grid points (output):404.0\n", "NUM grid points (output):585.0\n", "FFT grid points, after adjusting grid (output):105\n", "NUM grid points, after adjusting grid (output):155\n" ] }, { "data": { "image/png": "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M88AYQLL008/nV69enHIIYfsNFr/2LFjadeuHe3atWP8+PFAmL6mTZs2nH/++bRr146f/exnbNq0icLCQn7yk5/sEuf06dPp1q0bnTp14pxzzmH9+vVAKGHdeOONdOrUifbt2xefw7KmjNkdcXontgO+BzwY3ZfI3ecCc1NWp5bPU3tMjEg5xsCk5SeBXf/ClUHd7EUyZtTTHzD/8y8zeszDD9yHG3/YttTnk6c3qVOnDpdffjkPP/wwI0aM4IUXXuD222+nqKiIQYMGceqppzJv3jwgjGN47733csghh/DGG29w+eWX88ILL3DFFVfQs2dPnnjiCb755hvWr1/PLbfcwvvvv1+878KFC4tfv2/fvjz66KOMGjWKpUuXsnTpUoqKirj++uv53ve+xwMPPMDatWvp0qULxx9//E4DD//1r3/lxBNP5Fe/+hXffPMNGzduTHs+Fi5cyJtvvsnHH3/McccdV1yyfPPNN3n//fepX78+Rx55JD/4wQ8wMyZMmMAbb7yBu3PUUUfRs2dPGjduzEcffcSkSZOKh8+aOnVq8ftLtnLlSm666SZmzJhBgwYNuPXWWxk7diwjRoSf9IKCAt5++21+//vfc/vtt/PnP/+5eMqYESNG8Pe//537789MV4c4SWwfQtf6HwGnZuRVc52qE0XyWvL0JgCbNm3iW9/6Vpn7rF+/nldffZVzzjmneN2WLVsAeOGFF3jwwQeBMCJ+o0aNyhxo99xzz+WEE05g1KhRPProo8VtZdOnT+epp57i9ttvB2Dz5s0sWrRop2GWjjzySC688EK2bt3KGWecUeqYiamvV6tWLQ455BBat25dXPrp3bs3TZqEy3v79OnDK6+8gplx5plnFifOPn368PLLL3Paaadx8MEHpx3/EeD1119n/vz5HH300UCYh61btx3DoPXp0wcIU+Ak5habNWtW8XImp4yJk8QuBY4idMy4KiOvKiI1RlklpmwpbXqTsmzfvp199923xJJHeR100EE0adKE9957jylTpnDvvfcWx/X444/Tpk2bUvc99thjmTVrFn//+9/p378/Q4YM4fzzz99pzq7U6V5S5/lKPC5tfWlSp6IpjbvTu3dvJk+eXOLziWlrateuzbZt22Ids6LiDDt1FyGJHQvcm9VocoV6J4rktdKmNynLPvvsQ6tWrYqnPHF33n333eLj/eEPfwDgm2++Yd26dTRs2JCvvip9TPS+ffsyZswY1q1bR4cOHQA48cQTueuuu4rbg955551d9vv000/Zf//9ufjii7nooot4++23gTCC/Icffsj27dt54okndtpn6tSpbN++nY8//pgFCxYUJ8l//vOfrF69mk2bNjFt2jSOPvpoevTowbRp09i4cSMbNmzgiSeeoEePHiW+hzp16rB169Zd1nft2pXZs2cXV1tu2LCB//znP6WeC8jelDFxkti/3f0Od78NWJqRV811AwaEUexVnSiSlw4//PDi6U06dOhA7969Wbo0/c/Xww8/zP3330/Hjh1p27ZtcceLO+64gxdffJH27dvTuXNn5s+fT5MmTTj66KNp164dQ0toOz/77LN55JFHOPfcHbNXDR8+nK1bt9KhQwfatm3L8OHDd9lv5syZdOzYkSOOOIIpU6Zw5ZVXAnDLLbdw6qmn0r17dw444ICd9mnRogVdunTh5JNP5t5776VevXBlUpcuXTjrrLPo0KEDZ511FkVFRXTq1In+/fvTpUsXjjrqKC666CKOOOKIEs/HwIED6dChwy4dO5o2bcrEiROLL0/o1q1bcRVmaW688UZmzZpF27Zt+dvf/paxHuVpp2Ixs1eA+YSqx0OBV90950btyNhULCI5TlOxSLL+/ftz6qmn7nKN2sSJE5kzZw533506ZkVuy/hULMCufStrAo3aISKS8+IksTOAdu5+sZkNd/dfZzmm3KBu9iKSByZOnFji+v79+xdfS1adxUli3wEWR8s1Zz4xdbMXEcl5cTp2OLCXmbUDDsxyPCJSTWRqRAapOSrymYmTxH5HmIrlp4RR52sGdbMXqbB69eqxatUqJTKJzd1ZtWpVcc/KuNJWJ7r7IuDaigaWt047DWbODPciUi7NmjVjyZIlrFixoqpDkTxSr149mjVrVq594rSJ1UxPPQX/+EdYnjRJPRRFyqFOnTq0atWqqsOQGiBOdSLRiPQ1y4ABcMopIZGpSlFEJCfFLYndDVyezUByTkEBjB0bllWlKCKSk8osYZlZQzM7GGhoZi3MLIMzT+aByZNDSayUQS5FRKRqpasm7AD0B9pE9/2zG46IiEh8ZVYnuvtsYLaZfdvdR1dSTLlj8OAdyytXqnOHiEiOidth4+GsRpGrEklr1CjIs0E0RURqglhJzN1fyXYgIiIi5aXrxNLp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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "def plot_effects_adjust_grid():\n", " dist_sol._adjust_grid(rel_tol=REL_TOL_PRUNE)\n", " for t in range(len(grid_size)):\n", " eff_support = accuracy_fft[t].effective_support\n", " print(\"FFT grid points (output):\" +str(time_fft[t][1]))\n", " print(\"NUM grid points (output):\" +str(time_num[t][1]))\n", " accuracy_fft[t]._adjust_grid(rel_tol=REL_TOL_PRUNE)\n", " accuracy_num[t]._adjust_grid(rel_tol=REL_TOL_PRUNE)\n", " print(\"FFT grid points, after adjusting grid (output):\" +str(len(accuracy_fft[t].y)))\n", " print(\"NUM grid points, after adjusting grid (output):\" +str(len(accuracy_num[t].y)))\n", " x_support = np.linspace(eff_support[1]-0.1, eff_support[1]+0.1, num=1000, endpoint=False) #create an x vector of points that should be sampled\n", " norm_y_sol_sup = get_P(x_support, dist_sol)\n", " norm_y_est_fft = get_P(x_support, accuracy_fft[t])\n", " norm_y_est_num = get_P(x_support, accuracy_num[t])\n", " plt.figure()\n", " plt.plot(x_support[2:], ((norm_y_est_fft -norm_y_sol_sup)/(norm_y_sol_sup+epsilon))[2:], 'o', markersize=1, color=\"blue\", label=\"normalized diff FFT\")\n", " plt.plot(x_support, (norm_y_est_num -norm_y_sol_sup)/(norm_y_sol_sup+epsilon), 'o', markersize=1, color=\"red\", label=\"normalized diff NUM\")\n", " plt.ylabel(\"(calculation - analytical_sol)/(analytical_sol + epsilon)\", fontsize=7)\n", " plt.xlabel(\"Time\", fontsize=7)\n", " plt.title(\"Normalized Difference Estimated and True Solution\", fontsize=12)\n", " plt.axvline(x=eff_support[1], label= \"effective support end\")\n", " plt.legend(prop={\"size\":10})\n", "\n", " plt.show()\n", "\n", "plot_effects_adjust_grid() " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Noticibly the adjust_grid function has a large impact, typically removing half or more of the grid points when the grid is larger than 200. As this results in osscillations in the FFT error function as well this leads me to conclude that these are indeed caused by linear interpolation in locatiosn with less grid points." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Lastly I will store the dist_1 and dist_2 functions as they would be stored as BranchLenInterpolator or NodeInterpolator objects. The number of desired grid points is given in the config file under BRANCH_GRID_SIZE. These points are split evenly in the segments [0, mutation_length], [mutation length, 3* mutation_length], [3* mutation_length], [3*mutation_length, MAX_BRANCH_LENGTH]and the grid points are spaced quadratically, furthermore additional points are added around 0 to account for numerical errors. The MAX_BRANCH_LENGTH is set as 4 but I wil change this to 50 to be consistent with the functions I am using. NodeInterpolator objects' grids are not altered by initialization, however as they are either the product of time constraints or the result of convolution and adjust_grid operations I can assume they are also stored with a similar grid structure. \n", "\n", "As these gamma distributions are not linked ot a node I will use their (true) peak_pos as the mutation_length. " ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "4.0\n" ] }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "print(MAX_BRANCH_LENGTH) \n", "def get_BranchLenInterpolator_grid(sigma):\n", " n_grid_points = BRANCH_GRID_SIZE\n", " grid_left = sigma * (1 - np.linspace(1, 0.0, n_grid_points//3)**2.0)\n", " grid_zero = grid_left[1]*np.logspace(-20,0,6)[:5]\n", " grid_zero2 = grid_left[1]*np.linspace(0,1,10)[1:-1]\n", " # from optimal branch length to the right (--> 3*branch lengths),\n", " grid_right = sigma + (3*sigma*(np.linspace(0, 1, n_grid_points//3)**2))\n", " # far to the right (3*branch length ---> MAX_LEN), very sparse\n", " far_grid = grid_right.max() + MAX_BRANCH_LENGTH*np.linspace(0, 1, n_grid_points//3)**2\n", "\n", " grid = np.concatenate((grid_zero,grid_zero2, grid_left,grid_right[1:],far_grid[1:]))\n", " grid.sort() # just for safety\n", " return grid\n", "\n", "sigma_1 = dist_1.peak_pos\n", "sigma_2 = dist_2.peak_pos\n", "x_1 = get_BranchLenInterpolator_grid(sigma_1)\n", "x_2 = get_BranchLenInterpolator_grid(sigma_2)\n", "y_1_bl = gamma.pdf(x_1, alpha_1, scale=1/beta)\n", "y_1_bl[y_1_bl == 0] = TINY_NUMBER ##remove -inf to prevent numerical errors\n", "\n", "dist_1_bl = Distribution(x_1, y_1_bl, kind='linear', is_log=False)\n", "\n", "y_2_bl = gamma.pdf(x_2, alpha_2, scale=1/beta)\n", "y_2_bl[y_2_bl == 0] = TINY_NUMBER ##remove -inf to prevent numerical errors\n", "\n", "dist_2_bl = Distribution(x_2, y_2_bl, kind='linear', is_log=False)\n", "\n", "plt.figure()\n", "plt.plot(x_2, gamma.pdf(x_2, alpha_2, scale=1/beta), color=\"blue\")\n", "plt.plot(x_2, np.exp(-dist_2_bl.y), color=\"green\") ##just to check that distribution object is initialized accurately \n", "plt.ylabel(\"PDF Gamma(\"+ str(alpha_2) +\",\"+str(beta)+ \")\")\n", "plt.title(\"Distribution 2\")\n", "plt.show()\n", "\n", "alpha_sol = alpha_1 + alpha_2\n", "y_sol = gamma.pdf(x, alpha_sol, scale=1/beta)\n", "y_sol[y_sol == 0] = TINY_NUMBER ##remove -inf to prevent numerical errors\n", "dist_sol = Distribution(x, y_sol, kind='linear', is_log=False)\n" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "FFT grid points (output):57.0\n", "NUM grid points (output):147.0\n" ] }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAbEAAAEhCAYAAADxtp7yAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAAsTAAALEwEAmpwYAAA4kUlEQVR4nO3deXhU5dnH8e8NsouCgbqwKG7UhiVIRFAR2iqudVdKFwX3BfeC1qospVVBccOWUhWsRUVRqeurr1VEcQ1KfQXrgoKIoCQIsoiy3O8fz5kwhCRzJskkmeT3ua5cM3PmnDP3nMyce57lPI+5OyIiItmoQU0HICIiUlFKYiIikrWUxEREJGspiYmISNZSEhMRkaylJCYiIllLSayOMrOZZnZ2dP/XZvZ8Fe9/DzNzM9uuEvuYaGbXJT2+wMy+MrM1ZpZjZgeb2cfR4xOqJPAsZWZ9zezDmo6jNGbW38y+qKbXmmJmY6rjtTKtst+hTHyvs5GSWAWZ2UIz+9rMWiQtO9vMZtZgWKVy96nuPqA6XzM6Pt+Z2WozW2lmr5nZ+WZW/Jlz9/Pd/Y/R+o2A8cAAd9/e3YuA0cCE6PGM6oy/qiQdhzVJfxNibOdmtnfisbu/4u6dMxRj1icGM7sm6fiuN7NNSY/nZfi1D4k+36vMbIWZzTazA6r4NbZJeDXxva6NlMQqpyFwaWV3YkFd/F/8wt1bArsDNwJXAfeUse7OQFMg+YSze4nHsVWmhJgBv4gSceJvaE0HVNe4+58Txxc4H3g96XjnJtar6u+ame0APAXcCewEtANGAd9X1WtI+eriibM6jQN+Z2atSnvSzA4ys7ejX2hvm9lBSc/NNLM/mdlsYB2wZ/RL68KoCm21mf3RzPaKfuV9a2YPm1njaPvWZvaUmS03s2+i++3LiGOwmb0a3R9eolSwwcymRM/taGb3mNlSM1tiZmPMrGH0XEMzu9nMCs3sU+CYuAfJ3Ve5+xPAQOAMM+sS7XNK9Br7AomqspVm9qKZLQD2BJ6M4mySIr7B0S/gW82sCBgZbXOzmX1uoZpyopk1i9bvb2ZfmNmVUYl6qZkNSTpmzczsFjNbFP3/Xk3atnf0P1lpZv8xs/5xj0WJ/8veZvZytP9CM5sWLZ8VrfKf6L0PtBJVdhZKeMPM7D0zWxsdl53N7Nnos/OCmbVOWv8RM1sWvdYsM8uNlp8L/BpIfC6ejJbvZmaPRp+vz8zskhLHZkr0uZsPlFvqMLPbzWxx9BmeY2Z9k54bGX2u/xHFPc/M8pOe72Fm70TPTSP80En3OJf2XVtoZoeViOOfSY/j/o/3BXD3B919k7t/5+7Pu/t70X4amNm10efo6+h97lhGnOXFlPhMrIz+T30s6XsdrZ/qfPPH6Duy2syeN7M2aRzG2svd9VeBP2AhcBjwGDAmWnY2MDO6vxPwDfBbYDtgUPQ4J3p+JvA5kBs93whw4F/ADtHy74F/E07mOwLzgTOi7XOAk4HmQEvgEWBGUnwzgbOj+4OBV0t5Dx2AL4GjosePA38DWgA/At4CzoueOx/4b7TNTsBLUbzblXd8Sln+OXBBdH9K0rHbo+T+Su4jRXyDgY3AxdHxbAbcCjwRxdsSeBK4IVq/f7T+6OjYH004wbWOnr8rOobtCCXug4Am0eOiaP0GwOHR47bpHIfouQeBP0T7aQockvScA3snPe4PfFFiv28QSrDtgK+Bd4Ae0b5eBEYkrX9mdAyaALcBc5OeK/4/RI8bAHOA64HGhM/fp8AR0fM3Aq9Ex7UD8H5ybKW8z98QPq/bAVcCy4Cm0XMjgfXR8WwI3AC8ET3XGFgEXB79j04BNiTHWsbrDSbp807p37Wt/i9RHP+M7sf+HxO+q0XAfcBRic9PieP+SXQMtyecL+4v7TOfIqat1i35Pol3vllASLrNosc31vR5tCr+VBKrvOuBi82sbYnlxwAfu/v97r7R3R8kJIFfJK0zxd3nRc9viJaNdfdv3X0e4eTwvLt/6u6rgGcJJyncvcjdH3X3de6+GvgT0C9u0FGpYgZwu7s/a2Y7E760l7n7Wnf/mpAEfhltchpwm7svdvcVhJNNRXxJ+MKlJUZ8AF+6+53uvpFwYjwXuNzdV0TH6M8l1t8AjHb3De7+DLAG6GyhuulM4FJ3X+LhF/Zr7v494YT8jLs/4+6b3f1/gYIotrLMiH7RJ/7OSXr93YHd3H29u79azj5Kc6e7f+XuSwhJ5U13f9fd1xMSfo/Eiu5+r7uvjt7DSKB7WSUCQsmqrbuPdvcf3P1T4O9s/Vn4U3RcFwN3lBeku/8z+rxudPdbCIk0uX3v1eh4bgLuB7pHy3sTEs5t0f9oOvB2zGNTUmnftbLE/h+7+7fAIYQE83dguZk9EX1eIZRyx0ff4TXA74FfWtVXd8c530x294/c/TvgYSCvimOoEbWp3SArufv7ZvYUcDXwQdJTuxF+RSZbRPiVl7C4lF1+lXT/u1Ie7wJgZs0JJ/EjgUS1UUszaxidDFK5B/jQ3W+KHu9OOGEsNbPEOg2SYtytRLwl31tc7YAVFdguVXyUuN+WUEqdk7S+EX7tJxRFCS9hHeHXchtCaWZBGXGcambJJ4dGhJJpWU5w9xdKWT4c+CPwlpl9A9zi7veWs5+SUn1WtodQFUz4kXMq4bhsjtZpA6wqZb+7A7uZ2cqkZQ0JiRLS/CyY2e+As6LtnFB6Sa7KWpZ0fx3QNDrJ7wYscffkUcor+rkr7btWlrT+x+7+AaFUhJn9GPgnobQ7iG3PA4sI592dqVpxzjclj/P2VRxDjVASqxojCFU5tyQt+5LwZUjWEfifpMeVmULgSsKv2QPdfZmZ5QHvEk7U5TKzqwnVCn2TFi8mVF+2KXFiT1hKqDpK6JhuwBZ6bLUD0i1xxIkPtj6ehYQTeW5UUklHIaEktxfwn1LiuN/dz9lmqzS5+zLgHAg93IAXzGyWu39S2X2X8CvgeEL190JC1fQ3bPmslPwcLgY+c/d9ythf4rOQ6HRT5mchav8aDvwcmOfum6OEnfJzGr1OOzOzpETWkdJ/XKRS8j2uJfzISdgl6X6F/8fu/l8LbcznRYtKngc6EqqxvwJKtmGXF1Oqc0Wc802dpOrEKhCddKYBlyQtfgbY18x+ZWbbmdlA4CeEnkxVoSXhJL3SzHYiJNKUzOyoKM4To2qFxHtYCjwP3GJmO0QN0nuZWaKK8mHgEjNrH3UYuDpuoNH+jgUeItTx/1/cbdOIr+T6mwnVO7ea2Y+iONqZ2RExXmszcC8wPurg0DBqSG9C+JX9CzM7Ilre1EKni1I71ZTHzE5N2u4bwokqUUr6itCOUhVaEn4AFBFOkn8u8XzJ13oLWG1mV1noxNHQzLrYlm7jDwO/t9C5qD2hHbK8194ILAe2M7PrCSWxOF6Ptr3EzBqZ2UlAr5jbpjKXUK3XKOpIckrSc7H/x2b2Ywudg9pHjzsQSmBvRKs8CFxuZp3MbHvCsZ9Wxg+x8mJaTvhslPWZyPT5ptZSEqs6owkdDoDQZgUcSygxFRF+jR7r7oVV9Hq3ERpoCwlfmLi/uAYSqpQ+sC09FCdGz51OaEyfTzipTgd2jZ77O/AcoWTyDqGBOpUnzWw14ZftHwjXgQ0pf5NylRdfaa4iNKq/YWbfAi+wdVtMeX4H/B+hDWYFcBPQIGoDOh64hnBiWQwMo/zv0pO2dY/Qx6PlBwBvmtkaQgeUS6P2JwjtVvdFbWinxYy5LP8gVC0tIRy7N0o8fw/wk+i1ZkTV0ccS2kw+I3zG7iaU4CB0IV8UPfc8oR2rLM8RPpsfRdusJ2bVnrv/AJxEqKpbQfjsxvncxXEdoaT9DeH9PJD0uun8j1cDBxL+j2sJx/Z9wvcewo+h+wm9Cz8jvP+ykn55Ma0jVAnPjv5PvZM3rIbzTa1lW1c3i4iIZA+VxEREJGspiYmISNZSEhMRkaylJCYiIllLSUxERLJWrb7YuU2bNr65RRjNac+2LVKsLSKfLl8L6Psi2WvOnDmF7l5yGL8y1eoktscee7DXOXcCMO28PjUcjUjtN/BvrwP6vkj2MrO0hhZTdaKIiGQtJTEREclaSmIiIpK1lMRERCRrKYmJiEjWUhITEZGspSQmIiJZS0lMRESyVq2+2Fmq3htvwJAhMHky9O4NH34YHi9eDB06wKWXwu9/D82bw4oV4A45ObBqFey4Y+plmdgmU3F06BCOQ+e402SKSK1TqyfFzM/Pd43YAYWF4WQ7ZAi0aRMejxwJTz4J7dqFxDN8OPzwQ+qT+sqVsH49NG0KrVvDN9+ExwlmYb36omlTaNUKOnWqGwlNI3ZItjOzOe6eH3d9lcRqUMnkBKGkNHDg1glp0yZYuhTGjAmlhyVLQjIC+PxzePNN2Lw5PF62LNx+8cWW10ksS2jQICSupUvD46ZNtyTH9euhYUP48Y/rfkks8X6XLQt/eXnwox/BtGmhlCoitZ+SWDUpLISxY+Hdd2HChHAiPeUUePlluPXWsE5ySQm2TT7ffgvz5m153LRpWHfz5i0lilQn9U6d4PrrYfRoWLgQGjXactIuWdVY1yX/YEgc988/h5//HC66KJRuEz8uRKR2UhLLkA8/hKFDoUcPOOssOO+8kLAg/OJv3DgkJdhSIkoomZByckI1X2FhSE5r1sCxx8LFF8M992xJjOlUhR155LbLeveGDz6oyLvNTr17w6JoqNFEQvv6a1i3DsaNg0cfhWeeyf4qRpG6TEmsCpSsFvzwQ+jbF5YvhxdegDvv3FK6SlTlJR537Ag77QRffbWlpJRO28zYsZl5T/VNIqF9+CEcfDAUFcGnn0LPnuF/WB9KpiLZSF3sq8CECaHqae+9oUuXUNJavhy2i34iJBLW3nvDAw+ExNWuXaiymjMnlKS+/DKUyF57Tb/8a1LnzjB7Nhx6KDRrBmvXwmGHheQmIrWPSmJpKiwMSQtCdWFREUydGh6vWhX+Ek4/PVTPffllqP4bOTKU1AYOrPawJQ2dO4eq3zfeCO1ja9eG0tns2fqBIVLbKImlacIEGDUq3J80aUsX9XbtQq++li23tFklkpZkp969Q2l53LjwY6VvX3jlFSUykdpESSyFku1d69ZteS65Q8avfqX2qbpo+PBwe/fdoYr42GPh9df140SktlASSyFR8lq7FgYNgscfD8sTHTK++Sac2BInO6lb2rTZ8uNk3Dj45JNwacT06UpkIrWBOnaUo7AQXnop3J80KXSX/+STcCFwokPGwoUh0emEVrclOu5AaC8bNCh8PkSkZimJlWPCBJg1K9xfuhS++w5atIAZM5S06ps2beCpp7YkshdeUPWxSG2gJFaORPvXAQdAfj7suWc4ealhv37q3Dm0hyUS2d13hxKaSmQiNUdJLMmHH8Ixx4TbDz/c0v519NHw9tuwYIEueq3vEiWytm1De+i4cSqRidSkWEnMzNqa2V5m1ijTAdWkoUPDMEMHHLB1+9fQoTUdmdQmnTuHrvY5OeHxXXeFa8pEpPqV2zvRzM4DDgG+A1YC7cxsFTDO3T/LfHjVp7AwDAQLsHp1uFX7l5QlMbJHz56h56oGDRapGam62L/t7n9LXmBmLYDdMhdSzZg8OXTiOPTQ0Ba2YkUYiUPtX1KWzp1DG+lhh4VEpkGDRapfuUnM3d8xs12AfkCTaNk/gI+rIbZqddxxMHMmjB+vE5DE17t3uNwiedBgzUsmUn3itIndAqwFvor+6qQHHwy/oB98sKYjkWxTctDgxLxkP/0p7LYbtG8f2lXVi1Gk6sUZseNtd3+qIjs3s/2Bk4DmwHXuvtbMrgA2A+7ut1dkv1tJHhfqk0/C+E85ObDvvvDqq2Eww1Im5dpYtIqvPYcN27WgZf8edJ8Jr/AOu/9tI8xsDjfeCP/zP6Fucd260F3xyivhllvCcB2ffAJdu4aLx2bNCo0hY8dCt25hquVNm1JPMZyYdwXgiivCBGF33rltcbC0KaA//DBsk7xuaevFXZZq3eOO25LhjzwyvPbixeF9tWoFf/tbvS7CJgYN/r+/v8EO5w2kof9A4focdlq6AsMpuiuHdXet4oPGO7LjDysAZ1XjHFpuWMXqRlsvq8zz6371exr6Jj645Jy09lnVcVTnNoqjdsZR0W1+TNO8dL575u7lr2D2CvAtsI6QeE6LvXOzccDvgYOAndx9hpnd6u6XJ25L2eZc4FyAjh079ux9zUMATDuvT1ihsDCMrDtjRkgUZuFK5F13DYPbbdwYN7zybbfdtvtq0CBMo1was5CY0tWsWZhe+dtvt+y/5KyYGzeGaZ532AE6dAjLvv02/DVtCnvtFRLj2rVh2Y47hp//yctatgw9VXJyYMmSMJVx8rLSXid5+2bNQsIu69gkx1FW0k417XRFn6+ubeLss7Bwy9w7NWDgoBsAmPbg72ssBpHKyAcK3C3u+imTGICZtQRw99XpBBMlsauBg9k2iY139yvK2z6/fXvf6+oHoFEjpp28T0heDzwQLtApS8OG4cScfIJftSokvKVLi0/QG4tWsaJoEz/asHTbfZSXwEpLVonnEtslJ4fyTnwrV257wqtoMqxuTZuG0lriuMoWyT9CVqxg42Zn6Q85NFi5im8z/Ev7vKgkdsOj99SbX/yKo3bGUdFtDvfCTR/4d7HH9Y1TErsW2D16uNjdR8feuVlP4ARCdeJnwF+ASwEHNrv7HeVtn2/me/1hGnTowLQFj4fuXwmJRLHzztC4MWzYEBLX1KnQunXKqrbCQjjv5EJ6zRpLL97kk6Zd+dVZzWnRpnlojb/4YujVCz77LOz/ggtCEh05MgzVkNhvoprxzjvhuuvCBUQlq+nK8sYbW1d/vvVWqJYcMyb0908kvhJVoaxaBbvssnWV6YoVIZkeeCAUFGy7LLmKc82a0Dc8eVlpr5O8/bvvQp8+8NFHW7pu9u69pWT85JNbXrM+l8Q6dEhvau4qNvBvrwNJNRciWcbM5rh7fuz1YySx4hKTmY1z92GVjDG2rUpi068P/ZmbNYMzz6z0ZF3jxoV80adPqIW8/371JJPspyQm2S7dJBanyNbKzM6I7udULKwK2mWX0F60YUMYQgPCqLxV8Ct3yJAtt7o4VUQkO8XpYn8eUBj9nZfZcMqwZEkoOh18cJUksLI654mISHZJNezUOEL7VaKnSD8g66d/nDx5yySWw6qtclRERKpaqurECSUeV3+3uQ0bwu2IEVU2Em9idI7jjquS3YmISA1JlcROZMs4iUZIYtVbElu2DBYtgh4tqqzu74knwugc/furJCYiks1SJbFpQOPqCKRMu+wSbof8rMp2qZKYiEjdUG7HDndfCvQHlgE3AkOqIaatNWoUrr2pZCmssDD0DUmM1vTMM6FEJiIi2StOF/suwM+Af0S3WWnCBBg1Cp5+Ooxxd9hhW7rZi4hIdorTxX4HQtf6lwgjb1SvDRvCQLOVHAJ83bpwu3BhuD34YHWvFxHJdnGS2PmEqsTuwGUZjaY0y5aFSZoSo71XUPMo/S5aBP36VVlHRxERqUFxqhPvJEyC2ZgwuvxZGY2opCro2JEoxHXqFIZCbNRIpTARkbogThL70N3vBDCzMRmOZ1tV0LFj8uTQHjZsGMybF8YFFhGR7BcniQ00s67Ruvua2Vh3z6pROzROoohI3RQnif0641FkWJs2uqhZRKQuitOx4wTgWndfBJwe3YqIiNS4OElsL2BxdL9lBmPJmMSFzpXspS8iIrVMnCTmQDMz68KWcRSzSmLU+kr20hcRkVomTpvYLcCFwG+BazIbTik2bAjXihXuU+FeGckdO0REpO5ImcTc/XPg6mqIpXTFFzsvqnDvDHXsEBGpm+JUJ9asXXaBPfescDFK7WEiInVXrCRmZjWX7Cp5sbPaw0RE6q44bWIQZni+MJOBZIraw0RE6q5yk5iZtQR2AlqaWUcobiMTERGpcamqCbsBg4HO0e3gzIZT9VSdKCJSd5VbEnP32cBsM9vF3UdXU0xVStWJIiJ1V9wOG1MzGkVZNm4ME2Ju2FAjLy8iIrVbrI4d7v5qpgMpVWFhuEasEhLViaBrxURE6pq4vRNrRps24RqxxMSYFaDqRBGRuqt2J7HttgvXiFVQYWEoiWkeMRGRuilVF/tHCAMAAxjg7n5axqOqIhMmhBmd166FkSNrOhoREalqqXonngpgZrmAufv71RKViIhIDCmrE83sNqAoun+uu1+S6aAqq7AwlMLWrYMRI2Do0JqOSEREMiFOm9gmd/8jgJmNzXA8VSJRjQihR6Law0RE6qY4SWw7MxsR3W+WyWCqyrp1W+6/+27NxSEiIpkVZz6xS6M2Mdx9Xjo7N7P9gZOA5sB17r42Wn4hkBN26WPSjjqF5s3D7d57h1KZiIjUTXHaxC4D7gEeMrMFabaJDQJ+DxwEHA7MAHD3v5hZY+COUl7vXOBcgI4dO7JXGi+WMHQotGihrvUiInVdnOrEjsAAYCxwTHkrmll/ILkbxe5s6aKfvF5T4E/ADSWfc/dJwCSA/Pz8bbaNQzM5i4jUD3HGTlwPHAfMppSElMzdZ7r7KYk/4HxgJHA88IKZnR9NsDkN+J6QHEVERCokTpvYNUkPr4LirvaTYmw7B5iTtGhidHt8OkGKiIiUJu4o9iVVfDBDERGRKlLRJCYiIlLjKprEvqrSKMqi+cRERKQcqQYAHse2AwAPd/e/ZTwyqJL5xEREpO5K1bGj5KXCFeryXmFVMJ+YiIjUXeVWJ7r7IkInjmHACEJ3+eqTmE+sUaPYmxQWwrhx4VZEROq2OG1i5wArCQnss0wGUxUmT4bhw8OtiIjUbXFG7PgKaApsBnbObDiVN2TI1rciIlJ3xUliU4EfgOHAC5kNp/I05JSISP0RpzpxT3f/JBr49/tMByQiIhJXnCTWL+l+30wFIiIikq441YltzeznhO71u2Y4HhERkdjilMQuAfYFOgOXZjYcERGR+MpNYmZ2GvCbaL0G0f1aTdeJiYjUH6mqExew9TiJ1TtiRwUkrhMD9VIUEanryk1i7j7HzK5x9z8DmNkoYFa1RFZBuk5MRKT+SDUA8CPAT8wsL1r0Q8YjqiRdJyYiUn+kKomdamZ93f2V6gpIREQkrji9E88ysxvMbPeMRyMiIpKGlNeJuftgM9sDuMvMNgB/cveCjEcmIiKSQsqSmJmdCowmjJt4AbpWTEREaok41YkbgTPc/TZ3X0aYW6xW0jViIiL1S6reieOiu33MDAB3H57poCpK14iJiNQvqdrEJpR4XKsvdtY1YiIi9UuqLvaLzOxA4LdA82jxmRmPqoJ0jZiISP0Sp03sHGAlMBL4LJPBiIiIpCNOEvsKaApsBnbObDgiIiLxxZlPbCphuKlhhG72IiIitUKcktgKoCfwDrBDZsOpHHWxFxGpX+IksZuBtcAytp6WpdZJdLGfPLmmIxERkeoQpzqxwN2fyngkVUBd7EVE6pc4SexkMzscWAe4u5+W4ZgqTF3sRUTqlzgDAPetjkBERETSlTKJmdlZwGnRug3dvX+mgxIREYkjTseOPOB1d/858Ew6Ozez/c1sjJmNN7MWScvNzMaZ2WVpRZuCeieKiNQvcZLYSqCxmf0G2D/N/Q8ijPQxAzg8aflFwKOlbWBm55pZgZkVLF++PK0XU+9EEZH6JU7Hjj8TBv49Gvh9eSuaWX9gaNKi3SkxaLCZ7QTsA/wI6Gpmf3X37xPPu/skYBJAfn5+WgMOq3eiiEj9kmoqlt8B97n7cuCxaNnPAHP3f5dc391nAjOTtu9JKIk1B0aY2fnAJHe/NJot+oTkBFZZ6p0oIlK/pCqJzQCuMrN9gE3ABuBhooSWirvPAeYkLZqY9NxC4Lb4oZavsDBUIw4ZEpKZiIjUfamSWB4wyt1XV0MslaIJMUVE6p9USewrYLiZ7QgsAJ52908yH1b61B4mIlL/pJoU8xXgFQAz6wQca2b7uPsl1RFcOtQeJiJS/6TsYm9m+WY2jDCj80rgukwHVRG6RkxEpP4pN4mZ2SSgN/Aa8CAhiY02syMyH1p6dI2YiEj9k6o68dwSi+YDT2YunIpTm5iISP2T6jqxRwgXK1u0qFaPYi8iIvVLqpLYqdUVSGWpi72ISP0TZxT7cwjjHjrwkrtPTLFJjVB1oohI/RNn7MRuiSpEM7sts+FUjEbrEBGpn+IksR3NrF90f6dMBlMRhYUwaBC88AKsXQsjR9Z0RCIiUl3iTMVyGdAl+rssk8FUxIQJIYGJiEj9EyeJHUIYuLcLYX6wWumww2Do0NTriYhI3RGnOvFg4Fvg38BBmQ0nfUOHQosWag8TEamP4pTEOhCqEZ8nXtKrVokxE5XARETqnzhJ6QygibuvMbM/A5jZAHd/PrOhiYiIlC9lSczdN7j7muj+smhx74xGJSIiEkOc6kQREZFaqaJJzFKvIiIiklmpBgA+uuQyd38GuDFjEYmIiMSUqmNH2xKPHcDdv89MOCIiIvGVW53o7vcBTwBrqyccERGR+OK0iY0HjieUwg7LbDgiIiLxxblO7GvA3P0fZtY+0wGJiIjEFSeJvQxsMrMZwLzMhiMiIhJfnCT2qbv/F3jOzDpnOiAREZG44rSJnZ10/4xMBSIiIpKuOCWxtmbWhHCB8y4ZjkdERCS2OEnsNuDu6P6tmQtFREQkPalG7OgEfM+WETo84xGJiIjElKokNgDYmS1jJTowOqMRiYiIxFRuEnP3v5nZr9z9AQAzU8cOERGpNVJVJ14EHGVmrQilsZ8D91VDXCIiIimlqk58H9iRcJHzZmB6xiMSERGJKdUAwC8DPwaau/sr7v5VOjs3s/3NbIyZjTezFknLB5rZMDM7tWJhi4iIxL/Yua2ZPWRmlyYnoxgGASOBGcDhSct/C6wpbQMzO9fMCsysYPny5Wm8lIiI1DdxklgOsCfwLbAMuKesFc2sv5lNT/wB/Sm9W34Td/8rWyc2ANx9krvnu3t+27YlpzMTERHZIs7Fzr8D7nL3TwHMbHFZK7r7TGBm4rGZ9SSUxJoDI8zsfGAS8D9mdimwtKKBi4iIpOqdeDTwIvBjM/sxgLs/E3fn7j4HmJO0aGJ0e0uacYqIiGwjVUmsZH2eRuwQEZFaI1XvxPuAJ4C11ROOiIhIfHE6dowHjieUwg7LbDgiIiLxxenY8TVg7v4PM2uf6YBERETiipPEXgY2mdkMwsgdIiIitULKJObuz5jZzsClqGOHiIjUIimTmJndCxQBGwlJ7JpMByUiIhJHnOrE9919fMYjERERSVOcJHa8me1F1M3e3YdnNiQREZF44iSx05Puq01MRERqjThJbBfCqPPNo8dnZi4cERGR+OJc7HwOsJIwkO9nmQxGREQkHXGS2FdAU8LMzj/KbDgiIiLxxalOnAr8AAwH/p3ZcEREROKLc7Hz/OjuJRmORUREJC1xqhNFRERqpdhJzMz6ZjIQERGRdMVpE0s4EXglU4GISHbYsGEDX3zxBevXr6/pUCSLNW3alPbt29OoUaNK7SedJPZIpV5JROqEL774gpYtW7LHHntgZjUdjmQhd6eoqIgvvviCTp06VWpfsasT3f31Sr2SiNQJ69evJycnRwlMKszMyMnJqZLSvDp2iEjalMCksqrqM5QyiZnZLmY20MxON7PTU60vIlLX7bHHHhQWFgJw0EEHVXp/U6ZMYejQoRV+3WHDhpGbm8uwYcNYvnw5Bx54ID169OCVV7buxtC/f386d+5MXl4eeXl5TJ8+HYCGDRsWL8vLy2Py5MnF9xs3bkzXrl3Jy8vj6quvrvR7rWpx2sRuAR4kDD0lIpLVNm7cyHbbpdMdoHyvvfZale2roq87adIkVqxYQcOGDXnooYfo2rUrd999d6nbTZ06lfz8/K2WNWvWjLlz5261bMiQIUBInC+99BJt2rSp2jdQReJUJ77t7k+5+3Pu/lzGIxIRKcfChQvZb7/9OOecc8jNzWXAgAF89913AMydO5fevXvTrVs3TjzxRL755hsglEAuu+wy8vPzuf322+nfvz+XX345+fn57Lfffrz99tucdNJJ7LPPPlx77bXFr3XCCSfQs2dPcnNzmTRpUqnxbL/99gBcf/31xaWXdu3aFSeBf/7zn/Tq1Yu8vDzOO+88Nm3aBMDkyZPZd9996dWrF7Nnzy5130VFRQwYMIDc3FzOPvts3LdMJJJ43eOOO441a9bQs2dPbrrpJoYPH86//vUv8vLyio9Lnebu5f4RutU/Teid+HCq9avyr2fPnn7axNf8tImvuYikVh3fl/nz56e9zfLl7mPHhtvK+uyzz7xhw4b+7rvvurv7qaee6vfff7+7u3ft2tVnzpzp7u7XXXedX3rppe7u3q9fP7/ggguK99GvXz8fPny4u7vfdtttvuuuu/qXX37p69ev93bt2nlhYaG7uxcVFbm7+7p16zw3N7d4+e677+7LozfTokWLreL75ptvvEuXLl5QUODz58/3Y4891n/44Qd3d7/gggv8vvvu8y+//NI7dOjgX3/9tX///fd+0EEH+UUXXbTNe7344ot91KhR7u7+1FNPOVDq6ybfnzx5cqn7Srzvfffd17t37+7du3cvfj8NGjQoXnbCCSdstU3ye61qpX2WgAJPI0/EGXaqr5m1jO6vzmA+FZE6avJkGB5NpztsWOX316lTJ/Ly8gDo2bMnCxcuZNWqVaxcuZJ+/foBcMYZZ3DqqacWbzNw4MCt9nHccccB0LVrV3Jzc9l1110B2HPPPVm8eDE5OTnccccdPP744wAsXryYjz/+mJycnDLjcnd+85vfcMUVV9CzZ08mTJjAnDlzOOCAAwD47rvv+NGPfsSbb75J//79adu2bXFsH3300Tb7mzVrFo899hgAxxxzDK1bt077WJUUtzoxW6RMYmZ2LbB7dH+xu4/OeFQiUqdENWvFt5XVpEmT4vsNGzaMVW3WokWLUvfRoEGDrfbXoEEDNm7cyMyZM3nhhRd4/fXXad68Of3790/ZJXzkyJG0b9++uCrR3TnjjDO44YYbtlpvxowZKeOVeOK0ie3k7ue4+zlAy0wHJCJ1T5s2oQSWyb4BO+64I61bty7ukXf//fcXl8oqYtWqVbRu3ZrmzZvz3//+lzfeeKPc9Z988kleeOEF7rjjjuJlP//5z5k+fTpff/01ACtWrGDRokUceOCBvPzyyxQVFbFhwwYeeaT0sSQOPfRQHnjgAQCeffbZ4jY+2SJOF51WZnZGdL/scrSISA277777OP/881m3bh177rknkydPrvC+jjzySCZOnMh+++1H586d6d27d7nrjx8/niVLltCrVy8gVFeOHj2aMWPGMGDAADZv3kyjRo2466676N27NyNHjqRPnz60atWquGq0pBEjRjBo0CByc3M56KCD6NixY4XfT11lntTbpdQVzBoBA6KHz7v7hoxHFcnPz/e9zrkTgGnn9amulxXJWgP/FgbWyeT35YMPPmC//fbL2P6l/ijts2Rmc9w9v4xNtlFuSczMLgN2AxKXVvcjTI4pIiJS41JVJ04DdgLWRI+3z2w4IiIi8ZXbscPdlwInu/sid18E/Lp6whIREUktVXXiI8BPzKxLtOirzIckIiIST7lJzN1PNbNcd59XkZ2b2f7ASUBz4Dp3XxstHwcsA9q7++UV2beIiEic68T6mNlzZvZvM5uZ5v4HASOBGcDhScu3I7SvFZXcwMzONbMCMytYvnx5mi8nIiL1SZwk1h143d1/DjxT3opm1t/Mpif+gP5AaX34F7n7KGDHkk+4+yR3z3f3/MSQLCIitUk2T8WSPORUQUEB/fv3LzOG/v37U1BQUPzaffv23er5vLw8unTpQk2Kc7HzSqCJmf0G2L+8Fd19JjAz8djMehJKYs2BEWZ2PjAJ2NPMLgUqP62niEga6vtULF9//TXPPvssRx11VNqvuXr1ahYvXkyHDh344IMPKhx7VYpTEvsTMApYB6Q1I5q7z3H369z9Sndf4+4T3X2zu1/i7re7+3UVCVpE6i9NxbL166Y7FcuwYcP405/+lNYxTzjttNOYNm0aAA8++CCDBg2q0H6qUrlJLOqAMTr66wNcWB1BiUgdU1gI48aF2yrw8ccfc9FFFzFv3jxatWrFo48+CsDpp5/OTTfdxHvvvUfXrl0ZNWpU8TY//PADBQUFXHnllQA0btyYgoICzj//fI4//njuuusu3n//faZMmUJRUWiuv/fee5kzZw4FBQXccccdxctLM3r0aObOncvMmTPZaaedGDp0KB988AHTpk1j9uzZzJ07l4YNGzJ16lSWLl3KiBEjmD17Nq+++irz588vdZ+jRo3ikEMOYd68eZx44ol8/vnn26zzxBNPFI9Cf9VVVzF69GgGDhzI3Llzadas2Tbr9+nTh8aNG/PSSy/FP+CRk08+uXhU/SeffJJf/OIXae+jqqUqU0+g9DYtEZH4qnguFk3FUjnXXnstY8aM4aabbipeZmalrpu8PCcnh9atW/PQQw+x33770bx58yqJpzJSdbFfZGaTCYnMotszqyMwEalDqnguFk3FUjk/+9nPuPbaa7camT8nJ2ebUfJXrFhBmxJTDwwcOJCLLrqIKVOmVEeoKcVpEzsfuAC4Evgws+GISJ1UDXOxaCqW9Fx77bWMHTu2+PEBBxzA7NmzWbZsGRB6Ln7//fd06NBhq+1OPPFEhg8fzhFHHFFlsVRGnC46DaPbjYTBgEVEaiVNxRLf0UcfTfJlTDvvvDO33347Rx99NJs3b2b77bfnwQcfpEGDrcs6LVu25KqrrqqyOCorzlQsierE74HH3f356ggMNBWLSLo0FYtkk4xPxRIZ6+4fRDvfN70QRUREMidOm9hZSfcHZygOERGRtMUpibU1s6bR/V0yGYyIiEg64iSx24C/R/dvzVwoIiIi6Uk1n9hPCB06bowW6cJnERGpNVKVxBKXuycnr9EZikVERCQt5XbsiKZL+RPwLPAySSPUi4jUNo888gj77bcfP/3pTwEYNGgQ3bp149Zb02sJWblyJX/5y1+KH3/55ZeccsopVRprTfvzn/+c1vpTpkzhyy+/TPt1ZsyYUebYkFUhTu/Eu4DrgX5A5Qc9ExHJkHvuuYe///3vvPTSSyxbtoy3336b9957j8svT28C+ZJJbLfddmP69OlVHW6NcHc2b95cLUls48aNtSKJrQb+z91HA7MyFomISEylTW8yevRoXn31Vc466yyGDRvGgAEDWLJkCXl5ebzyyissWLCAI488kp49e9K3b1/++9//AvDVV19x4okn0r17d7p3785rr73G1VdfzYIFC8jLy2PYsGEsXLiwePLH3r17M2/evOJYEhNHrl27ljPPPJNevXrRo0cP/vWvf20T99KlSzn00EOLJ5NMDJGVmFYFYPr06QwePBiAwYMHc/7555Ofn8++++7LU089BYSEcvzxx9O/f3/22WefrUbrHz9+PF26dKFLly7cdtttQJi+pnPnzpx++ul06dKFs846i++++468vDx+/etfbxXjpk2bGDx4MF26dKFr167ceuutTJ8+nYKCAn79618XT/EyevRoDjjgALp06cK5555bPE1M8rQ3N910E0888QTDhg0jLy+PBQsWVObf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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "data": { "image/png": "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w7KmjNkXUbITmwE/Ax4Of1YqGn5KJL1GPvUBC7/+PqXH/OlRBzP8l01LXR8/vUn16tW54oormDx5MjfddBMvvvgid911F0VFRVx55ZX06NGDBQsWAME4huPHj+e4447jjTfe4IorruDFF1/kqquuonPnzsyYMYMdO3awYcMGbr/9dt5///3ifRctWlT8/n379uXRRx9l5MiRLF++nOXLl1NUVMT111/Pz372Mx588EHWrl1L27ZtOe2003YbePgf//gHp59+On/4wx/YsWMHmzZtSno+Fi1axJtvvsnnn3/OKaecUlyzfPPNN3n//fepWbMmJ5xwAr/4xS8wMyZOnMgbb7yBu3PiiSfSuXNn6tSpw6effspDDz1UPHzWY489Vvz54q1atYqbb76ZWbNmUatWLe644w7GjBnDTTfdBEBBQQFvv/02f/nLX7jrrru4//77i6eMuemmm/jXv/7FAw88kPRzRRGlEDuYILX+v4EeKXnXLKIbnkUqn/jpTQA2b97M4YcfXuY+GzZs4NVXX6V3797Fy7Zu3QrAiy++yMMPPwwEI+IfcsghZQ6026dPH7p168bIkSN59NFHi/vKnn/+eZ588knuuusuALZs2cKSJUt2G2bphBNO4MILL2Tbtm2cffbZpY6ZmPh+eXl5HHfccRx77LHFtZ+uXbuSnx/c3turVy9eeeUVzIyePXsWF5y9evXi5Zdf5swzz+SYY45JOv4jwOuvv87ChQvp2LEjEMzD1r79rmHRevXqBQRT4MTmFpszZ07x81ROGROlELsMOBFoCVydknfNIqqJiaRXWTWmdIlNb3LbbbdF3mfnzp0ceuihJdY8yuvoo48mPz+f9957j2nTpjF+/PjiuB5//HEaN25c6r4nn3wyc+bM4V//+hf9+/dnyJAhnH/++bvN2ZU43UviPF+x16UtL03iVDSlcXe6du3KlClTSlwfm7Ym6hQ4+yLKiB1/JijETgbGpzWaDFCGokjlU9r0JmU5+OCDadSoUfGUJ+7Ou+++W3y8//3f/wVgx44drFu3jtq1a7N+feljovft25fRo0ezbt06WrRoAcDpp5/On//85+L+oHfeeWeP/RYvXswRRxzBJZdcwsUXX8zbb78NBCPIf/jhh+zcuZMZM2bsts9jjz3Gzp07+fzzz/niiy+KC8l///vfrFmzhs2bNzNz5kw6duxI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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Absolute difference at end of effective support: 1.5355037730591353e-16\n", "Absolute difference at end plus epsilon of effective support: 1.5355037718705112e-16\n", "Absolute difference at start of effective support: -0.000102235039464336\n", "FFT grid points (output):95.0\n", "NUM grid points (output):188.0\n" ] }, { "data": { "image/png": "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wYIF1K1bl65du3LSSSdhZkyZMoX33nsPd6d79+706dOHRo0a8cUXX/DII4/Eus+aMWNG7PXFmz9/PitWrGDBggVAUCpt2LAh9913X+zYAlxxxRXccsstAJxzzjm88MILsaFZioe9gWDYnP79+6esOjZKEtufoGn9b4D+KYlCRCSi+OFNALZu3coBBxxQ4TqbNm3i7bffZtCgQbF527dvB+D111/n0UcfBYIe8Rs0aFBhR7uDBw+mX79+jBkzhqeeeip2cX7llVd47rnnuPPOOwHYtm0bX3/9dYlulbp27coFF1xAYWEhp512Wrl9JpbeX40aNTjssMNo06ZNrAR53HHHkZ0d/HT39NNP56233sLMGDBgQCxxnn766bz55puccsopHHrooQn7fwRo06YNX375Jb/97W856aST6NevX5nLzZ49m/Hjx7NlyxbWrVtHTk5OLImVN7RMKkRJYpcA3YGOwNUpjUZEMkpFJaZUKW94k4oUFRXRsGHDMkseyWrWrBnZ2dl8+umnTJ8+ncmTJ8fievrpp2nbtm256x5zzDHMnTuXf/7znwwdOpRrr72Wc889t8SYXaWHeyk9zlfx4/Lml6f0UDTladSoEZ988gkvv/wykydP5qmnnuLhhx8uscy2bdu47LLLyM/Pp0WLFowePbpE3FH3VRmi/Nj5zwRJ7BhgcmrDERGpWHnDm1Rk//33p3Xr1rEhT9ydTz75JLa9//mf/wGC+0EbNmygfv36bNxYfn/nQ4YMYfz48WzYsIEOHToAcPzxx/PnP/85dm/o448/3mW9ZcuWceCBBzJs2DAuuugiPvoo6P/hwAMPZPHixRQVFfHss8+WWGfGjBkUFRWxZMkSvvzyy1iS/N///V/WrVvH1q1bmTVrFkcddRS9e/dm1qxZbNmyhc2bN/Pss8/Su3fvMl9DVlYWhYWFu8xfu3YtRUVFDBw4kHHjxsVijD8mxQmrSZMmbNq0qcJGL4mO5Z6KksT+5e73uPsEYFXKIhERieCII46IDW/SoUMHjjvuOFatSnxpmjZtGg899BAdO3YkJycn1vDinnvuYfbs2bRv357OnTuzaNEisrOzOeqoo8jNzWXEiBG7bOuMM87gySefZPDgn0amuvnmmyksLKRDhw7k5ORw880377LenDlz6NixI506dWL69OlcddVVANx+++3079+fXr16cfDB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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "data": { "image/png": "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AzB37ly6du1Khw4d6NOnD59//jkQSiCXXXYZJSUl3H777fTs2ZPLL7+ckpISDjvsMF599VVOO+00DjnkEK666qrS9zr11FPp3Lkzbdu25e677y4znt122w2Aa665prT0sv/++5cmgb/85S906dKF4uJifvrTn7J582YAxo0bx6GHHkqXLl2YNWtWmcdesWIFvXv3pm3btlxwwQWkT3Scet+TTz6ZNWvW0LlzZ2688UaGDh3K3/72N4qLi0vPS6Gq80lMRPLD8uVw003hsTq89957XHzxxbz11lvsueeePPTQQwCcc8453Hjjjbzxxhu0b9+eESNGlO7z9ddfM3v2bH7xi18AsPPOOzN79mwGDhzIKaecwtixY3nzzTcZP348K1asAODee+9lzpw5zJ49mzvuuKN0fVlGjhzJ3LlzmTFjBnvttReDBg3inXfeYdKkScyaNYu5c+dSv359JkyYwJIlSxg2bBizZs3i+eef5+233y7zmCNGjOA73/kOb731Fn369GHhwoXbbfPoo4+WlqSuuOIKRo4cSd++fZk7dy677rrrdtv/+Mc/Lk22qd9n/fr1pev69OkT86+QvDp/n1h6FfPy5apSFMmVceNCrQjAkCE7frzWrVtTXFwMQOfOnVmwYAGrV69m1apV9OjRA4Bzzz2XM888s3Sfvn37bnOMk08+GYD27dvTtm1b9t13XwAOOuggFi1aRLNmzbjjjjt45JFHAFi0aBHvvfcezZo1Kzcud+fss89m8ODBdO7cmTFjxjBnzhyOOOIIICSLvffem5dffpmePXuSavvv27cv//3vf7c73syZM3n44YcBOPHEE2natGmlz1WmuNWJ+aDOJ7GiImjcOPzzNG5cPf88IlJ5Uc1a6eOO2mWXXUqX69evH6varHHjbWcHSB2jXr162xyvXr16bNq0iRkzZjB9+nRefPFFGjVqRM+ePbN2ER8+fDgtWrQorUp0d84991yuv/76bbabOnVq1nhF1YkAnHwynHBCeBSR3CgqCl8ik6wN2WOPPWjatGlpj7w///nPpaWyqli9ejVNmzalUaNGvPvuu7z00ksVbv/YY48xffp07rjjjtJ13//+95kyZQqfffYZACtXruSjjz7iyCOP5Nlnn2XFihVs3LiRyZMnl3nMY445hr/+NXTmfuKJJ0rb+OqKOl8SA3j0UfjHP6BnT5XE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S5cuHHvssdsMPPzXv/6V4447jl//+tds3ryZdevWZT0fCxYs4JVXXmH+/Pl897vf5f333wfglVde4c0336RRo0YcccQRnHjiiZgZ48aN4+WXX8bdOfLII+nRowdNmzblvffe47777isdPmvy5Mmlv1+65cuXc+211zJ9+nQaN27MjTfeyOjRo7nmmmsAKCoq4rXXXuN3v/sdN998M3/6059Kp4y55ppr+Pvf/84999yT9feKI04S253Qtf5/gJOq8B7lpVsv4/EQ4NdAfeCHbN+xBDO7CLgIqNYxwjKpc4dI4Uqf3gRg/fr17L333hXus2bNGl544QXOPPPM0nVfffUVAE8//TT3338/EEbE32OPPSocaPess86id+/ejBgxggcffLC0rWzatGk8+uij3HzzzQBs2LCBhQsXbjPM0hFHHMF5553Hxo0bOfXUU8sdMzHz/erVq8chhxzCQQcdVFr66dWrF82ahdt7TzvtNJ5//nnMjD59+pQmztNOO43nnnuOk08+mQMPPDDr+I8AL730Em+//TbduoUKs6+//pqjjto6FNppp50GhClwUnOLzZw5s3S5OqeMiZPEBgJHEkpNl1Xy+A8Aw4FGwIdmVg9YaGaXAQuA14EfmdmVwDTCIMOXApuAMiuX3f1u4G4IYydWMp7YVBITqR4VlZiSUt70JhXZsmULe+65Z5klj8raf//9adasGW+88QaTJk3irrvuKo3roYceok2bNuXue8wxxzBz5kz+/ve/079/fwYPHsw555yzzZxdmdO9ZM7zlXpe3vryZE5FUx53p1evXkycOLHM11PT1tSvX59NmzbFOmZVxRmx405CEjsGuKsyB3f3Oe5+tbv/wt3HuPsWd7/V3W9z9zui50Pc/Xp3/6e7z4yeX+nuc6ryC1WXAQNg2DBYu1Y9FEUKTXnTm1Rk9913p3Xr1qVTnrg7r7/+eunxfv/73wOwefNmVq9eTZMmTfjyy/LHRO/bty+jRo1i9erVdOjQAYDjjjuOO++8s7Q96N///vd2+3300Ufss88+XHjhhVxwwQW89tprQBhB/p133mHLli088sgj2+wzefJktmzZwvz58/nggw9Kk+S//vUvVq5cyfr165k6dSrdunWje/fuTJ06lXXr1rF27VoeeeQRunfvXubv0KBBAzZu3Ljd+q5duzJr1qzSasu1a9fy3//+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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Absolute difference at end of effective support: 7.071296606724871e-17\n", "Absolute difference at end plus epsilon of effective support: 7.071296601905168e-17\n", "Absolute difference at start of effective support: 0.00025869831221902485\n", "FFT grid points (output):134.0\n", "NUM grid points (output):225.0\n" ] }, { "data": { "image/png": "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/BMRyUgzZsygQ4cOHHnkkQCcfvrpdOrUiTvuuCOt7axfv56//vWviccrV67ktNNOq9BYq9qf/vSntJafOnUqK1euTHs/s2bNYuHChWmvF1WqJDYN+Ev4d3f4X0QkI9177738/e9/55VXXuGrr75i7ty5/Otf/+LKK69MazvFk9jBBx/MzJkzKzrcKuHu7Nq1q1KS2I4dO6o2ibn7KqA/8BVwM1AxHZ+JiJRDScObjB07ljfeeIPzzz+fkSNHMmDAAFasWEF+fj6vv/46ixcv5he/+AVdu3alb9++fPzxxwB8/fXXnHzyyXTu3JnOnTvz5ptvcvXVV7N48WLy8/MZOXIkS5cuTQz+2KtXLz766KNELIUDR27evJnzzjuPHj160KVLF/75z3/uFveqVas44ogjEoNJFnaRVTisCsDMmTMZOnQoAEOHDuXCCy+kW7duHHLIITz99NNAkFB++ctf0r9/f9q1a8eYMWMS699+++3k5eWRl5fHxIkTgWD4mvbt23P22WeTl5fH+eefz9atW8nPz+eMM84oEuPOnTsZOnQoeXl5dOzYkTvuuIOZM2cyb948zjjjjMQQL2PHjqV79+7k5eUxYsSIxDAxycPe3HLLLTz55JOMHDmS/Px8Fi9eXJ63vURRmtjnAT8DHgj/i4gAMOapj1i48j8Vus1DD96fG07ILfX5RYsWMW3aNObMmUONGjW4+OKLeeihh7j++ut5+eWXufXWW+nWrRuXXHIJAwcOZP78+UDQj+GkSZNo164d77zzDhdffDEvv/wyl112Gf369eOJJ55g586dbNq0iZtvvpkFCxYk1l26dGli/0OGDGH69OmMGTOGVatWsWrVKrp168Y111zDz372M+677z7Wr19Pjx49+PnPf16k4+GHH36YY445hj/84Q/s3LmTLVu2pDweS5cu5d1332Xx4sUceeSRfPbZZwC8++67LFiwgNq1a9O9e3eOP/54zIwpU6bwzjvv4O707NmTfv360bBhQz799FPuv//+RPdZM2bMSLy+ZPPnz2fFihUsWLAACEqlDRo04O67704cW4BLL72U66+/HoCzzjqLp59+mhNOOAGA7777LjEi9KeffsrAgQNjq46NksT2J2ha/ytgYCxRiIhElDy8CcDWrVs54IADylxn06ZNvPnmmwwaNCgxb/v27QC8/PLLPPDAA0DQI379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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "data": { "image/png": "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ffv2ZcOGDQDMnz+fkpISunTpQr9+/fjyyy+BUAK54oorKC4u5o477qBPnz5ceeWVFBcXc8ghh/Daa6/Rv39/DjroIK699tqy9zrttNPo0aMHHTt25J577qkwnl133RWA66+/vqz0su+++5Ylgb/85S/07NmToqIiLrnkErZsCbfJTpw4kYMPPpiePXsyZ86cCo+9atUq+vbtS8eOHbnwwgtJnug48b6nnHIKa9eupUePHtxyyy0MHz6cv//97xQVFZWdl3zV4JOYiOSGlSvh1lvDY2147733uPTSS1mwYAF77LEHjz76KADnnnsut9xyC2+++SadO3dm1KhRZft89913lJaW8stf/hKAnXfemdLSUoYMGcKpp57K3XffzVtvvcWkSZNYtWoVAPfddx/z5s2jtLSUO++8s2x9RUaPHs38+fOZNWsWe+65J0OHDuXtt99mypQpzJkzh/nz59O4cWMefPBBli1bxogRI5gzZw4vvvgiCxcurPCYo0aN4qijjmLBggX069ePJUuWbLfNY489VlaSuvrqqxk9ejQDBgxg/vz57LLLLtttf/bZZ5cl28Tvs2HDhrJ1/fr1i/lXyLwGX52YXMW8cqWqFEWyZeLEUCsCMCz1xpsaaN++PUVFRQD06NGDxYsX89VXX7FmzRp69+4NwHnnnceZZ55Zts+AAQPKHeOUU04BoHPnznTs2JHvf//7ABxwwAEsXbqUgoIC7rzzTqZNmwbA0qVLee+99ygoKKg0LnfnnHPO4aqrrqJHjx6MHz+eefPmceihhwIhWXzve9/jlVdeoU+fPrRu3bostnfffXe7482ePZu//e1vAPz0pz+lVatW1T5XqeJWJ+aCBp/ECguhRYvwz9OiRe3884hI9UU1a2WPO6pp06Zly40bN45VbdaiRfnZARLHaNSoUbnjNWrUiM2bNzNr1ixmzpzJyy+/TPPmzenTp0/aLuIjR46kTZs2ZVWJ7s55553HTTfdVG676dOnp41XVJ0IwCmnwEknhUcRyY7CwvAlMpO1IbvvvjutWrUq65H35z//uaxUVhNfffUVrVq1onnz5rzzzjvMnTu3yu0ff/xxZs6cyZ133lm27ic/+QmPPPIIX3zxBQCrV6/m448/5rDDDuP5559n1apVbNq0ialTp1Z4zKOPPpq//vWvADz11FNlbXwNRYMviQE89hg8+ST06aOSmEh9d//99zNkyBDWr1/PAQccwMSJE2t8rBNOOIEJEyZwyCGH0KFDB0pKSqrcfuzYsXz66af07NkTCNWVo0eP5oYbbqBv375s3bqVJk2acPfdd1NSUsLIkSM5/PDD2WOPPcqqRlONGDGCgQMH0rFjR4444gjatm1b498nH1lyT5Z8U1xc7LUxn9iiRXDVVTB2LHToUAuBiWRIvswn9vbbb3PIIYdkOwzJQxV9dsxsnrsXV7S9SmJsK4kB3H+/OneIiOQLtYkRGpJPOikksh2oWRARkTqmkhih5DU2mvhFnTtERPKHSmKRRJXiY49lOxIREYlLJbHIKafArFkqiYmI5BOVxCIqiYmI5B8lscjgwTBiBKxbV3tjt4lIw5XPU7EkDzlVWlpKnz59Ko2hT58+JG51ateuHb169Sr3elFREZ06dYr/i1ZTrOpEM2sN7AYscfdNGYsmizT8lIgkNPSpWL744gueeuopTjzxxGq/5zfffMPSpUvZb7/9ePvtt2sce1xVlsTM7BIz+zNwI3AJMMnMfm9m7TMeWRZo+CmR+kFTsZR/3+pOxTJs2DBuvPHGap3zhLPOOospU6YAMHnyZAYOHFij48SVrjrxNXf/d3e/2N2Hu/vZwDDqaYcQtYuJZFEtz8WiqVi2qe5ULIcffjg777wzzz33XPwTHjn99NPLRtV//PHH+dnPflbtY1RHlUnM3V83s73NbICZnWtm57r7Ond/L6NRZYlKYiJZlJiLpZZGHIg7Fcvs2bPL9okzFUvTpk3LpmIBuPPOO+natSslJSVlU7FUJXUqlmeeeaZsKpaioiKeeeYZPvzww3JTsey8887bxZYwe/ZszjnnHKD2pmIBuPbaa7nhhhvKrTOzCrdNXl9QUECrVq146KGHOOSQQ2jevHmtxFOZOB07fgesAz6PfuotlcREsmjwYBgzptbmYkmdimXz5s1p99mRqVjeeOMNunXrVuOpWObPn8/8+fNZtGgRI0eOjPtrZsyPf/xjNmzYUG5k/oKCgu1GyV+9ejWFKWP1DRgwgEsvvTTjVYkQL4m95u5PuPvT7v50xiPKIvVQFMmiOpiLRVOxVM+1117LmDFjyp4feuihzJkzh+XLlwOh5+K3337LfvvtV26/fv36MXz4cI4//vhai6Uycdq2Tjez44D1gLv7WRmOKWsS/zuJKvIc+DIkIrVMU7HEd9JJJ5XNLA2w1157cccdd3DSSSexdetWdt11VyZPnkyjRuXLQy1btuTqq6+utTiqEmsqFjNrCeDu32Q8omqoralYko0cGZLYiBFKYpJ7NBWL1He1PhWLmV0L7B8tL3X30bURaK4aOBBeey08iohIbovTJranu1/k7hcBLTMdULapc4eISP6I0ya2h5mdFy0XZDKYXDB4cOjYkejcoQkyRURyV5yS2CXAyujnksyGk32J4adGjdIEmSIiua7KkpiZ3Qo4kLiTrTcwPNNBZZumZRERyQ/pqhPHpzxP35WxHki0i/Xpo4GARURyWbrqxH7ApdHP0OgnNjPrbmY3mNlYM2sRrbvKzK4ws8vNrJGZ3WZmvzGz46PXDzOzike6rCMafkqk/po6dSqHHHIIxxxzDAADBw6kS5cu3H777dU6zpo1a/j9739f9vyzzz7jjDPOqNVYs+23v/1txo6dPGXMjkiXxKYAd0c/46PH6hgIjASmA8dF6/Zz93FAO6Ar8Ka73wicYGZto3WvVXZAM7vYzErNrHTFihXVDCeeREnsqqs0codIfXPvvffyxz/+keeee47ly5fz2muv8eabb3LllVdW6zipSWyfffbhkUceqe1ws8Ld2bp1a0aTWG1JNwDwMqAPsBy4GajJoGaVVUF6BY8nAy2AbmZW4Vgw7n6Puxe7e3HyneS1afDgUBJ78kl17hDJVxVNbzJ69GhefPFFLrjgAoYNG0bfvn359NNPKSoq4oUXXuCDDz7ghBNOoEePHvTq1Yt33nkHgM8//5x+/frRtWtXunbtyksvvcSvfvUrPvjgA4qKihg2bBiLFy8um/yxpKSEBQsWlMWSmDhy3bp1nH/++fTs2ZNu3brx97//fbu4ly1bxtFHH102mWRiiKzEtCoAjzzyCIMGDQJg0KBBDBkyhOLiYg4++GCeeOIJIExgeeqpp9KnTx8OOuigcqP1jx07lk6dOtGpUyfGjRsHhOlrOnTowLnnnkunTp244IIL2LBhA0VFRZx99tnbxTljxgwOP/xwunfvzplnnsnatWuBUMIaMWIE3bt3p3PnzmXnsKopY3ZEnC72nYAfAw9Ej9XxEKEk1hz4yMwaAUvM7ApgMfAG8HMzuwaY4e7/C2Bm+7v789V8r1pTWAhjx4ZlVSmK7JhRjy9g4Wdf1+oxf7TPboz4WcdKX0+e3qRJkyb84he/4MEHH+T666/n2Wef5bbbbqO4uJhLL72Uk08+mfnz5wNhHMMJEyZw0EEH8corr/CLX/yCZ599lssuu4zevXszbdo0tmzZwtq1a7n55pt56623yvZdvHhx2fsPGDCAhx9+mFGjRrFs2TKWLVtGcXExv/71r/nxj3/Mfffdx5o1a+jZsyfHHntsuYGH//rXv3L88cfzm9/8hi1btrB+/fq052Px4sW8+uqrfPDBBxxzzDG8//77ALz66qu89dZbNG/enEMPPZSf/vSnmBkTJ07klVdewd057LDD6N27N61ateK9997j/vvvLxs+a+rUqWW/X7KVK1dyww03MHPmTFq0aMEtt9zC2LFjuf766wEoLCzk9ddf5/e//z233XYbf/rTn8qmjLn++uv5xz/+wb333pv294ojThLbjdC1/t8IJaXY3H0eMC9ldWrF83ZdJ9z9iuq8Tyaoc4dI/kqe3gRgw4YNfO9736tyn7Vr1/LSSy9x5plnlq379ttvAXj22Wd54IEHgDAi/u67717lQLtnnXUWffv2ZdSoUTz88MNlbWUzZszgscce47bbbgNg48aNLFmypNwwS4ceeijnn38+mzZt4rTTTqt0zMTU92vUqBEHHXQQBxxwQFnp57jjjqOgINze279/f1588UXMjH79+pUlzv79+/PCCy9wyimnsP/++6cd/xFg7ty5LFy4kCOPPBII87Adfvi2odD69+8PhClwEnOLzZ49u2y5NqeMiZPEhgCHEdqqrqiVd80D6mYvUjuqKjFlSmJ6k5tuuin2Plu3bmWPPfaosORRXfvuuy8FBQW8+eabTJkyhQkTJpTF9eijj9KhQ4dK9z366KOZPXs2//jHPxg0aBBXXXUV5557brk5u1Kne0md5yvxvLL1lUmdiqYy7s5xxx3H5MmTK3w9MW1N3ClwdkScm53vIiSxo4EJGY0mh6hzh0j+qmx6k6rstttutG/fvmzKE3fnjTfeKDve//zP/wCwZcsWvvrqK1q2bMk331Q+JvqAAQMYM2YMX331FV26dAHg+OOP56677iprD/rXv/613X4ff/wxe+21FxdddBEXXnghr7/+OhBGkH/77bfZunUr06ZNK7fP1KlT2bp1Kx988AEffvhhWZL85z//yerVq9mwYQPTp0/nyCOPpFevXkyfPp3169ezbt06pk2bRq9evSr8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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Absolute difference at end of effective support: 5.354164888797333e-17\n", "Absolute difference at end plus epsilon of effective support: 5.354164885422862e-17\n", "Absolute difference at start of effective support: 2.221382123186317e-05\n", "FFT grid points (output):211.0\n", "NUM grid points (output):328.0\n" ] }, { "data": { "image/png": "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zKwhgLuvS8VONRSLyK7TUCyS7VIxFEvCkpiZXQe0DqeXufu4ZAMVERFJhyj3xJq6+3B3Hw40THdAIiIiUUW5J9bYzM4Jp3PSGYyIiEgyopTELiQYtXl1OC0iIlItVFgSM7PbAQeKf+3WFxid7qBERESiSFSdOLHU48RNGUVERKpIourEgcAl4d+l4Z+ISLU0Y8YMOnTowC9/+UsATj/9dDp37sxdd92V1HbWrFnD3/72t9jjFStWcNppp6U01ky75ZZbklp+ypQprFixIun9zJo1q9y+IVMhURKbDtwX/k0M/4uIVEsPPvgg//jHP3j99df59ttv+eCDD/j000+58sork9pO6SS2//77M3PmzFSHmxHuzo4dO6okiW3bti2zSczdVwL9gG+BW4HUdHwmIrILyhreZNy4cbz11lucf/75jBo1iv79+7N8+XLy8vJ48803Wbx4Mb/5zW/o1q0bffr04bPPPgPgu+++Y+DAgXTp0oUuXbrw9ttvc80117B48WLy8vIYNWoUS5YsiQ3+2KtXLxYsWBCLpXjgyA0bNnDeeefRs2dPunbtyr/+9a+d4l65ciVHHXVUbDDJ4i6yiodVAZg5cybDhg0DYNiwYYwcOZLu3btz0EEH8dxzzwFBQjn55JPp168fBx54YIne+idMmEDHjh3p2LEjd999NxAMX9O+fXvOPvtsOnbsyPnnn8+mTZvIy8vjjDPOKBHj9u3bGTZsGB07dqRTp07cddddzJw5k/z8fM4444zYEC/jxo2jR48edOzYkREjRsSGiYkf9ua2227jmWeeYdSoUeTl5bF48eJdedvLFKWJfUfgV8Aj4X8REQDGPruAhSt+TOk2D9l/L248Mbfc5+OHN6lVqxYXX3wxU6dO5YYbbuC1117jjjvuoHv37lxyySUMGDCAefPmAUE/hpMmTeLAAw/kvffe4+KLL+a1117jsssuo2/fvjz99NNs376d9evXc+uttzJ//vzYukuWLIntf+jQoTzxxBOMHTuWlStXsnLlSrp37861117Lr371Kx566CHWrFlDz549+fWvf12i4+HHHnuMY489lj/96U9s376djRs3JjweS5Ys4f3332fx4sX88pe/5D//+Q8A77//PvPnz6devXr06NGDE044ATNj8uTJvPfee7g7hx12GH379qVJkyZ88cUXPPzww7Hus2bMmBF7ffHmzZvH8uXLmT9/PhCUShs3bszEiRNjxxbg0ksv5YYbbgDgrLPO4rnnnosNzVI87A0Ew+YMGDAgbdWxUZLYXgRN638LDEhLFCIiEcUPbwKwadMm9t577wrXWb9+PW+//TaDBw+OzduyZQsAr732Go888ggQ9IjfqFGjCjvaHTJkCP3792fs2LE88cQTsYvzyy+/zDPPPMMdd9wBwObNm/n6669LdKvUo0cPzjvvPIqKijjllFPK7TOx9P5q1KjBgQceSLt27WIlyGOOOYacnOCnu6eeeipvvfUWZsbAgQNjifPUU0/lzTff5KSTTqJ169YJ+38EaNeuHV9++SW/+93vOOGEE+jfv3+Zy73++uuMHz+ejRs3UlhYSG5ubiyJlTe0TDpESWIjgcOALsAVaY1GRLJKRSWmdClveJOK7Nixg8aNG5dZ8khWixYtyMnJ4dNPP2X69OlMmjQpFteTTz5J+/bty133qKOOYs6cOTz//PMMGzaMq666irPPPrvEmF2lh3spPc5X8ePy5pen9FA05WnSpAmffPIJL730EpMmTeKJJ57goYceKrHM5s2bufjii8nPz6dVq1aMGTOmRNxR95UKUX7s/FeCJHYUMCm94YiIVKy84U0qstdee9G2bdvYkCfuzieffBLb3v/8z/8Awf2gtWvX0rBhQ9atK7+/86FDhzJ+/HjWrl1L586dATj22GP561//Grs39PHHH++03tKlS9lnn30YPnw4F1xwAR999BEQ9CC/aNEiduzYwdNPP11inRkzZrBjxw4WL17Ml19+GUuS//u//0thYSGbNm1i1qxZHHHEEfTp04dZs2axceNGNmzYwNNPP02fPn3KfA21atWiqKhop/mrV69mx44dDBo0iJtuuikWY/wxKU5YzZo1Y/369RU2ekl0LHdVlCT2b3e/x91vB1amLRIRkQgOOeSQ2PAmnTt35phjjmHlysSXpqlTp/Lggw/SpUsXcnNzYw0v7rnnHl5//XU6depEt27dWLhwITk5ORxxxBF07NiRUaNG7bSt0047jccff5whQ34amer666+nqKiIzp07k5uby/XXX7/TerNnz6ZLly507dqV6dOnc/nllwNw6623MmDAAA4//HD222+/EusccMAB9OzZk+OOO45JkyZRt25dAHr27MmgQYPo3LkzgwYNonv37hx66KEMGzaMnj17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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "data": { "image/png": "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x478+c9/ZtCgQfzzn/+koKCg5LzkLHevNbeOHTv61li0yP2kk9zBffjwrdqVSEadNeotP2vUWzUdRplmzZpV4W0WLQr/d4sWbf3xv/nmG69bt65/8MEH7u5+5pln+mOPPebu7oceeqhPmTLF3d1vvPFGHzBggLu7d+/e3S+99NKSfXTv3t0HDRrk7u533XWX77XXXv7999/7mjVrfJ999vHi4mJ3d1+8eLG7u69atcpbt25dsn6//fbzRdGb2XHHHTeLb+nSpd6mTRufMWOGz5o1y08++WT/+eef3d390ksv9UceecS///5733fffX3hwoW+du1aP+KII/zyyy/f4r1eccUVPnToUHd3f/755x0o9bjJy6NHjy51X4n3fdBBB3m7du28Xbt2Je+nTp06JetOO+20zbZJfq9bq7TPDjDDy/jeV3Vikvx8GDEiLJ9ySs3GIrKtSdSEAAwcuPX7a9GiBQUFBQB07NiR2bNn8+OPP7Js2TK6d+8OwLnnnsuZZ55Zsk2fPn0228cp0RfBoYceSuvWrdlrr70AaNmyJXPnziUvL4977rmHZ555BoC5c+fyn//8h7y8vDLjcnfOPvtsrrnmGjp27MjIkSOZOXMmhx12GACrV69m9913591336VHjx40adKkJLZ///vfW+xv6tSpPP300wD86le/onHjxhU+V6niVidmAyWxFGPHwosvwmGHwZAhNR2NyLYjqlkrud9a9evXL1muW7durGqzHXfcfFaAxD7q1Kmz2f7q1KnD+vXrmTJlCpMnT+btt9+mYcOG9OjRI20X8SFDhtC0adOSqkR359xzz+VPf/rTZq+bOHFi2nhFbWIikiXy80MJLJN9A3bZZRcaN25c0iPvscceKymVVcaPP/5I48aNadiwIZ9//jnvvPNOua9/7rnnmDx5Mvfcc0/JumOOOYYJEyawcOFCAJYsWcKcOXM4/PDDef3111m8eDHr1q1j/Pjxpe7zqKOO4h//+AcAL730Ukkb37ZCJbEUyT1Yi4vVS1GktnnkkUfo378/q1atomXLlowePbrS+zrhhBMYNWoUBx98MK1ataJz587lvn7EiBF89913dOrUCQjVlcOGDePmm2/muOOOY+PGjdSrV4/77ruPzp07M2TIELp06cKuu+5aUjWaavDgwfTt25fWrVtzxBFH0KxZs0q/n1xkntSTJdcV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Cwu5/PLLOfnkk/nwww+BMI7hqFGjOPDAA3n33Xe57LLLePXVV7nyyivp3r07zzzzDBs2bGDFihXceuutfPLJJyXbzp49u+T4ffr04cknn2To0KHMnz+f+fPnU1hYyPXXX88vf/lLHn74YZYtW0anTp049thjNxt4+B//+AfHH388v//979mwYQOrYlT9zJ49m/fee4+vvvqKo48+uqRk+d577/HJJ5/QsGFDDjvsMH71q19hZowePZp3330Xd+fwww+ne/fuNG7cmP/85z888sgjJcNnjR8/vuT9JSsuLubmm29m8uTJ7Ljjjvz5z39mxIgR3HTTTQDk5+fz/vvv85e//IXbb7+dBx98kKFDh3LkkUdy00038cILL/DQQw+lfV9xxEliOxO61v83cHKVHDVHJbraT56sKkWRbJY8vQnA6tWr2X333cvdZsWKFbz11luceeaZJevWrl0LwKuvvsqjjz4KhBHxd9lll3IH2j3rrLM47rjjGDp0KE8++WRJW9mkSZN49tlnuf322wFYs2YN33777WbDLB122GGcf/75rFu3jtNOO63MMRNTj1enTh0OPPBAWrZsWVL66dmzJ3l54fLeXr168eabb2JmnH766SWJs1evXrzxxhuccsop7LfffmnHfwR45513mDVrFl27dgXg559/pkuXTUOg9erVCwhT4Dz9dJiAZOrUqSXLVTllTJwk1h84HGhHmKhym6au9iIVU16JKVPKmt6kPBs3bmTXXXctteRRUfvssw95eXl8/PHHjBs3jlGjRpXE9dRTT9GqVasytz3qqKOYOnUqL7zwAv369eOaa67hnHPO2WzOrtTpXlLn+Uo8Lmt9WVKnoimLu9OzZ0/GljHRYmLamrp167J+/fpY+6ysOBc730tIYkcBozIaTQ4oKgoDAYPaxUSy1THHHMOECRNYuHAhEOa8mjNnTrnb7LzzzrRo0YLx48cD4Yv6o48+KtnfX//6VwA2bNjAjz/+SKNGjVi+vOwx0fv06cPw4cP58ccfadu2LQDHH3889957b0l70AcffLDFdnPmzGGPPfbgoosu4sILL+T9998Hwgjyn332GRs3buSZZ57ZbJvx48ezceNGvvrqK77++uuSJPmvf/2LJUuWsHr1aiZOnEjXrl3p1q0bEydOZNWqVaxcuZJnnnmGbt26lfoe6tWrx7p167ZY37lz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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Absolute difference at end of effective support: 4.143317301568802e-17\n", "Absolute difference at end plus epsilon of effective support: 4.1433172992309144e-17\n", "Absolute difference at start of effective support: 9.785591617741346e-07\n", "FFT grid points (output):406.0\n", "NUM grid points (output):576.0\n" ] }, { "data": { "image/png": "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1o1//etfAHz33Xf06tWLdu3a0a5dO9555x1uuukmli5dSm5uLkOGDGHZsmWxwR87d+7MokWLYrEUDRy5YcMGLr74Yjp16kT79u35xz/+sVPcq1at4oQTTogNJlnURVbRsCoA06dPp3///gD079+fwYMH07FjR4444ghmzZoFBAnlzDPPJC8vj8MPP7xYb/333nsvrVu3pnXr1tx///1AMHzNkUceyYUXXkjr1q255JJL2LRpE7m5uZx33nnFYty+fTv9+/endevWtGnThvvuu4/p06eTn5/PeeedFxviZdSoURxzzDG0bt2aQYMGxYaJiR/25q677mLmzJkMGTKE3Nxcli5dujv/dhGpgqK0TvwYwMz+AaRen5NGI19cxOJv/lOu6zzqwL0Z/tucUt+PH94kKyuLK664gsmTJ3PbbbfxxhtvcPfdd9OxY0euvPJKTj/9dBYsWAAE/RiOHz+eww8/nPfff58rrriCN954g6uvvpru3bvzwgsvsH37dtavX8+dd97JwoULY8suW7Ystv2+ffvy7LPPMnLkSFatWsWqVavo2LEjt9xyC7/+9a95/PHHWbNmDZ06deKkk04q1vHw008/zcknn8wf//hHtm/fzsaNG5Puj2XLlvHBBx+wdOlSfvWrX/Hvf/8bgA8++ICFCxdSr149jjnmGE477TTMjIkTJ/L+++/j7hx77LF0796dRo0a8fnnn/PEE0/Eus+aNm1a7PPFW7BgAStXrmThwoVAUCrdd999GTduXGzfAlx11VXcdtttAFxwwQXMmjUrNjRL0bA3EAybc/rpp1e76lgRCURJYq+5+w/AZDNrmnTuau6f//xnwuFNyrJ+/XreeeedYkOzbNmyBYA33niDJ598Egh6xN9nn33K7Gi3T58+9OzZk5EjR/Lss8/GTs6vvfYaM2fO5O677wZg8+bNfPXVV8W6VDrmmGO4+OKL2bp1K2eddVapfSaW3F6NGjU4/PDDOfTQQ2MlyB49esSGhenduzdvv/02ZkavXr1iibN379689dZbnHHGGbRs2TJp/48QDEXzxRdf8Pvf/57TTjuNnj17Jpxv9uzZjBkzho0bN7J69WpycnJiSazksDciUn1FSWI3An8In18H3JK+cFJTVokpXUob3qQsO3bsYN99901Y8khVs2bNyM7O5tNPP2Xq1KmMHz8+Ftdzzz3HkUceWeqyJ5xwAnPnzuWll16if//+XH/99Vx44YXFxuwqOdxLyXG+il6XNr00JYeiKU2jRo345JNPePXVVxk/fjzPPvssjz/+eLF5Nm/ezBVXXEF+fj4tWrRgxIgRxeKOui0RyXxRrok1jnuevrFMMkRpw5uUZe+99+aQQw6JDXni7nzyySex9f31r38FgutBa9eupWHDhqxbt67U9fXt25cxY8awdu1a2rZtC8DJJ5/MQw89FLs29PHHH++03PLly9lvv/0YOHAgl156KR999BEQ9CC/ZMkSduzYERuEs8i0adPYsWMHS5cu5Ysvvoglyf/5n/9h9erVbNq0iRkzZnDcccfRrVs3ZsyYwcaNG9mwYQMvvPAC3bp1S/gZsrKy2Lp1607TCwoK2LFjB2effTajR4+OxRi/T4oSVpMmTVi/fn2ZjV6S7UsRyWxRktgzZvacmU0Dnk93QFXdUUcdFRvepG3btvTo0YNVq1YlXW7y5Mk89thjtGvXjpycnFjDiwceeIDZs2fTpk0bOnTowOLFi8nOzua4446jdevWDEkwEvU555zDM888Q58+fWLThg0bxtatW2nbti05OTkMGzZsp+XmzJlDu3btaN++PVOnTuWaa64B4M477+T000+na9eusRGmixx00EF06tSJU045hfHjx1OnTtADWadOnTj77LNp27YtZ599Nh07duToo4+mf//+dOrUiWOPPZZLL72U9u3bJ9wfgwYNom3btjs17Fi5ciV5eXnk5uZy/vnnx0q8RY1McnNzqV27NgMHDqR169acfPLJsardRH73u98xduxY2rdvr4YdItVQmUOxmFkdd99pOOHSppc3DcVSufr375+wUcSkSZPIz89n3LhxlRRZ+alux5OGYpFMV95DsdxhZg4sBtYAh4R/k4F5uxqkiIhIeSgzibn7dWbWGOgC7A3MdvexFRKZVLpJkyYlnN6/f//YvWQiIpUpaetEd18NvFQBsYiIiKQkSsMOERGRKklJTEREMpaSmIiIZCwlsXKkoViiS7UX+1QcfPDBFBQUpG39IlJ1KImVIw3FktyuDsUiIpKIktgu0FAs6RuKBYLOjLt06cLRRx/Nueeey/r164GghDV8+HCOPvpo2rRpE9uHhYWF9OzZk5ycHC699FLKuoFfRKqXKB0AV1kaiqX6DcVSUFDA6NGjef3116lfvz533XUX9957b2zYlSZNmvDRRx/xl7/8hbvvvptHH32UkSNHcvzxx3Pbbbfx0ksv8dhjjyX9XCJSPWR0EqsMGoolvUOxvPfeeyxevJjjjjsOCMYG69Ll5y6UevfuDUCHDh14/vmgK8+5c+fGnp922mk0atQo6XZEpHrI6CSmoViq31As7k6PHj2YMmVKwvdr164NBAl/27ZtkdYpItWXromlSEOxpHcols6dOzNv3rxYteWGDRv47LPPSt0XECTnp59+GoBXXnmlzJKsiFQvVT6JFRTA2LHBY1WgoVjSOxRL06ZNmTRpUuz2hC5dusSqMEszfPhw5s6dS05ODs8//zwHHXRQmfOLSPVR5lAsla1xy1Z+81VLGDoUxoyBIUOq39AZVZmGYsk8GopFMl15D8VS6QYMKP4oIiJSpMonsSZNghKYVDwNxSIiVV2VvyYmIiJSmoxMYlX5Op5kDh1HIpkv45JYnTp1KCws1AlIdou7U1hYGGttKSKZqcpfEyupefPmfP311/zwww+VHYpkuDp16tC8efPKDkNEdkPGJbGsrCwOOeSQyg5DRESqgIyrThQRESmS1pKYmR0N9AbqAcPcfUM4vS9wELDM3aelMwYREam+0l0S6weMAGYAPeKmXwCsT/O2RUSkmivXkpiZ5QFXxU1qCSRqRljb3f9qZhOAYiUxMxsEDApfbjGzheUZ4x6gCVBFeprMCNVyfz07OK2rr5b7LI20v1JT+lAcCaS170Qz6wCcRVCdOBw4H5gAXAdsAxq7+/Ayls9PpQ8t0T5LlfZX6rTPUqP9lZpU91dar4m5+3xgftyk8eHjPencroiI7BnUOlFERDJWVU9iEyo7gAykfZYa7a/UaZ+lRvsrNSntryo9npiIiEhZqnpJTEREpFRVqtupRDdHm9n1wA7A3f2BSg2wiillf10BZBPsr9GVGmAVVMo+M2AMsNLd76/M+KqaUvaXOisoQyn7bCzwLdDc3a+r1ACrGDM7ArgFmOHuM8JpFxHcmlDf3UeVtXxVK4klujm6RXhiObhSIqradtpf7v4X4C5APdsmlugYuxJ4rpLiqeoS7S91VlC2RPtsL6ABUFg5IVVd7v4ZMKnE5Fx3vwfAzPYta/mqlsQg8c3RZU3f0xXbL2ZWB7gj/JPEYvvMzBoDhwOnAt3NrHalRVV1lfzu1Xb3v1K8Fx4pruQ+W+7uI4F9KiOYDJb0vF+lqhOBZwh+wdQDvjSzGsBXZnYtsKzywqqyEu2vqcAioCfwSOWFVmUV22fAGne/xswOBs5y9y2VGFtVlOgY+39mdg2wqjIDq8IS7bNDw322uTIDq4rMbH/gHKCume0DvAosMLMbANx9TZnLq3WiiIhkqqpYnSgiIhKJkpiIiGQsJTEREclYSmIiIpKxqlrrRJE9gpnVBe4DDgQaAc2AAe7+ZqUGJpJh1DpRpBKFA8m2Jrh5uICgl4JfAZsImrBnhe/3AboDpwF1gefc/bWKj1ikalF1okjV86q7DwZOcPdbgQ+AHOBqYA1BcutUeeGJVB2qThSpev4TPv4QPv4E1Cb40Tna3bdVSlQiVZCSmEjmeBB41MxWA/nu/nRlByRS2XRNTEREMpauiYmISMZSEhMRkYylJCYiIhlLSUxERDKWkpiIiGQsJTEREclYSmIiIpKx/j9/ZZBAidkGIgAAAABJRU5ErkJggg==", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "data": { "image/png": "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zMKFC1m1ahUrV66ke/fuAFx44YWcffbZJfv069dvm2P07dsXgMMPP5y2bduy//77A9CmTRu+/PJLmjRpwn333cczzzwDwJdffsl//vMfmjQpf5hZd+f888/n+uuvp3PnzowZM4bZs2dz5JFHArB+/Xr22Wcf3n77bXr06EHTpk1LYvv3v/+93fGmTZvG008/DcBPf/pTGjduXOlrlSpudWI+SNfF/nMzG09IZBY9XpSLwPKCeiaK5EymP25169YtWa5du3asarMGDRqUeYxatWptc7xatWqxZcsWpk6dypQpU3jrrbeoX78+PXr0SHuD94gRIzjwwANLqhLdnQsvvJDbbrttm+0mTZqUNl6J1yZ2OXAF8D/A/OyGk2cSo3WoZ6JI1uXi47bHHnvQuHHjkh55jzzySEmpbEesWrWKxo0bU79+fT7++GNmzJhR4fbPPfccU6ZM4b777itZd8IJJ/DUU0/x7bffArB8+XI+//xzjjrqKF577TWWLVvG5s2befLJJ8s85nHHHcdjjz0GwEsvvVTSxldTxOl+Uzt63EIYDLjmUBd7kWrnoYce4vLLL2fdunW0adOG8ePH7/CxTj75ZMaOHcthhx3GoYceSteuXSvc/q677uKrr76iS5cuQKiuvPnmm7nlllvo1asXW7dupU6dOtx///107dqVESNG0K1bN/bcc8+SqtFUw4cPp3///rRt25ajjz6aFi1a7PDvU4jMveImr6TqxI3AM+4+OReB7YiioiKfNWtW5g54xx2hkn7UKLWJSV7p9+e3AJh4WbcqjqRs8+bN47DDDqvqMKQAlfXeMbPZ7l5U1vZxSmKj3H1edKBDdj7EAqI2MRGRvBanTezipOUBWYoj/6gqUUQk78VJYk3NrJ6Z1QP2y3ZAeSPR33cn6stFRCS74lQn3gP8JVq+O3uh5BlVJYqI5L1084n9iNCh4/ZoVc258VmTYYqI5L10JbHErezJyevmuAc3syOAM4D6wDB3Xxutvx7YGh13NGFYqxXALGAecFV0iHsJVZgnAevd/a64595pahMTEcl7FbaJuftIwgDALwGvAVMrefz+wAhgEtAzaX1zd78HaEWY6uUDd78VOBk4k5DYRgNnEUYIWQVssVxOUKQ2MRHZCYU8FUvykFOzZs2iR48e5cbQo0cPErc2tWrVimOPPXab1zt27Ei7du3i/6KVFKdN7H7CTc4zgSOBaeVtaGY9gOTfsCUVV0F6BY+JhLUfMBQ4jzAVzOyUcw4CBgGZvclPbWIiNVZNn4rl22+/5aWXXuKUU06p9DlXr17Nl19+SfPmzZk3b94Oxx5XnN6Jq4H/5+43U0ECA3D3qe5+VuKHMGTVCOBUYIqZXW5mtYAvzOxaYCHwPtDezG4AJgP/IFQnDgaeAv5MGPLqMMoY9srdx7l7kbsXJQbKFJGaTVOxbHveyk7FMmTIEG699dZKXfOEc845h4kTJwIwYcIE+vfvv0PHia284e0TP4QS0HnAP4E/pdu+Kn8yOhXLqFHuEB5F8kx1nIolk3OxaCqWnZuKZebMmX788cf7K6+84jNnzvTu3buXu19i+8Tv/PHHH3u3bt3c3b1jx47+0Ucfedu2bcs8V1kqOxVLnJLYZHd/1N1PBW7KWjbNJ8XFsHYtDB+u6kSRXMlwO3TcqVimTSutYIozFUvdunVLpmIBuO++++jQoQNdu3YtmYqlIp4yFcvLL79cMhVLx44defnll/n000+3mYpl11133S62hGnTpnH++ecDmZuKBeDGG2/klltu2WZded0Sktc3adKExo0b8/jjj3PYYYdRv379jMRTnjhJ7JdJy9dlK5C8Mn48jBwJDRqoZ6JIrmR4JvXUqVi2bNmSdp+dmYrl/fffp1OnTjs8FcucOXOYM2cO8+fPZ8SIEXF/zaz5yU9+wvr167cZmb9JkybbjZK/fPly9k75nuzXrx9XXnll9qsSiZfE9kparhnf6Bn+MIlIDDmYi0VTsVTOjTfeyKhRo0qeH3nkkUyfPp0lS5YAoefixo0bad68+Tb7nX766QwdOpSTTjopY7GUJ073m8fN7B+E+7oeyHI8IiJZpalY4uvduzfJHeb23Xdf7r33Xnr37s3WrVtp2LAhEyZMoFatbctDjRo14pe//GXq4bKiwqlYzKyeu29XNi5vfVXL2FQsmoJF8pymYpHqKtNTsdxmZg7MBVYCraOfR4Gy+3tWB7pHTESkIFSYxNz9OjPbC+gG7A686u535CSyqqLhpkRECkbaNjF3Xw68kINY8kOimy+oKlFEJM9lblyV6kJViSIiBSNOF3sREZG8pCSWSqPXi4gUDCWxVH37Qu/e4VFEqp0nn3ySww47jOOPPx6A/v370759e+6+u3IT169cuZI//vGPJc+//vprzjrrrIzGWtV+97vfZe3YyVPG7AwlsVTPPgsvvhgeRaTaeeCBB/jLX/7Cq6++ypIlS5g5cyYffPAB111XuVH1UpPYAQccwFNPPZXpcKuEu7N169asJrFMURJLpSGnRKqFsqY3ufnmm3njjTe4+OKLGTJkCL169eKrr76iY8eOvP766yxYsICTTz6Zzp07c+yxx/Lxxx8D8M0333D66afToUMHOnTowJtvvsmvfvUrFixYQMeOHRkyZAgLFy4smfyxa9eufPTRRyWxJCaOXLt2LRdddBFdunShU6dO/POf/9wu7sWLF3PccceVTCaZGCIrMa0KwFNPPcWAAQMAGDBgAJdffjlFRUUccsghPP/880CYwPLUU0+lR48eHHzwwYwcObJk/7vuuot27drRrl077rnnHiBMX3PooYdywQUX0K5dOy6++GLWr19Px44dOe+887aLc/LkyXTr1o0jjjiCs88+mzVr1gChhDV8+HCOOOIIDj/88JJrWNGUMTtDvROT6R4xkYwb+dxHzP36u4we80cH7M7w/2pb7uvz5s1j4sSJTJ8+nTp16vDzn/+cRx99lJtuuolXXnmFO++8k6KiIq688kr69OnDnDlzgDCO4dixYzn44IN5++23+fnPf84rr7zC1VdfTffu3XnmmWf4/vvvWbNmDbfffjsffvhhyb4LFy4sOX+/fv144oknGDlyJIsXL2bx4sUUFRXx61//mp/85Cf87W9/Y+XKlXTp0oUTTzxxm4GHH3vsMU466SR+85vf8P3337Nu3bq012PhwoW88847LFiwgOOPP55PPvkEgHfeeYcPP/yQ+vXrc+SRR/LTn/4UM2P8+PG8/fbbuDtHHXUU3bt3p3HjxvznP//hoYceKhk+68knnyz5/ZIVFxdzyy23MGXKFBo0aMDvf/977rrrLm66KUx0svfee/Puu+/yxz/+kTvvvJO//vWvjBw5kh//+MfcdNNNvPDCCzzwQGZGMVQSS6Z7xESqheTpTQDWr1/PPvvsU+E+a9as4c033+Tss88uWbdx40YAXnnlFR5++GEgjIi/xx57VDjQ7jnnnEOvXr0YOXIkTzzxRElb2eTJk3n22We58847AdiwYQNffPHFNsMsHXnkkVx00UVs3ryZ0047rdwxE1PPV6tWLQ4++GDatGlTUvrp2bMnTZo0AeCMM87gjTfewMw4/fTTSxLnGWecweuvv07fvn1p2bJl2vEfAWbMmMHcuXM55phjANi0aRPdupUOgXbGGWcAYQqcp59+GghTxiSWMzlljJJYsr59YepUdeoQyaCKSkzZkpje5Lbbbou9z9atW9lzzz3LLHlUVrNmzWjSpAkffPABEydOZOzYsSVx/eMf/+DQQw8td9/jjjuOadOm8cILLzBgwACuv/56Lrjggm3m7Eqd7iV1nq/E8/LWlyd1KpryuDs9e/ZkwoQJZb6emLYm7hQ4O0NtYsnUqUOkWihvepOK7L777rRu3bpkyhN35/333y853p/+9CcAvv/+e1atWkWjRo1YvXp1ucfr168fo0aNYtWqVbRv3x6Ak046idGjR5e0B7333nvb7ff555+z7777cumll3LJJZfw7rvvAmEE+Xnz5rF161aeeeaZbfZ58skn2bp1KwsWLODTTz8tSZL/93//x/Lly1m/fj2TJk3imGOO4dhjj2XSpEmsW7eOtWvX8swzz3DssceW+TvUqVOHzZs3b7e+a9euTJ8+vaTacu3atfz73/8u91pA9qaMURJLpu71ItXCj370o5LpTdq3b0/Pnj1ZvHhx2v0effRRHnjgATp06EDbtm1LOl7ce++9vPrqqxx++OF07tyZuXPn0qRJE4455hjatWvHkDKaH8466ywef/xxzjnnnJJ1w4YNY/PmzbRv3562bdsybNiw7fabOnUqHTp0oFOnTkycOJFrrrkGgNtvv50+ffpw9NFHs//++2+zT4sWLejSpQunnHIKY8eOpV69egB06dKFM888k/bt23PmmWdSVFTEEUccwYABA+jSpQtHHXUUl1xyCZ06dSrzegwaNIj27dtv17GjadOmPPjggyW3J3Tr1q2kCrM8w4cPZ9q0abRt25ann346Y1PGVDgVS6HZ6alYNAWLFAhNxSIJAwYMoE+fPtvdo/bggw8ya9YsxowZU0WR7ZhMT8VSs2jcRBGRgqIkliwxPbqISIF48MEHy1w/YMCAknvJqjO1iYmISMFSEhORrKhO7e2SGzvynlESE5GMq1evHsuWLVMik9jcnWXLlpX0rIxLbWIiknEHHnggixYtYunSpVUdihSQevXqceCBB1ZqHyUxEcm4OnXq0Lp166oOQ2qArCYxMzsCOAOoDwxz97XR+uuBrYADo4FRwApgFjAPuCo6xL1AJ+AHQD/gxMQxREREsl0S6w/cABwN9AQmReubu/t1ZnY30AH4wN0fjp7/iJDYAM5y93vMrDFwQFkJzMwGAYOAjN0BLiIihSGjSczMegCDk1a1JJS2yuMVPCaPVDkQGF/mAdzHAeMgjNhRqYBFRKSgZXXYKTPrDJxGqE4cDpxPSDjXEBLVVmAM8HtgOfAeMJfSRHgf8BUw1t0vi3G+pUDFo3xWnb2BnZ+LO/sKJU5QrNlSKLEWSpygWHdWS3dvWtYL1WrsxHxmZrPKG/srnxRKnKBYs6VQYi2UOEGxZpPuExMRkYKlJCYiIgVLSSx3xlV1ADEVSpygWLOlUGItlDhBsWaN2sRERKRgqSQmIiIFS8NOZUhZo5OYmRFGI/kqumn7JeBfwP8BXwA3A2uBp9x9Tj7ECTwKnAccCHxHuM3h0Sjmf7j7l7mIs4JY/wJ8BMxz93+Z2QhgNfAt4Wb6nF/TSsR6A1AP+Mbd/5j8fnD3j/IozonAW8Db0U/JiDru/q9cxBknVmAqcAXQAPiBu19UFde0glj7AS2AhcA/qGBkIndflCdxvkS4BapRFOcUqujzH5dKYpnTHxhB+CLtGa27kvDmTVgCNAS2ACcCz0T7nJujGCFNnO6+1N3vISSCvxLu5fuG8KbenMM4oexYlwB1gNrRSC5b3f0PwBFU3TVNGyuAu98G3A0clPR64v2QN3FGz3cj3MuZGFHnVuDkHMYJaWJ1943Re3Up8Kek13N9TaHsWH8GrImWU6/jmYSRiUYDZ+VLnO6+Jorxz8BhVO3nPxYlscwqaWA0s72Ag4HeQHczq+vuA4HbgJ8nbV8VjZIVxmlmdYEm7v61u3/n7hcB91Mad5XECuDuw9z9DuCnKa8nP1ZVQ2+FsUbXegRwS/R66vshVyqM092viRLu+SnbV+l7Fcr8+wMc6e4zo9er6prC9tenrrv/idJkUd4IRblWYZxm1oow4MQdefD5T0vViZnzOOELqj7wGbDS3a+J3hCnAfWjgY93J1SDTAFGAr2Ax/IlTnffaGYXABMBzKw1cA6wP/BEDuPcLlYzq0UoNTYGvnD3FWZWO7qu71J11zRtrNE2/wv8E+hpZpOByyl9P+RNnGb2G6Au8H70c25UFTo5h3HGjfU4YFq03Jiquablxfq/ZnYNsJjtr+NcSqsT78uXOM1sD0Ip7e/A8Wb2MVX3+Y9FvRNFRKRgqTpRREQKlpKYiIgULCUxEREpWEpiIiJSsNQ7USQPmdluhHvKDiD0xmsGDHT316o0MJE8o96JInksmi29HeFm1GLChIXHA+sJXbfrRK+fA3Qn3D+1G2F0hVx3iRfJOVUnihSef7n75cBx7n4j8A7QFrgaWElIbl2qLjyR3FF1okjh+S56XBo9biLcnFwLuMXdcz3kkkiVURITqT7uA/5qZssJg/XmetQSkZxTm5iIiBQstYmJiEjBUhITEZGCpSQmIiIFS0lMREQKlpKYiIgULCUxEREpWEpiIiJSsP4/GoOtxReN9B4AAAAASUVORK5CYII=", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Absolute difference at end of effective support: 2.7801233520634504e-17\n", "Absolute difference at end plus epsilon of effective support: 2.780123350744751e-17\n", "Absolute difference at start of effective support: 1.2761645331994803e-08\n", "The bounds for the linear grid should be:-0.17200000000000004to 0.272\n", "FFT grid points (output):57.0\n", "NUM grid points (output):147.0\n" ] }, { "data": { "image/png": "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t+aZZ55h6tSpPPBAKCl7xRVXMGjQIA466CBmzpzJzTffzLPPPsvSpUv5+9//zh577EGfPn347rvvqFevHuPHj2eXXXYpeM2cnBwmT57MVVddxb///W9WrlzJoYceyujRo7nyyiuZM2cODRo04Nlnn6VRo0acffbZ/PjjjzRs2JBevXoViv/TTz/lsssuY5999uH7778HYMiQIRx11FGMGTOGd955h4svvpj//Oc/LFq0iKysLIYNG1Z1GzgNNLBDRHYoeXkwfHi4LY+ddtqJV155hVNOOYW33nqLl19+mf33358pU6ZwwAEH8NJLLwGwadMmJk6cSM+ePVm2bBmjR4/m0UcfZfjw4bzyyisMHDiQF198EQhdeu+++y59+vRh3Lhxxb7uww8/zD//+U/23HNPrr/+el599VXatGnD22+/zYABAxg1ahQTJkyga9euvPHGGzRv3ny7dQwdOpQJEybwxBNP8M033xR6btiwYZxwwgmMHj2aYcOGccEFF2yXwGbNmlXQnbh69WoABg4cSE5ODn/5y1/Kt0HTLM6lWFoBxwD1ANz96XQHJSJSXk8+CYOiMuXXX1/25Q888EAAWrduXXBu2iGHHAJAly5dmD59Oi1btiyYBrDPPvtQv359dt99d37+859Tp04ddt99d2bPns2WLVu4/vrrmTVrFmvWrOGMM0oeXnDdddfRv39/9ttvPyZOnMgLL7zApEmTyM/Pp1u3bpgZBx98MACdO3febvlVq1bRpk0bAPbdd98y/+9FuxOBYrsTM0mcltj9hAr230V/IiIZq18/uO++cFseySPm3J327dszffp0AKZNm0b79u0BCh0HS16m6PKfffYZ69evZ8qUKfzud7/Dvfg66mPHjqVRo0aceeaZAHTo0IHf/va35ObmMnXqVO666y7atWvHzJkzAZgxY8Z262jSpAnffPMN69ev57///W/5NkANEyeJferur7r7JHeflPaIREQqoHnz0AIrpretXHr37s0XX3xB9+7dmTVrFmeddVaZlu/QoQNz587l5JNP5pNPPilxvsGDBzN16lRycnK455576NWrFwsWLOC4447juOOO4/XXX6d379588MEHnHTSSaxatWq7ddx222306tWL/v37F7TIdnRW0q+CghnM3gPWABsAd/c+VREYQJcuXbz9JSMAGHdZt6p6WYkhZ0wOALl9c6s1DinsnEfD+Ksd8fsye/Zsfv7zn1d3GFLJir6vZjbd3bvEXT5O2amjzaxxdH9tuaIUERFJgzgDO24F9oruL3L3oWmPSkREJIY4x8R2dfdL3P0SoHG6AxIREYkrzsnOTc3swuh+s3QGIyIiUhZxWmKXAXnR32XpDUdERCS+UpOYmV0D3AnkRH93pj0iEZFaIBMLAJsZkydPLlhu9OjRLFiwgPPPP3+7112wYAFmxrRp0wD47rvvyMrKqvKaiqlaYuOAp4CR0d9TaY9IRKQG2bp1a4WWf/DBB6lbt24lRbO9vn370rlzZ5YsWULjxo2ZMmUKM2fO5Oijj+Zvfytc1719+/Y8/PDDsdfduXNnXn75ZQD+/ve/F1QTqUqlJjF3XwKc5e4L3X0hcF7VhCUiUvVyc3Pp2bMnp59+OkceeSTr1q0jPz+fc889l+7du3PuueeSn59Pbm4uvXr1olevXkyaNImOHTty/vnn07FjR55//nlOPfVUOnfuXFC/sE+fPhxzzDGceOKJrFmzptBr5uTkkJ+fz5VXXklOTg6/+MUv6N+/P+7OFVdcwXHHHcepp57K999/z6ZNm/jlL3/JySefzMSJE7eL/9NPP+WQQw6hT58+hQoAT548mUGDBhUUAB40aBDPP/88t956a6HlW7Vqxc4778yXX34Za3vtt99+zJ49G4DJkydXS3mqVN2JfwPOMbMXzexFNDpRRDJdBSsA1+YCwABXXXVVmYr97rfffnz88cfUr1+fevXqxV6usqRqiZ0N9HH3xN/vy7JyMzvEzIaZ2QNm1ihp+nAzG2hmfy5n3CIixUtUAH7yyXItXrQA8Lx58woVAJ47dy5ArALA33//fUEB4O7duzNy5EgWL15c4msnFwCePXs2L7zwAjk5Odx5552sXLmS+fPnxyoAvPPOO5erAHDif5w3b15BS65+/fr8+OOPBc9v3LiRBg0aFDzu3bs3l112Gaeddlq5Xq+i4oxO7GZmk8zsLTPLLeP6zwWGABOAE5KmZwE7AyuKLmBml5rZNDObtnz58jK+nIjUehWsAKwCwHDxxRfz17/+FYCWLVvy9ddfFySy999/vyDRAxx66KF07tyZU045pdyvVxFxkthBwIfufjzwWmkzmlmOmY1P/BFGNBb3ji109zuAJkWfcPfH3L2Lu3dp0aJFjPBERJJUcgXg2lgA+IwzzmDDhg1ASMo33XQTxx57LN27d2fvvffmgAMOKJjXzHj88cfZeeedy/16FRGnAPAfCS2nL4DT3P3XsVdu1hnoDTQEBgPnA48BDwLzgObufltJy6sAcOZSAeDMpALAUtOkvQAw284NOwW4sSzBuft0YHrSpFHR7VVlWY+IiEhxSk1iZjacbd2BBhwODEp3UCIiInGkaomNpPhjWiIiItWu1CTm7gvN7ElCIrPo9qKqCExERCSVOMfELo9uGwGXpDEWERGRMokzxL5u9JcP7J7ecEREMkucwrmleeKJJwru//73ZaoXUW0mTJjAypUrU86X/L+l8tlnn/Gvf/2rImEVK04Se4hwbOxe4B+VHoGISAaLUzi3NMk7+hEjRqQjxEq1devWSk9iW7duTVsSi9OdeJ+7zwYws/LVMRERqQHcnSuvvJI5c+bQoEEDnn322UKFc//zn/+waNEisrKyuPrqq+nfvz9r167l5z//OQ8//DBLly6lX79+/PDDD3Tr1o127doxa9YscnJyGDFiBFdccQVvvfUWp512Gv/85z8BOP7443n99dd58803ue+++8jPz+f222/n5JNPLojr5Zdf5u6772bnnXfmuuuuY9myZeTn53PxxRczZMiQgsuu3HXXXdStW5cff/yR8ePHs2bNGs477zyaNWvGsmXLeP7552nXrh333nsvEydOpF69eowZM4Y2bdpw0EEH0bFjR/bdd1/eeOMNZs+eza9+9Suuv/56AFauXMmZZ56JmdGxY0d69OhR8L/dcsstTJs2jTfeeIONGzcyatQoDj74YHJycujatSuLFy9m/vz5rFixgnfeeYexY8dW2nsWJ4n1B66L7vcFbq60VxcRKaM7XvmCfy9ek3rGUuy/+y4MPv2A7aYniu4+8sgjvP7664waNaqgSO7o0aPJzc1l8uTJDBs2jIEDB3LTTTfRrVs3brjhBj788ENeeOEFrr32Wk488US2bt1KnTp1ePrppwtdY6tevXq0bNmSRYsWsWXLFvbYYw+ysrL405/+xNtvv83WrVvp2bNnoST2v//7v7z44ou0bdsWd+epp4q/Kpa78/rrrzNu3Dgee+wxfv3rX7Ny5Ureffddpk+fzr333suQIUN4++23ef/995k6dSp33303jzzyCN988w0ffPABjRo1Yv78+dx6663ss88+BeueMWMGOTk5DBky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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "data": { "image/png": "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wxEREYkva3eiu78LnOHuy919OfCV5glLREQkt1zdiU8AnzKzodEknXZKRERajaxJzN3PMrMh7r6wuQISERGJK84Q+9Fmdls0b6m7VxU2JBERkXjiDLEfBsx19+OAZwscj4iISGxxkth6oJ2ZfRU4tLDhiIiIxBenO/Gm6H4M8J0CxiIiItIouUYn3krdqaQMGEWGg51FRESaW66W2N1kPh+iiIhIi8o1xH65mU0nJDKL7i9sjsBERERyibNP7JLofm9gXAFjERERaZQ4Saw0ut9BOBmwiIhIqxAnid1D6EbcDvymsOGIiIjEFyeJTXX3NwDM7MACxyMiIhJbnIOd/yvp8fkFikNERKTR4rTEuptZWfS4ZyGDERERaYw4Sex24L7oceqVmkVERFpMrjN2fIowoONH0SQd+CwiIq1GrpbYWdF9cvKaUqBYREREGiXXGTtuMLM2wCFAB9QSExGRViTucWL7AX8DDgP+XNCIREREYoozxH4j8L/uPgUlMBERaUXitMReBTCz3wLvFDYcERGR+OIksefdvQZ42My6FzogERGRuOJ0J16d9PiqQgUiIiLSWHGSWNekx90KFYiIiEhjxelOfNTMfg3sBO4vcDwiIiKx5TpjR5m7Pw88n2b6toJGJiIikkOultjNZubAImA9MDC6PQzMKWxoIiIi2eU6Y8dVZtYVGA10Al5w91ubJTIREZEccu4Tc/d1wO+bIRYREZFGiTM6UUREpFWKMzoxFjM7FDidcKLga919s5l9kzCq0YG7gKnA+0C1u/8xX8sWEZE9Uz5bYucAk4GZwPHRtL7ufjswABgGvObuNwEn5XG52S1ZAscfD5MmwZo1Kj/VmjUweXK4FaJ8EZECynd3YqZLtXiG+3rM7CIzqzaz6pqaml2PZs0aOOUUmDULbr0Vpk7d9TKzlX/mmflNBM1R/plnwg03hFshyp8wAfr0CbcJE/KfKOfNg/79C1f+kiVw5JGw335hOfPmxZt3331zz5+8fvbdF3r1gqFD697/yivhljo9cevVC4YPh6qqsOxk2dZL8nJ79Qoxp75/yRKorITDD09ffmKek09O/1piObfeqj9HUljunpcbMAL4AfATYAIhQV4FXAlcHj2/FfgucFKu8kaMGOG77Prr3aHu1qGD+9y5u16uu/vixe7771+/fHCvrHSvqdn18mtqQlnNXf6g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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "FFT grid points (output):95.0\n", "NUM grid points (output):188.0\n" ] }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "FFT grid points (output):134.0\n", "NUM grid points (output):225.0\n" ] }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAbEAAAEhCAYAAADxtp7yAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAAsTAAALEwEAmpwYAAAu5klEQVR4nO3deXxU5fXH8c+BREBALEJBUBaxuFJAFEUF4y5uBS3aVqkgm9oWsQgKbpEiLhSKPy0iRRoX6oaV4gYUZREXFESKSrWIIIqCGIOIAoGc3x/3JiYhydxJMpkJfN+vV165c+cuZ+7M3DPPc585Y+6OiIhIdVQj2QGIiIiUl5KYiIhUW0piIiJSbSmJiYhItaUkJiIi1ZaSmIiIVFtKYnsYM5tvZv3D6cvMbE4lb7+VmbmZpVVgG5PM7JZCt682sw1m9p2ZHWBmJ5nZ/8LbPSol8GrKzLqa2YfJjqMkZpZhZp9V0b6yzGx0Vewr0Sr6HkrE+7o6UxKLk5mtMbONZla30Lz+ZjY/iWGVyN2nuftZVbnP8Pj8YGZbzCzHzF43s6vMrOC15u5XufufwuXTgfHAWe5ez92/BkYB94e3Z1Rl/JWl0HH4rtDf/RHWczM7NP+2u7/q7oclKMZqnxjMbGSh47vNzHYVuv1+gvd9cvj63mxm2Wb2mpkdV8n72C3hJeN9ncqUxMqnJnBtRTdigT3xObjA3esDLYG7gBuAh0pZtglQGyh8wmlZ7HZkFWkhJsAFYSLO//t9sgPa07j7mPzjC1wFvFHoeB+Vv1xlv9fMbD/geeA+oCHQHLgd2F5Z+5Bo9sQTaFUYC1xvZvuXdKeZnWhmb4ef0N42sxML3TffzO4ws9eA74FDwk9a14RdaFvM7E9m1ib8lPetmT1lZvuE6//EzJ43s6/M7Jtw+qBS4uhjZovC6eHFWgW5ZpYV3tfAzB4ysy/M7HMzG21mNcP7aprZn81sk5mtBs6LepDcfbO7zwQuBa4ws6PDbWaF+2gL5HeV5ZjZK2b2MXAI8FwYZ60Y8fUJPwH/xcy+BjLDdf5sZp9a0E05yczqhMtnmNlnZjY0bFF/YWZ9Cx2zOmY2zszWhs/fokLrnhA+JzlmttzMMqIei2LPy6FmtiDc/iYzezKcvzBcZHn42C+1Yl12FrTwhpnZf8xsa3hcmpjZS+FrZ66Z/aTQ8k+b2Zfhvhaa2VHh/IHAZUD+6+K5cH4zM3smfH19YmaDix2brPB19wFQZqvDzO41s3Xha3ipmXUtdF9m+Lp+JIz7fTM7ttD9Hc3snfC+Jwk+6MR7nEt6r60xszOKxfFYodtRn+O2AO7+uLvvcvcf3H2Ou/8n3E4NM7s5fB1tDB9ng1LiLCum/NdETvg8dbFC7+tw+Vjnmz+F75EtZjbHzBrFcRhTn7vrL44/YA1wBvBPYHQ4rz8wP5xuCHwD9AbSgF+Htw8I758PfAocFd6fDjjwL2C/cP524GWCk3kD4APginD9A4CLgX2B+sDTwIxC8c0H+ofTfYBFJTyGg4H1QPfw9rPAg0Bd4KfAW8Cg8L6rgP+G6zQE5oXxppV1fEqY/ylwdTidVejYtSq+veLbiBFfH2An8IfweNYB/gLMDOOtDzwH3BkunxEuPyo89ucSnOB+Et7/1/AYNidocZ8I1Apvfx0uXwM4M7zdOJ7jEN73OHBTuJ3awMmF7nPg0EK3M4DPim33TYIWbHNgI/AO0DHc1ivAbYWWvzI8BrWACcC7he4reB7C2zWApcCtwD4Er7/VwNnh/XcBr4bH9WDgvcKxlfA4Lyd4vaYBQ4EvgdrhfZnAtvB41gTuBN4M79sHWAtcFz5HvwRyC8dayv76UOj1TsnvtSLPSxjHY+F05OeY4L36NfAw0D3/9VPsuK8Kj2E9gvPFoyW95mPEVGTZ4o+TaOebjwmSbp3w9l3JPo9W5p9aYuV3K/AHM2tcbP55wP/c/VF33+nujxMkgQsKLZPl7u+H9+eG8+5x92/d/X2Ck8Mcd1/t7puBlwhOUrj71+7+jLt/7+5bgDuAU6IGHbYqZgD3uvtLZtaE4E07xN23uvtGgiTwq3CVS4AJ7r7O3bMJTjblsZ7gDReXCPEBrHf3+9x9J8GJcSBwnbtnh8doTLHlc4FR7p7r7i8C3wGHWdDddCVwrbt/7sEn7NfdfTvBCflFd3/R3fPc/d/AkjC20swIP9Hn/w0otP+WQDN33+bui8rYRknuc/cN7v45QVJZ7O7L3H0bQcLvmL+gu0919y3hY8gE2pfWIiBoWTV291HuvsPdVwN/o+hr4Y7wuK4D/q+sIN39sfD1utPdxxEk0sLX9xaFx3MX8CjQPpx/AkHCmRA+R9OBtyMem+JKeq+VJvJz7O7fAicTJJi/AV+Z2czw9QpBK3d8+B7+DhgB/Moqv7s7yvnm7+7+kbv/ADwFdKjkGJIqla4fVCvu/p6ZPQ/cCKwsdFczgk+Rha0l+JSXb10Jm9xQaPqHEm43BTCzfQlO4ucA+d1G9c2sZngyiOUh4EN3vzu83ZLghPGFmeUvU6NQjM2KxVv8sUXVHMgux3qx4qPYdGOCVurSQssbwaf9fF+HCS/f9wSflhsRtGY+LiWOXmZW+OSQTtAyLU0Pd59bwvzhwJ+At8zsG2Ccu08tYzvFxXqt1IOgK5jgQ04vguOSFy7TCNhcwnZbAs3MLKfQvJoEiRLifC2Y2fVAv3A9J2i9FO7K+rLQ9PdA7fAk3wz43N0LVycv7+uupPdaaeJ6jt19JUGrCDM7HHiMoLX7a3Y/D6wlON82oXJFOd8UP871KjmGpFISq5jbCLpyxhWat57gzVBYC2BWodsV+emAoQSfZo939y/NrAOwjOBEXSYzu5GgW6FrodnrCLovGxU7sef7gqDrKF+LeAO2YMRWcyDeFkeU+KDo8dxEcCI/KmypxGMTQUuuDbC8hDgedfcBu60VJ3f/EhgAwQg3YK6ZLXT3VRXddjG/AX5B0P29hqBr+ht+fK0Ufx2uAz5x95+Vsr3810L+oJtSXwvh9a/hwOnA++6eFybsmK/TcD/NzcwKJbIWlPzhIpbij3ErwYecfE0LTZf7OXb3/1pwjXlQOKv4eaAFQTf2BqD4NeyyYop1rohyvtmjqTuxAsKTzpPA4EKzXwTamtlvzCzNzC4FjiQYyVQZ6hOcpHPMrCFBIo3JzLqHcfYMuxXyH8MXwBxgnJntF16QbmNm+V2UTwGDzeygcMDAjVEDDbd3PvAEQR//iqjrxhFf8eXzCLp3/mJmPw3jaG5mZ0fYVx4wFRgfDnCoGV5Ir0XwKfsCMzs7nF/bgkEXJQ6qKYuZ9Sq03jcEJ6r8VtIGgusolaE+wQeArwlOkmOK3V98X28BW8zsBgsGcdQ0s6Ptx2HjTwEjLBhcdBDBdciy9r0T+ApIM7NbCVpiUbwRrjvYzNLN7CKgc8R1Y3mXoFsvPRxI8stC90V+js3scAsGBx0U3j6YoAX2ZrjI48B1ZtbazOoRHPsnS/kgVlZMXxG8Nkp7TST6fJPylMQqbhTBgAMguGYFnE/QYvqa4NPo+e6+qZL2N4HgAu0mgjdM1E9clxJ0Ka20H0coTgrv+y3BxfQPCE6q04EDw/v+BswmaJm8Q3CBOpbnzGwLwSfbmwi+B9a37FXKVFZ8JbmB4KL6m2b2LTCXotdiynI9sILgGkw2cDdQI7wG9AtgJMGJZR0wjLLfQ89Z0RGhz4bzjwMWm9l3BANQrg2vP0Fw3erh8BraJRFjLs0jBF1LnxMcuzeL3f8QcGS4rxlhd/T5BNdMPiF4jU0haMFBMIR8bXjfHILrWKWZTfDa/ChcZxsRu/bcfQdwEUFXXTbBazfK6y6KWwha2t8QPJ5/FNpvPM/xFuB4gudxK8GxfY/gfQ/Bh6FHCUYXfkLw+EtL+mXF9D1Bl/Br4fN0QuEVq+B8k/KsaLeziIhI9aGWmIiIVFtKYiIiUm0piYmISLWlJCYiItWWkpiIiFRbKfdl51r19vd2hx8ae0FJig+/Dur1HnZAQn4dRMpp9VdbATikcd0YS4qktqVLl25y9+Ll/EqVckms7gEHsmTJkmSHIaXIyMoAYH6f+UmNQ4q69ME3AHhyUJckRyJSMWYWV4kxdSeKiEi1pSQmIiLVVsp1J4qIlGTDhg1kZ5fnhxAklTVs2JAmTcpf3F9JTESqhezsbNq2bUvNmjVjLyzVwq5du/joo48qlMTUnSgi1YYS2J6lMp5PJTERkSQ4+eSTARgyZAi7dkX5PduisrKyyMrKKvX+jIyMguWWLl2Ku3PeeefRrVs3tm7dykknnUSvXr2KrNOgQQMyMjLIyMhgwYIFZGZm0r59ezIyMujbty/du3cnIyOjYLnu3bvHHXdlU3eiiEgF5OXlUaNG+dsDEyZMqLxgStCnTx8A1q9fT/369XnhhRd4/fXX6dq1K3fddVeRZdu1a8f8+fMLbs+bN49x48ZxxhlnFFnu5JNPLrJcMimJiYiE5s+fz913301aWhrZ2dnMnj2b2rVr07t3bz7//HOaN2/Oo48+yqJFixg/fjwAV199NcOHD6d9+/YsX76ckSNH8thjj/Hll1/yr3/9i4MOOohLLrmEDRs2UKtWLaZPn85++/34+6AZGRnMnTuXwYMH88EHH5Cdnc1xxx3HlClTuOaaa/jwww+pU6cOjz32GHXr1qVXr15s376dfffdlwsvvLBI/G+//TaDBg3i0EMP5ZtvvgEgMzOTk08+maysLObNm0f//v3573//y7p160hLS2P06NFVd4ATIOW6E91h7FjYtNf8pJuIVKZNmyp2Dtlnn3147rnnOPfcc3n55Zd59tlnOfLII1m4cCFHHXUUzzzzDAA7duxg5syZdO/enY0bNzJlyhQefPBBxo4dy3PPPcfQoUN56qmngKBLb8GCBVxyySU8+eSTJe534sSJ/Pvf/+bggw9m2LBhPP/887Ro0YJXXnmF3//+90yaNIkZM2bQuXNnZs2aRaNGjXbbxqhRo5gxYwZTp07ls88+K3Lf6NGjOfPMM5kyZQqjR4+md+/euyWwFStWFHQnbt68GYChQ4eSkZHBvffeW74DmmAp1xLLzYXhw4PpYcOSG4uIVD9//3vFziFHH300AM2bNycnJ4cvvviCY445BoBjjz2WpUuX0qRJk4J5AIceeii1a9emWbNmHHHEEdSoUYNmzZqxcuVKdu3axbBhw1ixYgXffvstPXv2LHXf119/Pf369ePwww9n5syZPPHEE8yePZudO3fSpUsXzIyOHTsC0KlTp93Wz8nJoUWLFgC0bds27sdevDsRKLE7MZWkXEssPR3uuQf6VuTH7EVkr9W3b8XOIWZWMO3utGnThqVLlwKwZMkS2rRpA1DkOljhdYqv/+6777J161YWLlzI7373O9y9xP1OmzaNunXrctFFFwFw2GGH8dvf/pb58+ezaNEixowZQ+vWrVm+fDkAy5Yt220bDRo04LPPPmPr1q3873//K98BqGZSLomZBZ+eSmgpi4jE1KhR5Z5DevTowfvvv0+3bt1YsWIFF198cVzrH3bYYaxatYpzzjmHt956q9TlbrvtNhYtWkRGRgZ33XUXF154IWvWrOG0007jtNNO46WXXqJHjx68/vrrnH322eTk5Oy2jVtuuYULL7yQfv36FbTI9nRW2qeCZGnY8gjPXrsy2WFIKVQAODXtDQWAV65cyRFHHJHsMKSSFX9ezWypux8bdf2Ua4mJiIhEpSQmIiLVlpKYiIhUW0piIiJSbSmJiYhItaUkJiKSBKlYANjMmDt3bsF6U6ZMYc2aNVx++eW77XfNmjWYGUuWLAGC33tLS0ur8pqKSmIiIhWQl5dXofUnTJiQ0J+Y6dOnD506deKLL76gfv36LFy4kOXLl9O1a1eefvrpIsu2adOGiRMnRt52p06dePbZZwH417/+VVBNpCqlXNkpEZFk2dsLADdt2pR69erx0UcfRTpehx9+OCtXBt/rnTt3blLKU1VqS8zM2ppZlpn1MLNzzewmM7vHAn80syFmdm1l7lNEpIgKVgDemwsAAwwePDiuYr+HH344ixcvpnbt2tSqVSvyepWlUpOYu38EZIU3z3T3O4D3gPbAwe4+AWhVfD0zG2hmS8xsSW5ubmWGJCJ7m/wKwH//e7lWL14A+OOPPy5SAHjVqlUAkQoAf/PNNwUFgLt168b999/P+vXrS9134QLAK1eu5IknniAjI4M77riD7OxsVq9eHakAcL169cpVADj/MX788ccFLbnatWuzffv2gvu3bdtGnTp1Cm736NGDQYMGcf7555drfxUVKYmZWWMza2Nm6ZWwz93qXLn7ZHc/1t2PTU+vjF2IyF6rghWAVQAY+vfvz9/+9jcAmjRpwqefflqQyF577bWCRA9w3HHH0alTJ84999xy768iykxiZjbIzB4F7gAGAVlmNtHMWpeyfFPgl8AFwLtmNhI4ClgOfGpmQ4A1lRe+iEgxlVwBeG8sANyzZ0++//57IEjKI0aM4NRTT6Vbt24ccsghHHXUUQXLmhkPPfQQ9erVK/f+KqLMAsBmdoy7v1NsXl2gmbsnpM6/CgCnNhUATk0qACzVVUULAJc5OtHd3wlbV6cAtcJ5jwB7xw/ViIhISotyTWwcsBXYEP6JiIikhCjfE3vb3Z9PeCQiIiJxipLELjazM4HvAXf3SxIck4iISCQxk5i7dzWz+uH0lsSHJCIiEk3Ma2JmdjMwHhhvZrcmPiQRkdQRpXBuWaZOnVow/Yc//CERIVa6GTNmkJ2dHXO5wo8tlnfffZd33nkn9oJxijKwo6G7D3D3AUD9So9ARCSFRSmcW5bCJ/r77rsvESFWqry8vEpPYnl5eQlLYlGuie1vZleE0wdUegQiIinC3Xcrujt8+PASC+dee+219OvXjy1btnDEEUcwceJEvvzyS/r27csPP/xAly5daN26NStWrCAjI4P77ruPq6++mpdffpnzzz+ff//73wCcfvrpvPTSS8yZM4d77rmHnTt3cuutt3LOOecUxPXss89y5513Uq9ePa6//no2btzIzp076d+/P5mZmQU/uzJmzBhq1qzJ9u3bmT59Ot9++y2XXXYZBxxwABs3buTxxx+ndevW3H333cycOZNatWqRlZVFixYtaN++Pe3ataNt27bMmjWLlStX8stf/pJhw4YBkJ2dzUUXXYSZ0a5dO84444yCx3bTTTexZMkSZs2axbZt25g0aRIdO3YkIyODzp07s379elavXs3XX3/NvHnzmDZtWqU9Z1GS2CDgrELTIiJJc/tz7/PB+m8rtI0jm+3HbRcctdv8/KK7DzzwAC+99BKTJk0qKJI7ZcoU5s+fz9y5cxk9ejRDhw5lxIgRdOnShRtuuIE33niDJ554guuuu46zzjqLvLw8atSowSOPPFLkN7Zq1apFkyZNWLduHbt27eKggw4iLS2NP//5z7zyyivk5eXRvXv3Iknsn//8J0899RStWrXC3Xn44YdLfFzuzksvvcSTTz7J5MmT+dWvfkV2djYLFixg6dKl3H333WRmZvLKK6/w2muvsWjRIu68804eeOABPvvsM15//XXq1q3L6tWrufnmmzn00EMLtr1s2TIyMjLIzMzE3QuSWf5jO+mkkxgxYgSrVq3itttuK0hUPXv2pEuXLmRlZRUk3spUZhIzs7EEtQ7zi4GdAgyv1AhERFJEftHd2bNns3PnTrp0Kb0CysqVK7nxxhsxM7777js6d+7MRx99xB133AEUra1Y3EUXXcT06dPJy8vj4osvZtOmTaxcubLgp0w2btxYkCgAbrrpJkaPHs3OnTu56aabdqvPmC+/OHCHDh0KWnrt2rUjLS2NDh06sGrVKtasWcPPf/5zICj2e/vttwNBeay6deuWGnO3bt1YsGABl112Geeccw69e/cucv+jjz7KtGnTqFGjRpH4SipUXJlitcTuL3a79BpVIiJVoKQWVGXJL7o7dOhQAHJzc/n8889LXfbyyy8vOEnv3LmTV199lTfffJMzzjijoCVW+ISer3v37vTs2ROA3//+96Snp9OuXTtmz55NzZo1yc3NLbJey5YtmTJlCq+//jrjx4/n7LPPZsWKFQCsWLGCU089FaCgOPDy5csLChW/99577Nq1q2Beq1atCpYrraBxenr6br82vWvXLkaNGgUESbJ3795FYpw4cSLLli3j448/ZsCAAQXz87ebnp5epBp+ZYmVxHoCzcJpI0hiaomJyB7pwgsvZPDgwZx22mkADBkypKDVUtzIkSMZOHAgmzdvpkaNGkyZMoUbb7yRK664gtGjR3PiiScyZswYDj74YC6++OKCFhpAnTp12H///UlLSyv4Da4//vGPnH766ZgZRx55JH/9618Lls/MzOTNN9/ku+++Y9y4cXTq1ImxY8fy9ttvk5b242k8PT2dc845h23btvHMM8+wZcsWfvrTn9KjRw+++uorpk2bRtOmTTn11FM58cQT2WeffUrsmjz77LO55ppr6NWrF1dddRUAb731FiNHjiQ3N7egxdi5c2d69OjB0KFD6dy5M926daNbt24lHq8TTjiBPn368N5771XqAJdYBYAPBPYpPM/d11ba3kugAsCpTQWAU5MKAEvh63X51qxZw80338xjjz2WxMjKVtECwGUOsXf3L4AM4EvgLqB8P9AjIiKSAFFGJx4NnAY8Ev4XEZEUk5GRUTDUPl+rVq1SuhVWGaJ82Xk/gqH184B9ExuOiIhIdFFaYlcBxwPtgSEJjUZERCQOUVpi9xEksW7ApMSGIyIiEl2UJPahu9/r7mOBLxIdkIhIKlEB4PJbs2YNffr0qXhAZYiSxC41s8lmNhXIMLN7EhqRiEgKUQHg1BblmthlCY9CRCQFqABw6QWAIagfmf/l6HvvvZdjjjmGdu3a0a5dO95//30efvhhOnTowK233sq8efM48sgjE/6cRUliPYCj3X2Amd3i7n9KcEwiIqVSAeDkFADetGkTM2fOZOHChXzzzTdceeWVzJgxg40bNzJ16lSWLl3Kww8/TJMmTXjrrbd49dVX+cc//sGcOXMq9FzFEiWJtQHWhdP6PTER2WOpAHDpBYBXr17N8uXLC+o05jv00EOpXbs2zZs3Jycnh7Vr1xZsv1OnTimRxByoY2ZH82MdRRGRpFAB4OQUAG7dujXHHXcc06dPLzg2wG4JtWXLlgWxLVu2rKzDXSmiJLFxwDVAb2BkYsMREUkeFQAOlFQAuHHjxgWjNGvWrMlpp53GLbfcstu6Bx54IJ06daJr1660b9++HM9CfMosAJwMKgCc2lQAODWpALCoALCIiEg1E6U7ETOr4e55iQ5GRETKRwWAy1b8F55FRESSrsyWmJnVBxoC9c2sBYC7f1oVgYmIiMQSqyX2c6APcFj4v09iwxEREYku1i87v+butwNL3X2Uu4+qorhERKrc/Pnzufnmm4HkFuudNWsWL7zwQpF58+fPJzMzs8Lb7tOnD2vWrKnwdlJFpIEdwLSERiEikmIqs1hv/hefoy5buOSUlC1SEnP3RYkOREQklZx88sksWrSIjIwMOnXqxMKFC7nqqqvo168fixcv5oYbbiA3N5f+/fvTt29f7rzzTmbNmsW2bduYNGkSHTt2JCMjg86dO7N+/foiowQnTZpEVlYWp5xyCosXL2b+/PlFlj3jjDMKCvxeeeWVfPrppzRt2rRILUOAr776arcixJmZmaxevZr169fTqlUrpkyZwieffMKvfvUrmjRpQk5OThUfycSK2hITEUkJQ2YN4d0v363QNjo07cCEcyZEXv7yyy9nzJgxnHnmmfTr149bb72VmTNnUr9+fc4880wuu+wyrr32WkaMGMGqVau47bbbmDYt6MDq2bNnkRqMO3fuJCsri9dee40lS5awePHigvvyl83KygLgrbfeombNmsydO5cxY8awY8eOInHddddduxUhhqCG4iOPPMJZZ51FTk4OY8eOZfz48Rx//PFVUkWjKiUsiZnZBUAXYH9gA/AdUFfX1USkujn66KNJT08v6BJcvnw5F154IRBUd//qq694/vnnmTZt2m71EvNrK+bbtGkTLVq0oGbNmnTo0KHIfcWXXb16dUFR306dOhUkqXwlFSHOjxegWbNmbN68uWA7aWlppZbRqq5iDbF/mqAAMIAB7u6XRNz2DwTD82sD+7v77WZ2q5nt7+45xfYzEBgIUO/ANnGELyJ7m3haUJWleBHfjh07Mn36dOrWrUtubi7p6elMnDiRZcuW8fHHHzNgwICCZYtfC2vUqBHr1q0jLy+P//znP0XuK75s69atmTdvHlByMd2SihCvWLFit6K8rVu3Zvny5XTu3LmgOO+eoswk5u69AMzsKII6i+/Fse3DgN8DJwET8jdZyn4mA5MhqJ0Yxz5ERKrc7bffzgUXXIC707BhQ5555hk6d+5Mt27d6NatW5nrpqWlccUVV3DiiSfSpUsX0tPTS132+OOP54EHHuD000+nZcuWtGjRosj9JRUhLsn111/Pb37zG5o0aUKTJk3if8ApLGYBYDObAHwd3mzs7oMjbdjsUuAIoAHwLtAI2DfWj2qqAHBqUwHg1KQCwNXLzp07SUtLY/HixUydOpUHH3ww2SElTUULAEe5JrYrP/GY2T1RN+zuT0ZdVkRkb3LfffcxY8YMduzYUeqvNEs0UZJYmpndFk7XSWQwIiJ7g+uuu47rrrsu2WHsEWImMXe/Nrwmhru/n/iQREREoon5FXIzGwJ8CtxjZv+X8IhEREqxa9euZIcglagyns8o3YktgLOAe4DzKrxH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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "data": { "image/png": "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4+7GvHfeIjHGmDZs586ddOwYZ5cZz5///OecLaup6124cCHvv/8+HTp0YOnSpRx00EH8/Oc/j5zv/vvvp7KyMmlYly5dWLNmTdKw888/H3CJ88knn6SsrCy3HyAkTknsfuBu3C1TVuQ1GmOMyZP169dzwAEHcOGFF1JRUcGxxx7LJ598AsCaNWsYN24cX/ziF5k8eTKbN28GXAlkxowZVFZWcvvttzNhwgQuv/xyKisrOeCAA/jrX//Kqaeeyr777svVV1/dsK5TTjmFMWPGUFFRwcKFCyPj6datGwDXXnttQ+mlf//+DUngV7/6FYcccgijRo3i4osv5vPPPwdg0aJF7LfffhxyyCGsWrUqctmbNm3i2GOPpaKiggsuuACvcXnSer/yla/w0UcfMWbMGG666SZmzZrF7373O0aNGtWwXQqCqqZ9AH2Bs4BzgXMyTd+SjzFjxqgx7UnVoiqtWlTV2mE0ySuvvJL1PHV1qvPmuefmWrdunXbo0EFfeOEFVVU944wz9L777lNV1YMOOkhXrlypqqrXXHONXnbZZaqqWlVVpZdeemnDMqqqqnTWrFmqqnrbbbdpv3799K233tLt27dr//79tb6+XlVVN23apKqqH3/8sVZUVDQMHzx4sNZ5H6Zr165J8W3evFlHjBihNTU1+sorr+hJJ52kn376qaqqXnrppXrPPffoW2+9pQMHDtT33ntPd+zYoYcddphOmzat0Wf91re+pdddd52qqj722GMKRK43+HrRokWRy/I/93777acjR47UkSNHNnyeoqKihmGnnHJK0jzBz5qNqN8JUKMp8kCcsvHNuIuct+QpjxpjTKRFi2CWd1HPzBxcoTp06FBGjRoFwJgxY1i/fj0ffPABW7ZsoaqqCoBzzz2XM844o2Ges846K2kZX/nKVwA46KCDqKiooF8/d8P7YcOGsXHjRkpLS7njjjt45JFHANi4cSOvvfYapaWlKeNSVb72ta9xxRVXMGbMGBYsWMDq1asZO3YsAJ988gl9+vThL3/5CxMmTKB3794Nsf3jH/9otLynn36a3/72twCceOKJ9OzZM+ttFRa3OrGlxUliNar6WN4jMcaYEK9mreG5uYqLixted+jQIVa1WdeuXSOXUVRUlLS8oqIidu7cycqVK1mxYgXV1dWUlJQwYcKEjL2UzJkzhwEDBjRUJaoq5557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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "FFT grid points (output):211.0\n", "NUM grid points (output):328.0\n" ] }, { "data": { "image/png": "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J554Ii+//DLPPPMM++yzD3PmzGHffffl6aefBmDz5s1MnTqVPn36sHr1aiZMmMC9997L2LFjefbZZxk+fDhPPvkkEAzpzZ49m9NOO40nnniiwu3efffd/Pvf/2aXXXZhxIgRPPfcc3To0IFXXnmFiy66iPHjxzNlyhR69OjBtGnTaNWq1TbrGDVqFFOmTGHixIl8/vnnZZaNHj2aY489lgkTJjB69GgGDhy4TQJbtGhR6XDiunXrABg+fDi5ubnccccdNduhSZaSnlhREYwcGUyPGJGKCERke/Xgg7U7vuy3334AtG/fnsLCQr788ksOOOAAAA488EDmz59PmzZtSucB7L777jRq1Ih27dqx9957U69ePdq1a8fixYvZunUrI0aMYNGiRXz77bf079+/0m1fdtllDBkyhL322oupU6fy+OOP89JLL7FlyxZ69uyJmdGtWzcAunfvvs39CwsL6dChAwB77LFHtR97+eFEoMLhxHSSkp5YdjbceisMrs0P2IuIVGDw4NodX8ysdNrd2W233Zg/fz4A8+bNY7fddgMocx4s9j7l7//ee++xYcMG5syZwx//+EfcvcLtTpo0iaZNm3LKKacAsOeee/KHP/yBWbNmMXfuXMaMGUPnzp1ZuHAhAAsWLNhmHS1atODzzz9nw4YN/O9//6vZDsgwKUliZsEnpAp6wyIitdKqVWKPL/369eODDz6gd+/eLFq0iFNPPbVa999zzz1ZsmQJJ5xwAm+//Xal7a6//nrmzp1Lbm4uN998M3379mX58uUcddRRHHXUUbz44ov069eP119/neOPP57CwsJt1nHttdfSt29fhgwZUtoj295ZZZ8Kkimn495e8OniOt+uVI8KAKe3n1oB4MWLF7P33nunOgxJsPLPq5nNd/cDo94/YefEzOxkoCewI3Cbuy9N1LpFREQqksjhxB+AHKAJsLr8QjM718zmmdm8oqKiBG5WRER+qhKZxPYELgIeBI4ov9Dd73P3A939wOzs7ARuVkREfqoSmcTWANcA/YD/JHC9IiIiFUrYOTF3r/gbfCIiIkmiAsAiIimQjgWAzYwZM2aU3m/ChAksX76cM888c5vtLl++HDNj3rx5QPB7b1lZWXVeU1FJTESkFoqLi2t1/9tvvz2pPzEzaNAgunfvzpdffknz5s2ZM2cOCxcupFevXjz11FNl2u62227cfffdkdfdvXt3nnnmGQD+9a9/lVYTqUsqACwiEvqpFwBu27YtzZo14+OPP460v/baay8WLw6+8ztjxoyUlKdST0xEti+1rAD8Uy4ADDBs2LBqFfvda6+9eOutt2jUqBENGzaMfL9EURITke1LSQXgBx+s0d3LFwBeunRpmQLAS5YsAYhUAPibb74pLQDcu3dv7rrrLlauXFnptmMLAC9evJjHH3+c3NxcbrzxRgoKCli2bFmkAsDNmjWrUQHgkse4dOnS0p5co0aN2LRpU+nyjRs30rhx49Lb/fr147zzzuOkk06q0fZqK1ISM7PWZrabmekLXiKS3mpZAVgFgOGcc87h/vvvB6BNmzZ89tlnpYnstddeK030AAcddBDdu3fnxBNPrPH2aqPKJGZm55nZI8CNwHlAvpndbWad6yQ6EZHqSnAF4J9iAeD+/fvz/fffA0FSvvLKKznyyCPp3bs3u+66K/vuu29pWzPjgQceoFmzZjXeXm1UWQDYzA5w93fLzWsKtHP3Gqd5FQDODCoAnN5UAFi2B0ktAOzu75pZW4IyUg3DeQ8DP40fqhERkbQW5ZzYbcAGYFX4JyIikhaifE/sHXd/LumRiIiIVFOUJHaqmR0LfA+4u5+W5JhEREQiiZvE3L2XmTUPp9cnPyQREZFo4p4TM7NrgHHAODO7LvkhiYikjyiFc6syceLE0uk//elPyQgx4aZMmUJBQUHcdrGPLZ733nuPd999N37DaopyYUeOuw9196FA84RHICKSxqIUzq1K7IH+zjvvTEaICVVcXJzwJFZcXJy0JBblnNiOZnZWON0y4RGIiKQJd9+m6O7IkSMrLJx78cUXM2TIENavX8/ee+/N3XffzVdffcXgwYP54Ycf6NmzJ507d2bRokXk5uZy5513csEFF/Dyyy9z0kkn8e9//xuAo48+mhdffJHp06dz6623smXLFq677jpOOOGE0rieeeYZbrrpJpo1a8Zll13G6tWr2bJlC+eccw55eXmlP7syZswY6tevz6ZNm5g8eTLffvstZ5xxBi1btmT16tU89thjdO7cmVtuuYWpU6fSsGFD8vPz6dChA/vvvz9dunRhjz32YNq0aSxevJjf/OY3jBgxAoCCggJOOeUUzIwuXbpwzDHHlD62q6++mnnz5jFt2jQ2btzI+PHj6datG7m5ufTo0YOVK1eybNky1q5dy8yZM5k0aVLCnrMoSew84LiYaRGRlLnh2Q/4cOW3tVrHPu124PqT991mfknR3XvuuYcXX3yR8ePHlxbJnTBhArNmzWLGjBmMHj2a4cOHc+WVV9KzZ08uv/xy3njjDR5//HEuvfRSjjvuOIqLi6lXrx4PP/xwmd/YatiwIW3atGHFihVs3bqVnXfemaysLP7617/yyiuvUFxcTJ8+fcoksX/+8588+eSTdOrUCXfnoYceqvBxuTsvvvgiTzzxBPfddx+//e1vKSgoYPbs2cyfP59bbrmFvLw8XnnlFV577TXmzp3LTTfdxD333MPnn3/O66+/TtOmTVm2bBnXXHMNu+++e+m6FyxYQG5uLnl5ebh7aTIreWyHHXYYV155JUuWLOH6668vTVT9+/enZ8+e5OfnlybeRKoyiZnZWMCBkmJgRwAjExqBiEiaKCm6+9JLL7FlyxZ69qy8GsrixYu54oorMDO+++47evTowccff8yNN94IlK2tWN4pp5zC5MmTKS4u5tRTT2XNmjUsXry49KdMVq9eXZooAK6++mpGjx7Nli1buPrqq7epz1iipDhw165dS3t6Xbp0ISsri65du7JkyRKWL1/OL3/5SyAo9nvDDTcAQXmspk2bVhpz7969mT17NmeccQYnnHACAwcOLLP8kUceYdKkSdSrV69MfBUVKk6keD2xu8rdrrxGlYhIHaioB5UoJUV3hw8fDkBRURFffPFFpW3PPPPM0oP0li1bePXVV3nzzTc55phjSntisQf0En369KF///4AXHTRRWRnZ9OlSxdeeukl6tevT1FRUZn7dezYkQkTJvD6668zbtw4jj/+eBYtWgTAokWLOPLIIwFKiwMvXLiwtFDx+++/z9atW0vnderUqbRdZQWNs7Ozt/m16a1btzJq1CggSJIDBw4sE+Pdd9/NggULWLp0KUOHDi2dX7Le7OzsMtXwEyVeEusPtAunjSCJqScmItulvn37MmzYMI466igALrnkktJeS3lXXXUV5557LuvWraNevXpMmDCBK664grPOOovRo0dz6KGHMmbMGHbZZRdOPfXU0h4aQOPGjdlxxx3Jysoq/Q2uP//5zxx99NGYGfvssw9///vfS9vn5eXx5ptv8t1333HbbbfRvXt3xo4dyzvvvENW1o+H8ezsbE444QQ2btzI008/zfr16/n5z39Ov379+Prrr5k0aRJt27blyCOP5NBDD6VBgwYVDk0ef/zxXHjhhQwYMIDzzz8fgLfffpurrrqKoqKi0h5jjx496NevH8OHD6dHjx707t2b3r17V7i/DjnkEAYNGsT777+f0Atc4hUA3gloEDvP3T+t7UZVADgzqABwelMBYIkVe76uxPLly7nmmmt49NFHUxhZ1WpbALjKS+zd/UsgF/gKuBmo2Q/0iIiIJEGUqxP3A44CHg7/i4hImsnNzS291L5Ep06d0roXlghRvuy8A8Gl9TOBJskNR0REJLooPbHzgYOB/YFLkhqNiIhINUTpid1JkMR6A+OTG46IiEh0UZLYR+5+h7uPBb5MdkAiIulEBYBrbvny5QwaNKj2AVUhShI73czuM7OJQK6Z3ZrUiERE0ogKAKe3KOfEzkh6FCIiaUAFgCsvAAxB/ciSL0ffcccdHHDAAXTp0oUuXbrwwQcf8NBDD9G1a1euu+46Zs6cyT777JP05yxKEusH7OfuQ83sWnf/S5JjEhGplAoAp6YA8Jo1a5g6dSpz5szhm2++4eyzz2bKlCmsXr2aiRMnMn/+fB566CHatGnD22+/zauvvso//vEPpk+fXqvnKp4oSWw3YEU4rd8TE5HtlgoAV14AeNmyZSxcuLC0TmOJ3XffnUaNGtG+fXsKCwv59NNPS9ffvXv3tEhiDjQ2s/34sY6iiEhKqABwagoAd+7cmYMOOojJkyeX7htgm4TasWPH0tgWLFhQ1e5OiChJ7DbgQmAgcFVywxERSR0VAA5UVAC4devWpVdp1q9fn6OOOoprr712m/vutNNOdO/enV69erH//vvX4FmonioLACeLCgBnBhUATm8qACyxVABYREQkw0QZTsTM6rl7cbKDERGRmlEB4KqV/4VnERGRlKuyJ2ZmzYEcoLmZdQBw98/qIjAREZF44vXEfgkMAvYM/w9KbjgiIiLRxftl59fc/QZgvruPcvdRdRSXiEidmzVrFtdccw2Q2mK906ZN4/nnny8zb9asWeTl5dV63YMGDWL58uW1Xk+6iHRhBzApqVGIiKSZRBbrLfnic9S2sSWnpGqRkpi7z012ICIi6eTwww9n7ty55Obm0r17d+bMmcP555/PkCFDeOutt7j88sspKirinHPOYfDgwdx0001MmzaNjRs3Mn78eLp160Zubi49evRg5cqVZa4SHD9+PPn5+RxxxBG89dZbzJo1q0zbY445prTA79lnn81nn31G27Zty9QyBPj666+3KUKcl5fHsmXLWLlyJZ06dWLChAl88skn/Pa3v6VNmzYUFhbW8Z5Mrqg9MRGRtHDJtEt476v3arWOrm27cvsJt0duf+aZZzJmzBiOPfZYhgwZwnXXXcfUqVNp3rw5xx57LGeccQYXX3wxV155JUuWLOH6669n0qRgAKt///5lajBu2bKF/Px8XnvtNebNm8dbb71VuqykbX5+PgBvv/029evXZ8aMGYwZM4bNmzeXievmm2/epggxBDUUH374YY477jgKCwsZO3Ys48aN4+CDD66TKhp1SUlMRCSO/fbbj+zs7NIhwYULF9K3b18gqO7+9ddf89xzzzFp0qRt6iWW1FYssWbNGjp06ED9+vXp2rVrmWXl2y5btqy0qG/37t1Lk1SJiooQl8QL0K5dO9atW1e6nqysrErLaGWqeJfYP0VQABjAAHf30ypp2xk4C/gOuNfd1ycyUBERoFo9qEQpX8S3W7duTJ48maZNm1JUVER2djZ33303CxYsYOnSpQwdOrS0bflzYa1atWLFihUUFxfzn//8p8yy8m07d+7MzJkzgYqL6VZUhHjRokXbFOXt3LkzCxcupEePHqXFebcXVSYxdx8AYGb7EtRZfL+K5ucBK4EGQFH5hWZ2LnAuQLOddqtpvCIiKXfDDTdw8skn4+7k5OTw9NNP06NHD3r37k3v3r2rvG9WVhZnnXUWhx56KD179iQ7O7vStgcffDD33HMPRx99NB07dqRDhw5llldUhLgil112Gb///e9p06YNbdq0qf4DTmNxCwCb2e3A2vBma3cfVkW7+4GdgWbu/nRl61QB4MygAsDpTQWAM9eWLVvIysrirbfeYuLEidx7772pDillalsAOMo5sa0lv+ZsZrdW0S4f+AOQTfDzLSIiUoE777yTKVOmsHnz5kp/pVmiiZLEsszs+nC6cWWN3P094L0ExCQisl279NJLufTSS1MdxnYhbhJz94vDc2K4+wfJD0lERCSauF8hN7NLgM+AW83s/5IekYhIJbZu3ZrqECSBEvF8RhlO7AAcB9wK/KrWWxQRqYGcnBw+/vjjVIchCZaTk1Or+0dJYhuBvsAQ4MRabU1EpIa2x8vDpfainBO7Kubm5RB858vd70taVCIiIhFE/WXn8tomNAoREZEaqGkSExERSbmaJrFVCY1CRESkBuIVAB7LtgWAR7r7T7dGioiIpI14F3bcVe521YUWRURE6lC8KvafmtnBwECgSTj77KRHJSIiEkGUc2JDgUIgD/gkmcGIiIhUR5QktgpoBBQD+qahiIikjSgVOyYBm4GRwIzkhiMiIhJdlJ7Yru6+JPwxzE3JDkhERCSqKEnsiJjpXskKREREpLqiDCe2NrOjCS6v3ynJ8YiIiEQWpSc2DNgD2BO4OLnhiIiIRFdlEjOz04Azw3b1wmkREZG0EG84cSll6ySqYoeIiKSNKnti7j4fOMzdZ7v7bODouglLREQkvngFgJ8C9jGzruGszUmPSEREJKJ4tRMHmFkvd3+1rgISERGJKsrViUPM7CYz65j0aERERKoh7vfE3H2QmXUC/m5mRcCN7j4v6ZGJiIjEEbcnZmYDgFEEdRMvQN8VExGRNBGlYscW4Cx3dwAzG5HckERERKKJd3Xi2HCyp5kB4O4jkx2UiIhIFPF6YneVu60vO4uISNqId4n9p2Z2MDAQaBLOPjvpUYmIiEQQ5RL7oUAhkAd8ksxgREREqiNKElsFNAKKgTbJDUdERCS6KFcnTiIoNzWC4DJ7ERGRtBClJ1YAdAfeBXZIbjgiIiLRRUlifwU2AF9R9mdZREREUirKcOI8d38u6ZGIiIhUU5QkdqqZHQt8D7i7n5bkmERERCKJUgC4V10EIiIiUl1xk5iZDQFOC9vWd/fcZAclIiISRZQLO7oCb7j70cALyQ1HREQkuihJrBBoYGZnAgckNxwREZHoolzYMYag8O+JwJXJDUdERCS6KntiZnYZ0MzdN7r7P939EzM7ysyOrqP4REREKhWvJzYFuNzMfgFsBYqAJ4F/JjkuERGRuOIlsa7ADe6+PsrKzOxXwHnu3re2gYmIiMQTL4mtAkaaWQtgKfC8uy+pqKGZdSOodr+skuXnAucCNNtptxoHLCIiUiLej2K+CrwKYGadgZPM7BfuPqyC5n0Iqnp0M7Nu7r6g3LruA+4DyOm4t34hWkREai3Kl50PBI4kqGD/MXBtRe3cfUzYvlP5BCYiIpIM8a5OvA84BHgdeIzgO2OjzOz4yu7j7pckMD4REZFKxRtOPLfcrA+BZ5MXjoiISHRVJjEze4rgi84WzlIVexERSRvxemID6ioQERGR6opyYcdQ4FiCHtlMdx+f9KhEREQiiFI78ZclQ4hmdntywxEREYkuShJrYWZHhNM5yQxGRESkOqL8FMslwH7h3yXJDEZERKQ6oiSxw4HxBEnsd8kNR0REJLoow4mHAd8CLwOHJjccERGR6KL0xHYhGEacTrSkJyIiUieiJKWzgIbu/p2ZldRHPM7dpyc3NBERkarF7Ym5e5G7fxdOfxXOPiSpUYmIiEQQZThRREQkLdU0iVn8JiIiIskVrwDwieXnufsLwM1Ji0hERCSieBd2tC532wHcfVNywhEREYmuyuFEd38ImApsqJtwREREootyTmwc8GuCXtgxyQ1HREQkuijfE1sNmLs/bGY7JzsgERGRqKIksdnAVjObAnyQ3HBERESii5LElrn7f4GXzGzPZAckIiISVZRzYufETJ+VrEBERESqK0pPrLWZNST4gnPbJMcjIiISWZQkdjswIZz+W/JCERERqZ54FTs6A5v4sUKHJz0iERGRiOL1xI4D2vBjrUQHRiU1IhERkYiqTGLufq+Z/d7d/wFgZrqwQ0RE0ka84cQ/An3MbEeC3tjRwEN1EJeIiEhc8YYT3wdaEHzJuRiYnPSIREREIopXAHg2sBfQxN1fdfdVdROWiIhIfFG/7NzazB43s4vNrGmygxIREYkiShJrCewKfAt8BTyQ1IhEREQiivJl58uAv7v7MgAzW5HckERERKKJd3XiicArwF5mtheAu79QF4GJiIjEE68n1rrcbVXsEBGRtBHv6sSHgKnAhroJR0REJLooF3aMA35N0As7JrnhiIiIRBflwo7VgLn7w2a2c7IDEhERiSpKEpsNbDWzKQSVO0RERNJC3CTm7i+YWRvgYnRhh4iIpJG4SczMJgJrgS0ESeyqZAclIiISRZThxPfdfVzSIxEREammKEns12a2G+Fl9u4+MrkhiYiIRBMlif0hZlrnxEREJG1ESWJtgYFAk/D22RU1MrNewKHAL4CR7l6QkAhFREQqEeXLzkOBQiAP+KSyRuHvjd0CLAd2rH1oIiIiVYuSxFYBjQh+2fnnVTU0s98Dn5RUvC+37Fwzm2dm84qKimoUrIiISKwoSWwSMB4YCbxcWSMzO43g/FlrM+tYfrm73+fuB7r7gdnZ2TWNV0REpFSULzt/GE4Oi9PuSeDJRAQlIiISRZSemIiISFqKnMTCqw9FRETSRnV6Yv2TFoWIiEgNVCeJPZW0KERERGogchJz9zeSGYiIiEh16cIOERHJWFF+iqUtcATQEMDdH052UCIiIlFE6YndRlDBflX4JyIikhaiFAB+x92fS3okIiIi1RQliZ1qZscC3wPu7qclOSYREZFIopSd6mVmzcPp9ckPSUREJJooF3ZcA3QMp1e4+6ikRyUiIhJBlAs7ctx9qLsPBZonOyAREZGoopwT29HMzgqnWyYzGBERkeqI0hM7D1gT/p2X3HBERESiq7InZmaXAO0AC2cdQfDjmCIiIikXbzjxCSAH+C683Sy54YiIiERX5XCiu38JnOrun7r7p8AZdROWiIhIfPGGE58C9jGz/cJZKjslIiJpo8ok5u4DzGxfd/+grgISERGJKsol9j3NbFzYtr675yY3JBERkWiiXGK/P/CGux8NvJDkeERERCKLksQKgYZmdiZwQHLDERERiS7KcOKN4f8TgSuSGIuIiEi1xLs6cSzgJTeBQ0jAl53dYexYGDwYWrWq7dpEROSnKl5P7C5+TGIJU1QEI8NUOGJEotcuIiI/FfEusf/UzB4kSGQW/j+7thvNzoZbbw16YiIiIjUV5ZzY+eH/psDQRGzUTD0wERGpvShJrH74fwtBMWAREZG0ECWJ/Z1gGHET8ExywxEREYkuShK71d0XA5jZHkmOR0REJLIoX3YeEjM9KElxiIiIVFuUnlhrM2sUTrdNZjAiIiLVESWJ3Q7cH07/LXmhiIiIVE+8ih37EFzQcXM4K+FffBYREampeD2xAeH/2OQ1KkmxiIiIVEu8ih03mFkW0A1ognpiIiKSRqJ+T6wd8A5wEDAnqRGJiIhEFOUS+/XAIncfhRKYiIikkSg9sQUAZvYvYGVywxEREYkuShKb7u5fA5PMrHWyAxIREYkqynDi5THTlyYrEBERkeqKksRyYqb1O8wiIpI2ogwnPm5mTwPFwANJjkdERCSyeBU7Grn7dGB6BfM3lpt3AHAKwffJrnX3DYkONhXWrIEHH4S+fWHq1OD/Y48F8999F374IZhu0QLWrav4f0EBuEPLlpW3qU7bRK/vhx9gzBh4+GG49lp49VX96raIZAZzr/z7y2b2N4IvOH8IFAKdw79J7v5aubZjgSuBQ4Ecd59S2Xpzft7RCx6+F0aNghUryhxRN68u4JtC55t6LWm2eR3rs1vQvKjs/xabCwBnXYOW2yxLdNumm9dRQAtyKP+/AMNZS0t2ZB2FtKj0f6LbJnPb9XDW0JIc1vGbwQXU9y1M/McvUvoc1KZtpsRZk7ZXnXo2AGOenqh9pddV2ratzvqaF63jWF+zdbH/EGWUMMg9VSWxMDnlAD2BHYD/ufu8StqNBa4ADqOCJGZm5wLnAvwsp333gk2FsGG76Kxtt3IHBf9n5acyCqnM6b+7CYAnHrsyxZGIJM6BwDx3i9o+brZz9wLg+QjrehzIIxhOvL6C9dwH3AeQ06qDs2EDtG8PZnzfuAVr/7eOtTE9h3X1WrKjp/5TxQ5F69jUtAUNN/z4f3PzFjT5oYCGDZwmu7SkwXcJGNNL4Xji5jXr+Gx9C3YsLqBok/ND05Y03LCO7y3oiS1uoJ5YOrbdTAMAFjfYV/tKr6u0bVvdntgGX7M1Qr4pFbcnlgw5bXf1glWfwIgRfDTkVg47DNauhebNIScHTjoJ8vKgla6FTKnc/FwAZg2aldI4pGKn3/sGAE+c1zPFkYgkjpnNd/cDo7aPPO6YUCUdxSZN+POfgwQGcP75cOutKYlIREQyUGqSWHaDIFsNHsy4tbB5M3TrBiNHpiQaERHJUClJYo4xlhH0WgJ/+QvcdRfsuWcqIhERkUyWkiRWVBT0uvbaC/7732De81EuHREREYkRpexUwmVnB6OJDz4IJ54I48alIgoREcl0KemJmcGIEUGli9zc4OpvERGR6kpJT6zEgw8Gw4oPPpjKKEREJFOl5urEUEl9PtXpExGRmkhZT6yksO7gwfpSs4iI1EzKkthddwVDiXfdlaoIREQk06X0nJiIiEhtpOyc2EUXQdOmOh8mIiI1l7Ik1qpVcJm9iIhITWk4UUREMpaSmIiIZCwlMRERyVhKYiIikrGUxEREJGMpiYmISMZSEhMRkYylJCYiIhnL3L3uN2q2Hviozjec+VoBa1IdRIbSvqsZ7bea076rmT3dvXnUxqmq2PGRux+Yom1nLDObp/1WM9p3NaP9VnPadzVjZvOq017DiSIikrGUxEREJGOlKondl6LtZjrtt5rTvqsZ7bea076rmWrtt5Rc2CEiIpIIGk4UEZGMVSdXJ5rZAcApQBPgWnffYGZ/BooBd/c76iKOTFPJfrsQaEmw30anNMA0Vsm+M+BW4At3vz2V8aWrSvbb6UAHYLm7P5XSANNYJftuLPAVsLO7X5rSANOUme0BXAVMcfcp4byzCL6i0NTdR1V1/7rqif0OyAOmAMeG83YJDySd6iiGTLTNfnP3u4FbgJ1TFlVmqOg190fg6RTFkykq2m8Dge9SFE8mqWjfZQHNgLWpCSn9ufvHQH652V3d/TYAM9uxqvvX5XBiZSffdFKuamX2j5k1Am4K/6RqpfvOzHKAXwAnAkeYWcOURZX+yr8nG7r7Pfx4YJbKld93n7r7DUCLVASzHYibH+rqy86PE3xCaQJ8Ymb1gM/M7BJgeR3FkIkq2m9PAB8AxwH3py60tFdm3wGF7n6xmXUC+rn7phTGls4qes1NM7OLgS9TGVgGqGjf7Rruu42pDCydmVlb4DdAYzNrAbwEvGdmwwHcvbDK++vqRBERyVS6OlFERDKWkpiIiGQsJTEREclYSmIiIpKxUvVTLCI/GWbWGPgb0A74GdAeGOzus1MamMh2QFcnitQRM8sF9iP44vAagooERwI/EFy+nh0uPw04AvgV0Bh42t2n133EIulPw4kiqfWSu58P9Hb3a4C3gX2BYUAhQXLrkbrwRNKbhhNFUuvb8P/X4f/NQEOCD5ij3X1LSqISyRBKYiLp6f+ACWZWAMxz93+kOiCRdKRzYiIikrF0TkxERDKWkpiIiGQsJTEREclYSmIiIpKxlMRERCRjKYmJiEjGUhITEZGM9f9a9jX1NUL+MAAAAABJRU5ErkJggg==", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "data": { "image/png": "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Aw88EAknZXScAFVl3bp1rF27ll7JXk59kqoociry8iyxA+Dqq+F/j7b1vz8GF11kBZPDoskQG6CdmwtnnmmzbIcFkcN2wM6Jr3ziOE2UGkVMVc8Tkb6q+lZ9GbSrbNmyxQXMqRYRITc3l/L4PqqmQn4+9O9v6yefHJu3DSxzcs89TcROO80SRpYutX1ffhlLNIHELMn40lrxx318m9NEiDJObKiIPC8iL4nInGwbVBe4gDk1sdt8P4qKrD9u5EhLxz//fNu/fLkVQAbzyMAKHseX0AqrlWzbVnV8WphxOXGiJa2kwse2OY2EKCJ2BLBAVY8HZmfZHqcOOPDAA6kIHi7Dhg3b5fYefPBBCgsLa33fcePG0bdvX8aNG0d5eTlHH300AwYM4JVXXkm4vqCggPz8fPr370///v156qmnAGjZsuXOff3796ekpGTneps2bTj88MPp378/v/jFL3b5vTYp8vJMkF580by0+Cr/YcLIo4/avuXLzatatgweeMDO6dLFprFJLrIcem29e1v1/1Qk15KsDhc7J8tEGey8AWgrIhcBR2bSuIgcCZwN5AA3qeqmYP91wA5AgXuAScDnQBmwGPglsEpV787kfrsD27dvp1Wrupur9LUo/S5ZIP6+06ZNY/369bRs2ZLHHnuMww8/nD/+8Y8pr3vkkUcYNCix/7Z9+/YsSZpD7LLLLgNMOF9++WXyPOQVK6eVnDBy1lkmJAsXWobk1q3moZ1xhglacqhx8WJbX7EiNuA7noqKxCltqksaqaioOimp49QxUTyx24GJQCWQ6U/d0cAEYAZwQtz+AwKBOhDz9N5U1duBk1X1M+Du6hoUkStEpExEyhpjv8aqVas49NBDufzyy+nbty8nnngimzdvBmDJkiUMGTKEb3/725x11ll8HsxMXFBQwLXXXsugQYP4/e9/T0FBAT/72c8YNGgQhx56KG+88QZnn302Bx10EDfeeOPOe5155pkMHDiQvn37Mm3atJT27LHHHgDcfPPNO72Xbt267RSBP//5zxx11FH079+fH//4x3zzzTcAlJSUcPDBB3PUUUcxf/78lG2vW7eOE088kb59+/KjH/2I+EzX8L6nn346GzduZODAgdx5550UFRXxt7/9jf79++/8XJw6JEwYef/9WMZjUZFNKrpxY6w25JgxcMABtr54ccxTmjTJEkF69rTt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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "FFT grid points (output):406.0\n", "NUM grid points (output):576.0\n" ] }, { "data": { "image/png": "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PZNpiV2wx3sTEREA2rVrB8D111/Pzp07k15/+vTpTJ8+vcj5WVlZ+cstWbIEd+ecc86hQ4cObNmyhbZt23LJJZcUWOeAAw4gKyuLrKwsFixYwKhRo2jRogVZWVn06dOHrl27kpWVlb9c165dk467tEUZ2JHnmZRFISJSQe3atYtKlUp+ZWbixImlF0wcvXv3BmDNmjXUqlWLf/zjH7z55pu0b9+eu+66q8CyzZs3Jzs7O//5a6+9xj333MMZZxT8Ksl27doVWK48RU5i7v6vVAYiIlLesrOzufvuu8nIyGDDhg3MmzePqlWr0qtXL7766isaNmzI448/zqJFi7j33qCk7DXXXMOwYcNo0aIFS5cu5ZZbbuGJJ55g7dq1/P3vf+eQQw6hR48efPPNN1SpUoVZs2ax//775+8zKyuL+fPnM3jwYD766CM2bNjAySefzNSpUxk0aBAff/wx1apV44knnqBGjRpccsklbNu2jerVq9OtW7cC8b/77rtcffXVHH744WzcuBGAUaNG0a5dO6ZPn85rr71Gv379+O9//8vq1avJyMhgzJgxZXeAU0ADO0Rkr5KTAxMmBL9LYr/99uP555/n7LPP5pVXXuG5557jmGOOYeHChRx77LE8++yzAGzfvp05c+bQtWtX1q1bx9SpU3nooYeYMGECzz//PEOGDOHpp58Ggi69BQsW0KNHD5566qm4+500aRL//Oc/OfTQQxk6dCgvvPACjRo14tVXX+Xaa69l8uTJzJ49m1atWjF37lzq1Kmz2zZGjx7N7NmzeeSRR/jyyy8LzBszZgydO3dm6tSpjBkzhl69eu2WwJYtW5bfnfjdd98BMGTIELKysvjzn/9csgOaYlG+iqUecBpQBcDdH0t1UCIiJTVtGgwLy5QPHZr8+scddxwADRs2zL837cQTTwTgpJNOYsmSJdStWzd/GsDhhx9O1apVadCgAUcffTSVKlWiQYMGLF++nJ07dzJ06FCWLVvG999/zwUXFD284MYbb6Rv374cddRRzJkzhyeffJJ58+aRm5tL69atMTNOOOEEAFq2bLnb+ps2baJRo0YAHHHEEUn/7YW7E4G43YnpJEpL7B6CCvbfhD8iImmrTx8YPz74XRKxI+bcnWbNmrFkSVB4aPHixTRrFhQmj70OFrtO4fXff/99tmzZwsKFC/nd736He/ySsDNmzKBGjRpceOGFABx55JH89re/JTs7m0WLFjF27FiaNm3K0qVLAXjvvfd228YBBxzAl19+yZYtW/jf//5XsgNQwURJYu+6+wvuPs/d56U8IhGRPVCnTtACi9PbViLdu3fnww8/pEOHDixbtoyLLrooqfWPPPJIVqxYwVlnncU777xT5HIjR45k0aJFZGVlcdddd9GtWzdWrVpFx44d6dixIy+99BLdu3fnzTff5Mwzz2TTpk27beO2226jW7du9O3bN79Ftrezoj4V5C9g9jrwPfAj4O7eoywCg6CK/YbPl5fV7iQJWdOzAMjunV2ucUhBlz4UjL966urW5RxJ6Vu+fDlHH310eYchpazw62pmS9z9pKjrRyk71d7MaoWPN5coShERkRSIMrBjBMH3gmFmq919dMqjEhERiSDKNbHa7t7f3fsDtVIdkIiISFRRbnY+0MzyvgzzoFQGIyIikowoLbGrgZzw5+rUhiMiIhJdsUnMzK4H7gSywp87Ux6RiMg+IB0LAJsZ8+fPz19v6tSprFq1ip49e+6231WrVmFmLF68GIBvvvmGjIyMMq+pmKgl9hTwKHB/+PNoyiMSEalAdu3atUfrT5w4kcqVK5dSNLvr3bs3LVu25Ouvv6ZWrVosXLiQpUuX0r59e555pmBd92bNmjFp0qTI227ZsiXPPfccAH//+9/zq4mUpWKTmLt/DVzk7p+7++fAFWUTlohI2cvOzqZr166cd955tG3blh9++IHc3Fwuu+wyOnTowGWXXUZubi7Z2dl069aNbt26MW/ePJo3b07Pnj1p3rw5M2fO5JxzzqFly5b59Qt79OjBaaedRpcuXfj+++8L7DMrK4vc3FwGDRpEVlYWv/71r+nbty/uzjXXXEPHjh0555xz2LhxI9u3b+f888/nrLPOYs6cObvF/+6773LiiSfSo0ePAgWA58+fz7Bhw/ILAA8bNoyZM2cyYsSIAuvXq1ePmjVr8sknn0Q6XkcddRTLlwf38s6fP79cylMl6k58BrjUzJ42s6fR6EQRSXd7WAF4Xy4ADDB48OCkiv0eddRRvP3221StWpUqVapEXq+0JGqJXQL0cPe8n/8ro7hEREomrwLwtGklWr1wAeBPP/20QAHgFStWAEQqALxx48b8AsAdOnTg/vvvZ82aNUXuO7YA8PLly3nyySfJysrizjvvZMOGDaxcuTJSAeCaNWuWqABw3t/46aef5rfkqlatyrZt2/Lnb926lWrVquU/7969O1dffTXnnntuifa3p6KMTmxtZvPM7BUzy051QCIie2QPKwCrADD069ePhx9+GIC6devyxRdf5CeyN954Iz/RA5x88sm0bNmSs88+u8T72xNRklgL4F/u3gl4McXxiIjsmVKuALwvFgC+4IIL+PHHH4EgKQ8fPpzTTz+dDh06cNhhh3HsscfmL2tm/OUvf6FmzZol3t+eiFIA+A8EN0V/CJzr7r8pi8BABYDTmQoApycVAJaKJuUFgPn53rCzgZuTC09ERCR1ik1iZjYByGuqGXAqMCzVQYmIiESRqCV2Pz8nMRERkbRSbBJz98/NbBpBIrPw91VlEZiIiEgiUa6JDQx/1wD6pzAWERGRpEQZYl85/MkFGqQ2HBGR9BKlcG5xHnnkkfzH//d/FaNexOzZs9mwYUPC5WL/tkTef/99/v3vf+9JWHFFSWIPEFwbuxv4R6lHICKSxqIUzi1O7In+vvvuS0WIpWrXrl2lnsR27dqVsiQWpTtxvLsvBzCzpOqYmNmJwIVAdeA2d98STn+Y4L6z5e4+L7mQRURSw90ZNGgQH3/8MdWqVeOJJ54oUDj3v//9L6tXryYjI4PrrruOvn37snnzZo4++mgmTZrE2rVr6dOnDz/99BOtW7emadOmLFu2jKysLO677z6uueYaXnnlFc4991z++c9/AtCpUydeeuklXn75ZcaPH09ubi633347Z511Vn5czz33HOPGjaNmzZrceOONrFu3jtzcXPr168eoUaPyv3Zl7NixVK5cmW3btjFr1iy+//57rrjiCg466CDWrVvHzJkzadq0KXfffTdz5syhSpUqTJ8+nUaNGtGiRQuaN2/OEUccwdy5c1m+fDkXX3wxQ4cOBWDDhg1ceOGFmBnNmzfnjDPOyP/bbr31VhYvXszcuXPZunUrkydP5oQTTiArK4tWrVqxZs0aVq5cybfffstrr73GjBkzSu01i5LE+gI3ho97A7cksf3LgOFAG6AzMDucvhbIJOimFBGJ7I7nP+SjNd8nXrAYxzTYn5HnHbvb9Lyiuw8++CAvvfQSkydPzi+SO3XqVLKzs5k/fz5jxoxhyJAhDB8+nNatW3PTTTfxr3/9iyeffJIbbriBLl26sGvXLipVqsRjjz1W4Du2qlSpQt26dVm9ejU7d+7kkEMOISMjgz/+8Y+8+uqr7Nq1i65duxZIYn/72994+umnadKkCe7Oo4/G/1Ysd+ell17iqaeeYsqUKfzmN79hw4YNLFiwgCVLlnD33XczatQoXn31Vd544w0WLVrEuHHjePDBB/nyyy958803qVGjBitXrmTEiBEcfvjh+dt+7733yMrKYtSoUbh7fjLL+9vatm3L8OHDWbFiBSNHjsxPVBdccAGtW7dm+vTp+Ym3NEVJYgebWdXwcb3iFjSzLODamEmNiTNE391vC5d/gEKlrMxsADAAoGb9ZhHCExEpHXlFd+fNm0dubi6tWxdd+WT58uXcfPPNmBk//PADrVq14pNPPuHOO4P6ELG1FQu78MILmTVrFrt27eKiiy4iJyeH5cuX53+Vybp16/ITBcCtt97KmDFjyM3N5dZbb92tPmOevOLAxx9/fH5Lr3nz5mRkZHD88cezYsUKVq1axa9//WsgKPZ7xx13AEF5rBo1ahQZc4cOHViwYAFXXHEFZ511Fr169Sow//HHH2fGjBlUqlSpQHzxChWXpihJbCLwcPj4T8Ut6O7ZQHbeczNrCYwi6E4caWYDgSnA74BfAF/E2caUcBlqNz5a96iJSAHxWlClJa/o7pAhQwDYsWMHX331VZHL9uzZM/8knZuby+uvv85bb73FGWeckd8Siz2h5+natSsXXHABANdeey2ZmZk0b96cefPmUblyZXbs2FFgvcaNGzN16lTefPNN7r33Xs4880yWLVsGwLJlyzj99NMB8osDL126NL9Q8QcffMDOnTvzpzVp0iR/uaIKGmdmZu72bdM7d+5k9OjRQJAke/XqVSDGSZMm8d577/Hpp5/Sv//PA9nztpuZmVmgGn5pSVSx4xhgG3BXOCmppOLuS4AlMZMmh7/T/+qmiOxzunXrxuDBg+nYsSMA119/fX6rpbBbbrmFAQMG8N1331GpUiWmTp3KzTffzJVXXsmYMWNo06YNY8eO5dBDD+Wiiy7Kb6EBVKtWjQMPPJCMjIz87+D6/e9/T6dOnTAzjjnmGB544IH85UeNGsVbb73FDz/8wD333EPLli2ZMGEC7777LhkZP5/GMzMzOeuss9i6dSvPPvssmzdv5pe//CXdu3dn/fr1zJgxg3r16nH66afTpk0b9ttvv7hdk2eeeSaDBg3ikksuYeDA4C6rd955h1tuuYUdO3bktxhbtWpF9+7dGTJkCK1ataJDhw506NAh7vE69dRT6d27Nx988EGpDnAptgCwmY0MH+Yv5O6jS23vCagAcPpSAeD0pALA+67Y63V5Vq1axYgRI3jiiSfKMbLipbQAsLvfYWYZwAkEXYLq3hMRkbQR5ZrYAwQ3Ob8LnAwsTGlEIiKStKysrPyh9nmaNGmS1q2w0hDlZufNwLKwG1EJTERE0kaUlth7AGb2d2BNasMRERGJLkoSe9nd1wMzzOzgVAckIiISVZTuxJtiHt+QqkBERNKRCgCX3KpVq+jdu/eeB1SMKEmsdszjOqkKREQkHakAcHqLksSeNLNnzewZ4G+pDkhEpLy4O9dccw0dO3bknHPOYePGjQUKAA8bNoyZM2cyYsQI1q9fT7du3Tj99NMZNGgQAGvXrqVr165kZWUxfPhwpkyZkl8kd9myZbRr145t27bRuXPn/H126tSJ7du388ILL9ChQwfatGnD3LlzC8T13HPP0apVKzp27MiLL77I9OnTmTp1KhDcCJ2dnU12djZdunSha9eudOzYkQ0bNrBq1Sratm1Lt27dOPXUU/nss88AuPvuu2nbti0dO3bkiy+CwkktWrSgZ8+ejBkzhrlz53LFFVcwYcKEAnFMnTqV9u3b0759+/yK9M2bN+fyyy+nRYsWvP/++wDcfvvttG/fnnHjxpX+i1RIooodVd39ZeDlONO3pjQyEZE4VAC4fAoA5+TkMGfOHBYuXMjGjRu56qqrmD17NuvWreORRx5hyZIlPProo9StW5d33nmH119/nb/+9a+8/PLLcWMtLYkGdowzMwc+AjYBTcOfGcAbKY1MRKSMqQBw0QWAV65cydKlS/PrNOY5/PDDqVq1Kg0bNmTTpk18/vnn+dtv2bJl+SYxd7/BzGoDrYH9gdfcfUJx64iIpJIKAJdPAeCmTZty8sknM2vWrPxjA+yWUBs3bpwf23vvvVfc4S4VCYfYu/sG9I3OIrIPUAHgQLwCwAcffHD+KM3KlSvTsWNHbrvttt3WrV+/Pi1btqR9+/a0aNGiBK9CcootAFzeVAA4fakAcHpSAeB9175aADjK6EQREZG0FKVih4iIpDkVABYREalglMRERKTCUhITEZEKS0lMRCSUnZ3NiBEjgPIt1jt37lz+8Y+CdzZlZ2czatSoPd527969WbVq1R5vJ11oYIeISBylWaw378bnqMvGlpyS4imJiYjE0a5dOxYtWkRWVhYtW7Zk4cKFDBw4kL59+/L2229z0003sWPHDvr160efPn0YN24cc+fOZevWrUyePJkTTjiBrKwsWrVqxZo1awqMEpw8eTLTp0/ntNNO4+233yY7O7vAsmeccQa5ubn069ePq666ii+++IJ69eoVqGUIsH79evr27cvmzZs5+uijmTRpEqNGjWLlypWsWbOGJk2aMHXqVD777DN+85vfULduXTZt2lTGRzK1lMREpEK5fu71vL/2/T3axvH1jmfiWRMjL9+zZ0/Gjh1L586d6du3L7fffjtz5syhVq1adO7cmSuuuILrrruO4cOHs2LFCkaOHMmMGTMAuOCCCwrUYMzNzWX69Om88cYbLF68mLfffjt/Xt6y06dPB+Cdd96hcuXKzJ8/n7Fjx7J9+/YCcd111127FSGGoIbiY489RpcuXdi0aRMTJkzg3nvv5ZRTTimTKhplKe2TWE4OTJsGffpAHX2bmYiUg+OOO47MzMz8LsGlS5fSrVs3IKjuvn79el544QVmzJixW73EvNqKeXJycmjUqBGVK1fm+OOPLzCv8LIrV67ML+rbsmXL/CSVJ14R4rx4ARo0aMB3332Xv52MjIwiy2hVVGmfxKZNg2HDgsdDh5ZvLCJS/pJpQZWWwkV8TzjhBGbNmkWNGjXYsWMHmZmZTJo0iffee49PP/2U/v375y9b+FpYnTp1WL16Nbt27eI///lPgXmFl23atCmvvfYaEL+YbrwixMuWLdutKG/Tpk1ZunQprVq1yi/Ou7dI+yTWp0/B3yIi5e2OO+7gvPPOw92pXbs2zz77LK1ataJDhw506NCh2HUzMjK48soradOmDa1btyYzM7PIZU855RQefPBBOnXqROPGjWnUqFGB+fGKEMdz4403cvnll1O3bl3q1q2b/B+cxlQAWEpEBYDTkwoAVwy5ublkZGTw9ttv88gjj/DQQw+Vd0jlZk8LAKd9S0xEZG9z3333MXv2bLZv317ktzRLNEpiIiJl7IYbbuCGG24o7zD2CqrYISIVRjpf/pDklcbrqSQmIhVCZmYmW7duLe8wpBRt3bq12IEtUag7UUQqhDp16uxVNf8kUL9+/T1aX0lMRCqEAw88kAMPPLC8w5A0k9IkZmYnAhcC1YHb3H1LOP1SoBGwyt2fSWUMIiKy90r1NbHLgFHAbKBzzPRewA8p3reIiOzlSrUlZmZZwLUxkxoD8YafVHH3B81sClCgJWZmA4AB4dNtZvZBaca4D6gD5JTVzqyPJV4ovZXp8SorTw9M6eb3ymOWQjpeyTkymYVTWrHDzFoC3Qm6E0cCPYEpwA1ALlDb3UcWs/7iZO7cFh2zZOl4JU/HLDk6XslJ9nil9JqYuy8BlsRMmhz+vieV+xURkX2D7hMTEZEKK92T2JTyDqAC0jFLjo5X8nTMkqPjlZykjldaV7EXEREpTrq3xERERIqUVhU74t0cbWa/B3YB7u5/LtcA00wRx2sQcBDB8RpTrgGmoSKOmQHjga/cfWJ5xpduijheKlZQjCKO2QRgLXCIu6t8fQwzOwK4BZjt7rPDaVcS3JpQw91HF7d+urXE4t0cfWh4YmlSLhGlt92Ol7tPAu4GDim3qNJbvPfY74BnyymedBfveKlYQfHiHbMMoCbwbfmElL7c/RNgeqHJx7v7PQBmdmBx66dbEoP4N0cXN31fV+C4mFlVYFz4I/HlHzMzqw38CjgbOM3MqpRbVOmr8P9eFXd/kIJVeKSgwsfsc3e/AzigPIKpwBKe99OqOxF4kuATTHXgMzOrBHxhZtcDq8ovrLQV73g9BXwIdAEeLr/Q0laBYwZscvfrzKwJ0N3dt5VjbOko3ntsrpldB3xdnoGlsXjH7LDwmOm7ZAoxs3rAxUA1MzsAmAe8b2ZDANx9U7Hra3SiiIhUVOnYnSgiIhKJkpiIiFRYSmIiIlJhKYmJiEiFlW6jE0X2CWZWDfgT0AD4BdAQ6OPuC8o1MJEKRqMTRcpR+EWyxxHcPJxDUKXgdOAngiHsmeH8HsBpwDlANeBZd3+57CMWSS/qThRJP/PcfSDQwd1HAO8AxwKDgU0Eya1V+YUnkj7UnSiSfr4Pf68Pf28HqhB86Bzj7rnlEpVIGlISE6k4/h8w1cw2AIvd/a/lHZBIedM1MRERqbB0TUxERCosJTEREamwlMRERKTCUhITEZEKS0lMREQqLCUxERGpsJTERESkwvr/1CYCUGj9tAoAAAAASUVORK5CYII=", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "##in order to perform the convolution dist_2 needs a one_mutation parameter (as this should be a BranchLenInterpolator object)\n", "dist_2_bl.one_mutation = 0\n", "\n", "grid_size = [100, 200, 300, 500, 1000] #more desired grid_sizes, true grid size is given as output when the accuracy_and_time function is called\n", "time_fft = np.empty((len(grid_size),2))\n", "accuracy_fft = []\n", "time_num = np.empty((len(grid_size),2))\n", "accuracy_num = []\n", "for t in range(len(grid_size)):\n", " #print(t)\n", " time_fft_full = accuracy_and_time(dist_1_bl, dist_2_bl, \"fft\", grid_size[t])\n", " time_fft[t] = time_fft_full[1:3]\n", " accuracy_fft.append(time_fft_full[0])\n", " time_num_full = accuracy_and_time(dist_1_bl, dist_2_bl, \"num\", grid_size[t])\n", " time_num[t] = time_num_full[1:3]\n", " accuracy_num.append(time_num_full[0])\n", " \n", "print_relative_diff_grids()\n", "print_relative_diff_grids_lin()" ] } ], "metadata": { "interpreter": { "hash": "35b358debfdfecb29483348a0ca62fbbe01dcc9035e6f38f823a2b6d9d10fa8d" }, "kernelspec": { "display_name": "Python 3.9.5 64-bit ('base': conda)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.10" }, "orig_nbformat": 4 }, "nbformat": 4, "nbformat_minor": 2 } treetime-0.11.1/test/fft_tests.py000066400000000000000000000217021447636507100167610ustar00rootroot00000000000000## script to compare numerical to fft calculation of convolution integrals, ## will look closer at distributions at nodes where there is a large difference ## between the two different inferred divergence times import numpy as np import matplotlib.pyplot as plt import pandas as pd from treetime import TreeTime from treetime.utils import parse_dates from treetime.distribution import Distribution def get_test_nodes(tree_list, pattern): return [[n for n in tt.tree.find_clades() if pattern in n.name][0] for tt in tree_list] def get_tree_events(tt): tree_events_tt = sorted([(n.time_before_present, n.name, int(n.bad_branch)) for n in tt.tree.find_clades()], key=lambda x:-x[0]) return tree_events_tt def compare(new_times_and_names, old_times_and_names): new_times_and_names = pd.DataFrame(new_times_and_names) old_times_and_names = pd.DataFrame(old_times_and_names) old_times_and_names = old_times_and_names.set_index(1) new_times_and_names = new_times_and_names.set_index(1) old_times_and_names = old_times_and_names.reindex(index=new_times_and_names.index) bad_branches = np.float_(old_times_and_names.iloc[:,1]) + 2*np.float_(new_times_and_names.iloc[:,1]) df = pd.DataFrame(dict(time=np.float_(new_times_and_names.iloc[:,0]), difference=(np.float_(new_times_and_names.iloc[:,0])-np.float_(old_times_and_names.iloc[:,0])), bad_branch=bad_branches), index=new_times_and_names.index) return np.all(new_times_and_names.iloc[:,0]==old_times_and_names.iloc[:,0]), df def get_large_differences(df): large_differences = df[abs(df.difference) > abs(np.mean(df.difference)) + 2*np.std(df.difference)] return large_differences def plot_differences(df, title=None): groups = df.groupby('bad_branch') fig = plt.figure() for name, group in groups: plt.plot(df.time, df.difference, marker='o', linestyle='', ms=1, label=name) plt.xlabel("nodes ranging from root at 0 to most recent") plt.ylabel("difference time_before_present fft - numerical") if title: plt.title(title) plt.show() return fig def compare_dist(node_num, node_fft, dist_node_num, dist_node_fft, dist_name, xlimits=None): fig = plt.figure() plt.plot(dist_node_num.x, dist_node_num.prob_relative(dist_node_num.x), marker='o', linestyle='', ms=2, label='numerical') plt.plot(dist_node_fft.x, dist_node_fft.prob_relative(dist_node_fft.x), marker='o', linestyle='', ms=1, label='fft') if xlimits: if xlimits!='empty': plt.xlim(xlimits) else: x_min = min(node_num.time_before_present, node_fft.time_before_present) x_max = max(node_num.time_before_present, node_fft.time_before_present) plt.xlim((x_min-0.0001, x_max+0.0001)) plt.title(node_num.name + "_" + dist_name) plt.legend() plt.show() return fig if __name__ == '__main__': plt.ion() ##model parameters for testing # choose if should be tested on ebola or h3n2_na dataset ebola=True if ebola: base_name = '../treetime_examples/data/ebola/ebola' clock_rate = 0.0001 else: base_name = '../treetime_examples/data/h3n2_na/h3n2_na_20' clock_rate = 0.0028 seq_kwargs = {"marginal_sequences":True, "branch_length_mode": 'input', "sample_from_profile":"root", "reconstruct_tip_states":False} tt_kwargs = {'clock_rate':clock_rate, 'time_marginal':'assign'} coal_kwargs ={'Tc':10000, 'time_marginal':'assign'} dates = parse_dates(base_name+'.metadata.csv') tt = TreeTime(gtr='Jukes-Cantor', tree = base_name+'.nwk', use_fft=False, aln = base_name+'.fasta', verbose = 1, dates = dates, precision=3, debug=True) tt_fft = TreeTime(gtr='Jukes-Cantor', tree = base_name+'.nwk', use_fft=True, precision_fft=200, aln = base_name+'.fasta', verbose = 1, dates = dates, precision=3, debug=True) for tree in [tt, tt_fft]: tree._set_branch_length_mode(seq_kwargs["branch_length_mode"]) tree.infer_ancestral_sequences(infer_gtr=False, marginal=seq_kwargs["marginal_sequences"]) tree.prune_short_branches() tree.clock_filter(reroot='least-squares', n_iqd=1, plot=False, fixed_clock_rate=tt_kwargs["clock_rate"]) tree.reroot(root='least-squares', clock_rate=tt_kwargs["clock_rate"]) tree.infer_ancestral_sequences(**seq_kwargs) tree.make_time_tree(clock_rate=tt_kwargs["clock_rate"], time_marginal=tt_kwargs["time_marginal"]) tree_events_tt = get_tree_events(tt) tree_events_tt_fft = get_tree_events(tt_fft) output_comparison = compare(tree_events_tt_fft, tree_events_tt) plot_differences(output_comparison[1]) large_differences = get_large_differences(output_comparison[1]) def closer_look_differences(): ##look closer at the distribution objects where there is a large difference between the two different methods for n in list(large_differences.index): test_node, test_node_fft = get_test_nodes([tt, tt_fft], n) if test_node.name != tt.tree.root.name and not test_node.marginal_pos_LH.is_delta: #compare marginal_pos_LH compare_dist(test_node, test_node_fft, test_node.marginal_pos_LH, test_node_fft.marginal_pos_LH, 'pos_LH') #compare msg_from_parent compare_dist(test_node, test_node_fft, test_node.msg_from_parent, test_node_fft.msg_from_parent, 'msg_from_parent') #compare subtree_distribution compare_dist(test_node, test_node_fft, test_node.subtree_distribution, test_node_fft.subtree_distribution, 'subtree_dist') #compare branch_length_interpolator compare_dist(test_node, test_node_fft, test_node.branch_length_interpolator, test_node_fft.branch_length_interpolator, 'branch length dist', xlimits='empty') #compare marginal_pos_Lx xlimits = (test_node.up.time_before_present-0.01,test_node.up.time_before_present+0.01) compare_dist(test_node, test_node_fft, test_node.marginal_pos_Lx, test_node_fft.marginal_pos_Lx, 'marginal_pos_Lx', xlimits=xlimits) #compare marginal_pos_LH of parent print("The parent of numerical is: " + str(test_node.up.name) + " the parent of fft is: " + str(test_node_fft.up.name)) compare_dist(test_node.up, test_node_fft.up, test_node.up.marginal_pos_LH, test_node_fft.up.marginal_pos_LH, 'pos_LH parent') #compare marginal_pos_LH of children print("Now looking at children of node of interest") for c in test_node.clades: test_node, test_node_fft = get_test_nodes([tt, tt_fft], c.name) print("Time difference is " + str(test_node.time_before_present - test_node_fft.time_before_present )) print("Time of numerical:" + str(test_node.time_before_present) + " time of fft:"+ str(test_node_fft.time_before_present)) if test_node.marginal_pos_LH.is_delta: print("delta") else: compare_dist(test_node, test_node_fft, test_node.marginal_pos_LH, test_node_fft.marginal_pos_LH, 'pos_LH') closer_look_differences() ##now do the same for when the coalescent model is added for tree in [tt, tt_fft]: tree.add_coalescent_model(coal_kwargs ["Tc"]) tree.make_time_tree(clock_rate=tt_kwargs ["clock_rate"], time_marginal=coal_kwargs ["time_marginal"]) tree_events_tt = get_tree_events(tt) tree_events_tt_fft = get_tree_events(tt_fft) output_comparison = compare(tree_events_tt_fft, tree_events_tt) large_differences = get_large_differences(output_comparison[1]) #plot_differences(output_comparison[1]) closer_look_differences() nodes_to_look_at = ['NODE_0000120', 'NODE_0000098'] def compare_multiply_functions(nodes_of_interest): ## code to look closer at the msgs of a child of a node and behavior of functions for n in nodes_of_interest: test_node, test_node_fft = get_test_nodes([tt, tt_fft], n) print([c.name for c in test_node.clades]) print([c.name for c in test_node_fft.clades]) msgs_to_multiply_tt_fft = [child.marginal_pos_Lx for child in test_node_fft.clades if child.marginal_pos_Lx is not None] msgs_to_multiply_tt = [child.marginal_pos_Lx for child in test_node.clades if child.marginal_pos_Lx is not None] subtree_distribution_tt = Distribution.multiply(msgs_to_multiply_tt) subtree_distribution_tt_fft = Distribution.multiply(msgs_to_multiply_tt_fft) compare_dist(test_node, test_node_fft, subtree_distribution_tt, subtree_distribution_tt_fft, 'multiplied Lx of children') # nodes_to_look_at = ['NODE_0000120', 'NODE_0000098'] # compare_multiply_functions(nodes_to_look_at)treetime-0.11.1/test/fft_timer.py000066400000000000000000000317771447636507100167540ustar00rootroot00000000000000#!/usr/bin/env python ## code for determining the optimal grid spacing for the FFT version, using time and memory usage ## as well as accuracy estimations based on convergence and positional likelihood of tree ## needs an output results folder import numpy as np import matplotlib.pyplot as plt from matplotlib.backends.backend_pdf import PdfPages import time import pandas as pd from mpl_toolkits.axes_grid1 import host_subplot import mpl_toolkits.axisartist as AA from treetime import TreeTime from treetime.utils import parse_dates from resource import getrusage, RUSAGE_SELF from fft_tests import get_tree_events, compare, plot_differences def sort(df_list): for i in range(0, len(df_list)): df_list[i] = pd.DataFrame(df_list[i]).set_index(1) for i in range(1, len(df_list)): df_list[i]= df_list[i].reindex(index=df_list[0].index) return df_list def run_first_round(tree, kwargs): tree._set_branch_length_mode(kwargs["branch_length_mode"]) tree.infer_ancestral_sequences(infer_gtr=False, marginal=kwargs["marginal_sequences"]) tree.prune_short_branches() tree.clock_filter(reroot='least-squares', n_iqd=1, plot=False, fixed_clock_rate=kwargs["clock_rate"]) tree.reroot(root='least-squares', clock_rate=kwargs["clock_rate"]) tree.infer_ancestral_sequences(**kwargs) tree.make_time_tree(clock_rate=kwargs["clock_rate"], time_marginal=kwargs["time_marginal"], divide=False) peak_memory = getrusage(RUSAGE_SELF).ru_maxrss return peak_memory def plot_accuracy_memory_time(branch_grid_size, accuracy, time_branch, memory_branch, accuracy_label, title): plt.figure() host = host_subplot(111, axes_class=AA.Axes) plt.subplots_adjust(right=0.75) par1 = host.twinx() par2 = host.twinx() offset = 60 new_fixed_axis = par2.get_grid_helper().new_fixed_axis par2.axis["right"] = new_fixed_axis(loc="right", axes=par2, offset=(offset, 0)) par2.axis["right"].toggle(all=True) par1.axis["right"].toggle(all=True) host.set_xlabel("Branch Grid Size") host.set_ylabel(accuracy_label) par1.set_ylabel("Time [sec]") par2.set_ylabel("Memory Consumption [MB]") if len(accuracy)==(len(branch_grid_size)-1): p1, = host.plot(branch_grid_size[1:], accuracy, label=title) p2, = par1.plot(branch_grid_size, np.array(time_branch), label='time') p3, = par2.plot(branch_grid_size, np.array(memory_branch), label='memory consumption') else: p1, = host.plot(branch_grid_size, accuracy, label=title) p2, = par1.plot(branch_grid_size, np.array(time_branch), label='time') p3, = par2.plot(branch_grid_size, np.array(memory_branch), label='memory consumption') host.legend() host.axis["left"].label.set_color(p1.get_color()) par1.axis["right"].label.set_color(p2.get_color()) par2.axis["right"].label.set_color(p3.get_color()) plt.draw() plt.show() plt.title(title + " - FFT Grid Size=" + str(prec_fft)) plt.savefig("./results/Memory_Time_" + str(title)+ ".png") if __name__ == '__main__': ##model parameters for testing # choose if should be tested on ebola or h3n2_na dataset ebola=True if ebola: node_pattern = 'EM_004555' base_name = '../treetime_examples/data/ebola/ebola' clock_rate = 0.0001 else: node_pattern = 'Indiana' base_name = '../treetime_examples/data/h3n2_na/h3n2_na_20' clock_rate = 0.0028 dates = parse_dates(base_name+'.metadata.csv') ##time the calculation and assess accuracy as difference from tt_numerical and other fft start = time.process_time() tt_numerical = TreeTime(gtr='Jukes-Cantor', tree = base_name+'.nwk', use_fft=False, aln = base_name+'.fasta', verbose = 1, dates = dates, precision=3, debug=True) kwargs = {"marginal_sequences":True, "branch_length_mode": 'input', "sample_from_profile":"root", "reconstruct_tip_states":False, "max_iter":1, 'clock_rate':clock_rate, 'time_marginal':'assign'} memory_numerical = run_first_round(tt_numerical, kwargs) print(memory_numerical) tree_make_time = time.process_time() - start tree_events_numerical = get_tree_events(tt_numerical) print("Time to make tree using ultra fine numerical grid: " + str(tree_make_time)) numerical_LH= tt_numerical.tree.positional_LH print("likelihood of tree under numerical:" + str(numerical_LH)) precision_fft = [5, 25, 50, 75, 100, 150, 200, 300, 400] branch_grid_size = [50, 75, 100, 150, 200, 300, 400] def find_optimal_branch_fft_gridsizes(precision_fft, branch_grid_size): ''' Given an input list of FFT and branch grid sizes perform the first iteration of the run function for each combination, determine the inferred divergence times for each new timetree and plot the average rate of change in inferred divergence time for each branch length when changing the fft grid size ''' time_fft = [] #time needed to make fft divergence_times_fft_list = [] divergence_time_diff_list = [] pp = PdfPages('./results/DifferencesComparison.pdf') #output the difference plots to visually assess if there is an issue for b in branch_grid_size: pre_divergence_times_fft_list =[] pre_time_fft = [] for prec in precision_fft: start = time.process_time() tt_fft = TreeTime(gtr='Jukes-Cantor', tree = base_name+'.nwk', precision_fft=prec, use_fft=True, aln = base_name+'.fasta', verbose = 1, dates = dates, precision=3, precision_branch=b, debug=True) run_first_round(tt_fft, kwargs) tree_make_time_fft = time.process_time() - start print("Time to make tree using fft grid of size " + str(prec) +" :"+str(tree_make_time_fft)) tree_events_fft = get_tree_events(tt_fft) if len([t[1] for t in tree_events_fft if np.isnan(t[0])])>0: print("error in tree! a clade has no time before present!") pre_time_fft.append(tree_make_time_fft) pre_divergence_times_fft_list.append(tree_events_fft) output_comparison = compare(tree_events_numerical, tree_events_fft) fig = plot_differences(output_comparison[1], title="Differences branch grid " + str(b) + " fft grid " + str(prec)) pp.savefig(fig) time_fft.append([pre_time_fft]) sorted_treelist = sort(pre_divergence_times_fft_list) divergence_times = [] for i in range(0, len(sorted_treelist)): if len([t for t in sorted_treelist[i][0] if np.isnan(t)])>0: print("error in sort function! a clade's time has been lost!") divergence_times.append(np.array(sorted_treelist[i][0])) divergence_times_fft_list.append([divergence_times]) divergence_time_diff = [] for i in range(1, len(divergence_times)): divergence_time_diff.append(np.mean(np.abs(divergence_times[i] - divergence_times[i-1])/(precision_fft[i] - precision_fft[i-1]))) divergence_time_diff_list.append([divergence_time_diff]) pp.close() #for each possible branch length grid size plot the divergence time differences for different fft grid sizes plt.figure() for i in range(0, len(divergence_time_diff_list)): epsilon = 1e-9 plt.plot(precision_fft[1:len(divergence_times_fft_list[i][0])], divergence_time_diff_list[i][0], 'o-', label=branch_grid_size[i]) plt.legend(title="branch grid size") plt.axhline(y=epsilon, color='black', linestyle='--') plt.ylabel("log(average rate of change)") plt.xlabel("FFT grid size") plt.yscale('log') plt.title("Change in Infered Divergence Times - Average Rate of Change") plt.savefig("./results/Optimal_Grid_Size.png") return time_fft, divergence_times_fft_list, divergence_time_diff_list time_fft, divergence_times_fft_list, divergence_time_diff_list = find_optimal_branch_fft_gridsizes(precision_fft, branch_grid_size) prec_fft = 175 def find_optimal_branch_gridsizes(prec_fft, branch_grid_size): """ For a given (optimal) FFT grid size plot the change of accuracy (either by the average rate of change or the LH) and the memory and time consumption at each branch grid size """ time_branch = [] memory_branch = [] fft_LH = [] pre_divergence_times_fft_list =[] for b in branch_grid_size: start = time.process_time() tt_fft = TreeTime(gtr='Jukes-Cantor', tree = base_name+'.nwk', precision_fft=prec_fft, use_fft=True, aln = base_name+'.fasta', verbose = 1, dates = dates, precision=3, precision_branch = b, debug=True) memory_fft = run_first_round(tt_fft, kwargs) tree_make_time_fft = time.process_time() - start print("Time to make tree using fft grid of size " + str(150) +" :"+str(tree_make_time_fft)) tree_events_fft = get_tree_events(tt_fft) if len([t[1] for t in tree_events_fft if np.isnan(t[0])])>0: print("error in tree! a clade has no time before present!") time_branch.append(tree_make_time_fft) memory_branch.append(memory_fft) pre_divergence_times_fft_list.append(tree_events_fft) output_comparison = compare(tree_events_numerical, tree_events_fft) plot_differences(output_comparison[1], title="Differences branch grid " + str(b) + " fft grid " + str(prec_fft)) fft_LH.append(tt_fft.tree.positional_LH) print("likelihood of tree under fft:" + str(tt_fft.tree.positional_LH)) sorted_treelist = sort(pre_divergence_times_fft_list) divergence_times = [] for i in range(0, len(sorted_treelist)): divergence_times.append(np.array(sorted_treelist[i][0])) if len([t for t in sorted_treelist[i][0] if np.isnan(t)])>0: print("error in sort function! a clade's time has been lost!") divergence_time_diff = [] for i in range(1, len(divergence_times)): divergence_time_diff.append(np.nanmean(np.abs(divergence_times[i] - divergence_times[i-1])/(branch_grid_size[i] - branch_grid_size[i-1]))) memory_branch = np.array(memory_branch)/(10**6) accuracy_rate = np.array(divergence_time_diff)/1e-8 plot_accuracy_memory_time(branch_grid_size, accuracy_rate, time_branch, memory_branch, "Average Rate of Change Inferred Time [1e-8]", "average_rate_of_change") plot_accuracy_memory_time(branch_grid_size, np.array(fft_LH), time_branch, memory_branch, "tree log(LH) ", "log(LH)") return time_branch, memory_branch, divergence_time_diff, fft_LH time_branch, memory_branch, divergence_time_diff, fft_LH = find_optimal_branch_gridsizes(prec_fft, branch_grid_size) ##after visualizing the differences in accuracy for all internal nodes I will also measure the difference in execution times by # running a conolution integral of a branch length interpolation distribution object and a likelihood distribution # def time_convolution(calc_type, grid_size): # node = names_fft[key] # tt = tt_fft # bl = BranchLenInterpolator(node, tt.gtr, pattern_multiplicity = tt.data.multiplicity, min_width= tt.min_width,one_mutation=tt.one_mutation, branch_length_mode=tt.branch_length_mode) # h = node.marginal_pos_LH # if calc_type=="fft": # start = time.process_time() # res = NodeInterpolator.convolve_fft(h, bl, fft_grid_size=int(grid_size/50)) # conv_time = time.process_time() - start # true_grid_size = len(res.y) # if calc_type=="num": # start = time.process_time() # res = NodeInterpolator.convolve(h, bl, n_grid_points=grid_size, n_integral=grid_size)[0] # conv_time = time.process_time() - start # true_grid_size = len(res.y) # return conv_time, true_grid_size # grid_size = [50, 75, 100, 150, 200, 300, 400, 600] # time_fft = np.empty((len(grid_size),2)) # time_num = np.empty((len(grid_size),2)) # for t in range(len(grid_size)): # #print(t) # time_fft[t] = time_convolution("fft", grid_size[t]) # time_num[t] = time_convolution("num", grid_size[t]) # #now additionally plot these differences # fig = plt.figure() # plt.autoscale() # plt.plot(time_fft[:,1], time_fft[:,0], linestyle='-',marker='o', color='red', label='FFT') # plt.plot(time_num[:,1], time_num[:,0], linestyle='-',marker='o', color='green', label='numerical') # plt.xlabel("Size of Grid [convolution output size]", fontsize=8) # plt.ylabel("Calculation Time [sec]", fontsize=8) # plt.title("Calculation Speed: " + str(names_numerical_3[key].name), fontsize=10) # plt.legend(prop={"size":8}) # #plt.show() # pp.savefig(fig) # plt.close() # pp.close() treetime-0.11.1/test/run_tests.py000066400000000000000000000003341447636507100170040ustar00rootroot00000000000000from test_treetime import * test_import_short() test_assign_gamma() test_GTR() test_ancestral() test_seq_joint_reconstruction_correct() test_seq_joint_lh_is_max() print('\n\n TEST HAVE FINISHED SUCCESSFULLY\n\n') treetime-0.11.1/test/test_calc_nbranches.py000066400000000000000000000113101447636507100207360ustar00rootroot00000000000000import matplotlib.pyplot as plt import numpy as np import time from treetime import TreeTime as TreeTime from treetime.utils import parse_dates from Bio import Phylo from fft_tests import get_test_nodes def add_merger_cost(test_node, tt, t): return test_node.branch_length_interpolator.prob(t)*np.exp(tt.merger_model.cost(test_node.time_before_present, t)) if __name__ == '__main__': ## checks difference between using posterior distributions for evaluating the number of lineages-nbranches function (smooth) vs old discrete approach plt.ion() ebola=False if ebola: base_name = '../treetime_examples/data/ebola/ebola' else: base_name = '../treetime_examples/data/h3n2_na/h3n2_na_20' dates = parse_dates(base_name+'.metadata.csv') tt_old= TreeTime(gtr='Jukes-Cantor', tree = base_name+'.nwk', aln = base_name+'.fasta', verbose = 1, dates = dates, precision=3, debug=True) tt_smooth= TreeTime(gtr='Jukes-Cantor', tree = base_name+'.nwk', aln = base_name+'.fasta', verbose = 1, dates = dates, precision=3, debug=True) fixed_clock_rate = 0.0028 for tt in [tt_old, tt_smooth]: tt.reroot(root='least-squares', clock_rate=fixed_clock_rate) tt.infer_ancestral_sequences(infer_gtr=False, marginal=False) tt.make_time_tree(clock_rate=fixed_clock_rate, time_marginal=False) #tt._ml_t_marginal(assign_dates=True) ## set the branch_count function using the smooth approach and time differences start = time.process_time() tt_smooth.add_coalescent_model(Tc=0.001, n_branches_posterior=True) print("Time for smooth nbranches (using posterior dist):" + str(time.process_time()-start)) start = time.process_time() tt_old.add_coalescent_model(Tc=0.001, n_branches_posterior=False) print("Time for discrete nbranches:" + str(time.process_time()-start)) if ebola: node_pattern= 'V517' else: node_pattern = 'Indiana' ## Plot differences in the nbranches interp1d object plt.figure() plt.plot(tt_old.merger_model.nbranches.x/tt_old.date2dist.clock_rate, tt_old.merger_model.nbranches.y, label="old nbranches function") plt.plot(tt_smooth.merger_model.nbranches.x/tt_smooth.date2dist.clock_rate, tt_smooth.merger_model.nbranches.y, label="new smooth nbranches function") plt.xlabel("time before present") plt.ylabel("nbranches") plt.legend() plt.xlim((0,40)) ## Plot effects on branch length distribution and cost function of coalescent test_nodes = get_test_nodes([tt_old, tt_smooth], node_pattern) while test_nodes[0] is not None: if test_nodes[0].name != tt.tree.root.name: plt.figure() t = np.linspace(0,4*fixed_clock_rate,1000) plt.plot(t, add_merger_cost(test_nodes[0], tt_old, t), label='old', ls='-') plt.plot(t, add_merger_cost(test_nodes[1], tt_smooth, t), label='smooth', ls='-') plt.legend() test_nodes =[test_node.up for test_node in test_nodes] ## Plot effects on final constructed time trees for tt in [tt_old, tt_smooth]: tt.make_time_tree(clock_rate=fixed_clock_rate, time_marginal=True) fig, axs = plt.subplots(1,2, sharey=True, figsize=(12,8)) Phylo.draw(tt_old.tree, label_func=lambda x:"", axes=axs[0]) axs[0].set_title("old time tree") Phylo.draw(tt_smooth.tree, label_func=lambda x:"", axes=axs[1]) axs[1].set_title("smooth time tree") ## Plot effects on final LH function test_nodes = get_test_nodes([tt_old, tt_smooth], node_pattern) next=0 fig, axs = plt.subplots(2,2, sharey=True, figsize=(12,8)) fig.suptitle("Effect of smooth nbranches on LH distribution") while test_nodes[0] is not None: if test_nodes[0].name != tt.tree.root.name: if next==0: i, j=0, 0 elif next==1: i, j=1, 0 elif next==2: i, j=0, 1 elif next==3: i, j=1, 1 t = np.linspace(test_nodes[0].time_before_present-0.005,test_nodes[0].time_before_present+0.003,2000) axs[i,j].plot(t, test_nodes[0].marginal_pos_LH.prob_relative(t), label='old', ls='-') axs[i,j].plot(t, test_nodes[1].marginal_pos_LH.prob_relative(t), label='smooth', ls='-') axs[i,j].set_xlabel("time before present") axs[i,j].set_ylabel("marginal LH") axs[i,j].legend() next += 1 if next==4: next=0 fig, axs = plt.subplots(2,2, sharey=True, figsize=(12,8)) fig.suptitle("Effect of smooth nbranches on LH distribution") test_nodes =[test_node.up for test_node in test_nodes] print("finished") treetime-0.11.1/test/test_sequence_evolution_model.txt000066400000000000000000000010441447636507100232770ustar00rootroot00000000000000Substitution rate (mu): 1.0 Equilibrium frequencies (pi_i): A: 0.3088 C: 0.1897 G: 0.2335 T: 0.2581 -: 0.0099 Symmetrized rates from j->i (W_ij): A C G T - A 0 0.7003 3.0669 0.2651 0.9742 C 0.7003 0 0.3354 3.399 0.999 G 3.0669 0.3354 0 0.4258 0.9892 T 0.2651 3.399 0.4258 0 0.9848 - 0.9742 0.999 0.9892 0.9848 0 Actual rates from j->i (Q_ij): A C G T - A 0 0.2163 0.9472 0.0819 0.3009 C 0.1328 0 0.0636 0.6448 0.1895 G 0.716 0.0783 0 0.0994 0.2309 T 0.0684 0.8772 0.1099 0 0.2541 - 0.0097 0.0099 0.0098 0.0098 0 treetime-0.11.1/test/test_treetime.py000066400000000000000000000306571447636507100176460ustar00rootroot00000000000000from __future__ import print_function from io import StringIO # Tests def test_import_short(): print("testing short imports") from treetime import GTR from treetime import TreeTime from treetime import TreeAnc from treetime import seq_utils def test_assign_gamma(root_dir=None): print("testing assign gamma") import os from treetime import TreeTime from treetime.utils import parse_dates if root_dir is None: root_dir = os.path.dirname(os.path.realpath(__file__)) fasta = root_dir + "/treetime_examples/data/h3n2_na/h3n2_na_20.fasta" nwk = root_dir + "/treetime_examples/data/h3n2_na/h3n2_na_20.nwk" dates = parse_dates(root_dir + "/treetime_examples/data/h3n2_na/h3n2_na_20.metadata.csv") seq_kwargs = {"marginal_sequences":True, "branch_length_mode": 'input', "reconstruct_tip_states":False} tt_kwargs = {'clock_rate': 0.0001, 'time_marginal':'assign'} myTree = TreeTime(gtr='Jukes-Cantor', tree = nwk, use_fft=False, aln = fasta, verbose = 1, dates = dates, precision=3, debug=True, rng_seed=1234) def assign_gamma(tree): return tree success = myTree.run(infer_gtr=False, assign_gamma=assign_gamma, max_iter=1, verbose=3, **seq_kwargs, **tt_kwargs) assert success def test_GTR(root_dir=None): from treetime import GTR import numpy as np import os if root_dir is None: root_dir = os.path.dirname(os.path.realpath(__file__)) ##check custom GTR model custom_gtr = root_dir + "/test_sequence_evolution_model.txt" gtr = GTR.from_file(custom_gtr) assert (gtr.Pi.sum() - 1.0)**2<1e-14 assert np.allclose(gtr.Pi, np.array([0.3088, 0.1897, 0.2335, 0.2581, 0.0099])) assert np.all(gtr.alphabet == np.array(['A', 'C', 'G', 'T', '-'])) assert abs(gtr.mu - 1.0) < 1e-4 assert abs(gtr.Q.sum(0)).sum() < 1e-14 assert np.allclose(gtr.W, np.array([[0, 0.7003, 3.0669, 0.2651, 0.9742], [0.7003, 0, 0.3354, 3.399, 0.999], [3.0669, 0.3354, 0, 0.4258, 0.9892], [0.2651, 3.399, 0.4258, 0, 0.9848], [0.9742, 0.999, 0.9892, 0.9848, 0]]), atol=1e-4) for model in ['Jukes-Cantor']: print('testing GTR, model:',model) myGTR = GTR.standard(model, alphabet='nuc') print('Frequency sum:', myGTR.Pi.sum()) assert (myGTR.Pi.sum() - 1.0)**2<1e-14 # the matrix is the rate matrix assert abs(myGTR.Q.sum(0)).sum() < 1e-14 # eigendecomposition is made correctly n_states = myGTR.v.shape[0] assert abs((myGTR.v.dot(myGTR.v_inv) - np.identity(n_states)).sum() < 1e-10) assert np.abs(myGTR.v.sum()) > 1e-10 # **and** v is not zero def test_reconstruct_discrete_traits(): from Bio import Phylo from treetime.wrappers import reconstruct_discrete_traits # Create a minimal tree with traits to reconstruct. tiny_tree = Phylo.read(StringIO("((A:0.60100000009,B:0.3010000009):0.1,C:0.2):0.001;"), 'newick') traits = { "A": "?", "B": "North America", "C": "West Asia", } # Reconstruct traits with "?" as missing data. mugration, letter_to_state, reverse_alphabet = reconstruct_discrete_traits( tiny_tree, traits, missing_data="?", ) # With two known states, the letters "A" and "B" should be in the alphabet # mapping to those states. assert "A" in letter_to_state assert "B" in letter_to_state # The letter for missing data should be the next letter in the alphabet, # following the two known state letters. assert letter_to_state["C"] == "?" def test_ancestral(root_dir=None): import os from Bio import AlignIO import numpy as np from treetime import TreeAnc, GTR if root_dir is None: root_dir = os.path.dirname(os.path.realpath(__file__)) fasta = str(os.path.join(root_dir, 'treetime_examples/data/h3n2_na/h3n2_na_20.fasta')) nwk = str(os.path.join(root_dir, 'treetime_examples/data/h3n2_na/h3n2_na_20.nwk')) for marginal in [True, False]: print('loading flu example') t = TreeAnc(gtr='Jukes-Cantor', tree=nwk, aln=fasta, rng_seed=1234) print('ancestral reconstruction' + ("marginal" if marginal else "joint")) t.reconstruct_anc(method='ml', marginal=marginal) assert t.data.compressed_to_full_sequence(t.tree.root.cseq, as_string=True) == 'ATGAATCCAAATCAAAAGATAATAACGATTGGCTCTGTTTCTCTCACCATTTCCACAATATGCTTCTTCATGCAAATTGCCATCTTGATAACTACTGTAACATTGCATTTCAAGCAATATGAATTCAACTCCCCCCCAAACAACCAAGTGATGCTGTGTGAACCAACAATAATAGAAAGAAACATAACAGAGATAGTGTATCTGACCAACACCACCATAGAGAAGGAAATATGCCCCAAACCAGCAGAATACAGAAATTGGTCAAAACCGCAATGTGGCATTACAGGATTTGCACCTTTCTCTAAGGACAATTCGATTAGGCTTTCCGCTGGTGGGGACATCTGGGTGACAAGAGAACCTTATGTGTCATGCGATCCTGACAAGTGTTATCAATTTGCCCTTGGACAGGGAACAACACTAAACAACGTGCATTCAAATAACACAGTACGTGATAGGACCCCTTATCGGACTCTATTGATGAATGAGTTGGGTGTTCCTTTTCATCTGGGGACCAAGCAAGTGTGCATAGCATGGTCCAGCTCAAGTTGTCACGATGGAAAAGCATGGCTGCATGTTTGTATAACGGGGGATGATAAAAATGCAACTGCTAGCTTCATTTACAATGGGAGGCTTGTAGATAGTGTTGTTTCATGGTCCAAAGAAATTCTCAGGACCCAGGAGTCAGAATGCGTTTGTATCAATGGAACTTGTACAGTAGTAATGACTGATGGAAGTGCTTCAGGAAAAGCTGATACTAAAATACTATTCATTGAGGAGGGGAAAATCGTTCATACTAGCACATTGTCAGGAAGTGCTCAGCATGTCGAAGAGTGCTCTTGCTATCCTCGATATCCTGGTGTCAGATGTGTCTGCAGAGACAACTGGAAAGGCTCCAATCGGCCCATCGTAGATATAAACATAAAGGATCATAGCATTGTTTCCAGTTATGTGTGTTCAGGACTTGTTGGAGACACACCCAGAAAAAACGACAGCTCCAGCAGTAGCCATTGTTTGGATCCTAACAATGAAGAAGGTGGTCATGGAGTGAAAGGCTGGGCCTTTGATGATGGAAATGACGTGTGGATGGGAAGAACAATCAACGAGACGTCACGCTTAGGGTATGAAACCTTCAAAGTCATTGAAGGCTGGTCCAACCCTAAGTCCAAATTGCAGATAAATAGGCAAGTCATAGTTGACAGAGGTGATAGGTCCGGTTATTCTGGTATTTTCTCTGTTGAAGGCAAAAGCTGCATCAATCGGTGCTTTTATGTGGAGTTGATTAGGGGAAGAAAAGAGGAAACTGAAGTCTTGTGGACCTCAAACAGTATTGTTGTGTTTTGTGGCACCTCAGGTACATATGGAACAGGCTCATGGCCTGATGGGGCGGACCTCAATCTCATGCCTATA' print('testing LH normalization') from Bio import Phylo,AlignIO tiny_tree = Phylo.read(StringIO("((A:0.60100000009,B:0.3010000009):0.1,C:0.2):0.001;"), 'newick') tiny_aln = AlignIO.read(StringIO(">A\nAAAAAAAAAAAAAAAACCCCCCCCCCCCCCCCGGGGGGGGGGGGGGGGTTTTTTTTTTTTTTTT\n" ">B\nAAAACCCCGGGGTTTTAAAACCCCGGGGTTTTAAAACCCCGGGGTTTTAAAACCCCGGGGTTTT\n" ">C\nACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGT\n"), 'fasta') mygtr = GTR.custom(alphabet = np.array(['A', 'C', 'G', 'T']), pi = np.array([0.9, 0.06, 0.02, 0.02]), W=np.ones((4,4))) t = TreeAnc(gtr=mygtr, tree=tiny_tree, aln=tiny_aln, rng_seed=1234) t.reconstruct_anc('ml', marginal=True, debug=True) lhsum = np.exp(t.sequence_LH(pos=np.arange(4**3))).sum() print (lhsum) assert(np.abs(lhsum-1.0)<1e-6) t.optimize_branch_len() def test_seq_joint_reconstruction_correct(): """ evolve the random sequence, get the alignment at the leaf nodes. Reconstruct the sequences of the internal nodes (joint) and prove the reconstruction is correct. In addition, compute the likelihood of the particular realization of the sequences on the tree and prove that this likelihood is exactly the same as calculated in the joint reconstruction """ from treetime import TreeAnc, GTR from treetime import seq_utils from Bio import Phylo, AlignIO import numpy as np from collections import defaultdict tiny_tree = Phylo.read(StringIO("((A:.060,B:.01200)C:.020,D:.0050)E:.004;"), 'newick') mygtr = GTR.custom(alphabet = np.array(['A', 'C', 'G', 'T']), pi = np.array([0.15, 0.95, 0.05, 0.3]), W=np.ones((4,4))) myTree = TreeAnc(gtr=mygtr, tree=tiny_tree, aln=None, verbose=4, rng_seed=1234) # simulate evolution, set resulting sequence as ref_seq tree = myTree.tree seq_len = 400 tree.root.ref_seq = myTree.rng.choice(mygtr.alphabet, p=mygtr.Pi, size=seq_len) print ("Root sequence: " + ''.join(tree.root.ref_seq.astype('U'))) mutation_list = defaultdict(list) for node in tree.find_clades(): for c in node.clades: c.up = node if hasattr(node, 'ref_seq'): continue t = node.branch_length p = mygtr.evolve( seq_utils.seq2prof(node.up.ref_seq, mygtr.profile_map), t) # normalize profile p=(p.T/p.sum(axis=1)).T # sample mutations randomly ref_seq_idxs = np.array([int(myTree.rng.choice(np.arange(p.shape[1]), p=p[k])) for k in np.arange(p.shape[0])]) node.ref_seq = np.array([mygtr.alphabet[k] for k in ref_seq_idxs]) node.ref_mutations = [(anc, pos, der) for pos, (anc, der) in enumerate(zip(node.up.ref_seq, node.ref_seq)) if anc!=der] for anc, pos, der in node.ref_mutations: mutation_list[pos].append((node.name, anc, der)) print (node.name, len(node.ref_mutations), node.ref_mutations) # set as the starting sequences to the terminal nodes: alnstr = "" i = 1 for leaf in tree.get_terminals(): alnstr += ">" + leaf.name + "\n" + ''.join(leaf.ref_seq.astype('U')) + '\n' i += 1 print (alnstr) myTree.aln = AlignIO.read(StringIO(alnstr), 'fasta') # reconstruct ancestral sequences: myTree.infer_ancestral_sequences(final=True, debug=True, reconstruct_leaves=True) diff_count = 0 mut_count = 0 for node in myTree.tree.find_clades(): if node.up is not None: mut_count += len(node.ref_mutations) diff_count += np.sum(node.sequence != node.ref_seq) if np.sum(node.sequence != node.ref_seq): print("%s: True sequence does not equal inferred sequence. parent %s"%(node.name, node.up.name)) else: print("%s: True sequence equals inferred sequence. parent %s"%(node.name, node.up.name)) # the assignment of mutations to the root node is probabilistic. Hence some differences are expected assert diff_count/seq_len<2*(1.0*mut_count/seq_len)**2 # prove the likelihood value calculation is correct LH = myTree.ancestral_likelihood() LH_p = (myTree.tree.sequence_LH) print ("Difference between reference and inferred LH:", (LH - LH_p).sum()) assert ((LH - LH_p).sum())<1e-9 def test_seq_joint_lh_is_max(): """ For a single-char sequence, perform joint ancestral sequence reconstruction and prove that this reconstruction is the most likely one by comparing to all possible reconstruction variants (brute-force). """ from treetime import TreeAnc, GTR from treetime import seq_utils from Bio import Phylo, AlignIO import numpy as np mygtr = GTR.custom(alphabet = np.array(['A', 'C', 'G', 'T']), pi = np.array([0.91, 0.05, 0.02, 0.02]), W=np.ones((4,4))) tiny_tree = Phylo.read(StringIO("((A:.0060,B:.30)C:.030,D:.020)E:.004;"), 'newick') #terminal node sequences (single nuc) A_char = 'A' B_char = 'C' D_char = 'G' # for brute-force, expand them to the strings A_seq = ''.join(np.repeat(A_char,16)) B_seq = ''.join(np.repeat(B_char,16)) D_seq = ''.join(np.repeat(D_char,16)) # def ref_lh(): """ reference likelihood - LH values for all possible variants of the internal node sequences """ tiny_aln = AlignIO.read(StringIO(">A\n" + A_seq + "\n" ">B\n" + B_seq + "\n" ">D\n" + D_seq + "\n" ">C\nAAAACCCCGGGGTTTT\n" ">E\nACGTACGTACGTACGT\n"), 'fasta') myTree = TreeAnc(gtr=mygtr, tree = tiny_tree, aln =tiny_aln, verbose = 4, rng_seed=1234) logLH_ref = myTree.ancestral_likelihood() return logLH_ref # def real_lh(): """ Likelihood of the sequences calculated by the joint ancestral sequence reconstruction """ tiny_aln_1 = AlignIO.read(StringIO(">A\n"+A_char+"\n" ">B\n"+B_char+"\n" ">D\n"+D_char+"\n"), 'fasta') myTree_1 = TreeAnc(gtr=mygtr, tree = tiny_tree, aln=tiny_aln_1, verbose = 4, rng_seed=1234) myTree_1.reconstruct_anc(method='ml', marginal=False, debug=True) logLH = myTree_1.tree.sequence_LH return logLH ref = ref_lh() real = real_lh() print(abs(ref.max() - real) ) # joint chooses the most likely realization of the tree assert(abs(ref.max() - real) < 1e-10) treetime-0.11.1/treetime/000077500000000000000000000000001447636507100152435ustar00rootroot00000000000000treetime-0.11.1/treetime/CLI_io.py000066400000000000000000000305511447636507100167170ustar00rootroot00000000000000import os, sys from Bio import AlignIO, Phylo from .vcf_utils import read_vcf, write_vcf from .seq_utils import alphabets from Bio import __version__ as bioversion from . import version as treetime_version import numpy as np def get_outdir(params, suffix='_treetime'): if params.outdir: if os.path.exists(params.outdir): if os.path.isdir(params.outdir): return params.outdir.rstrip('/') + '/' else: print("designated output location %s is not a directory"%params.outdir, file=sys.stderr) else: os.makedirs(params.outdir) return params.outdir.rstrip('/') + '/' from datetime import datetime outdir_stem = datetime.now().date().isoformat() outdir = outdir_stem + suffix.rstrip('/')+'/' count = 1 while os.path.exists(outdir): outdir = outdir_stem + '-%04d'%count + suffix.rstrip('/')+'/' count += 1 os.makedirs(outdir) return outdir def get_basename(params, outdir): # if params.aln: # basename = outdir + '.'.join(params.aln.split('/')[-1].split('.')[:-1]) # elif params.tree: # basename = outdir + '.'.join(params.tree.split('/')[-1].split('.')[:-1]) # else: basename = outdir return basename def read_in_DRMs(drm_file, offset): import pandas as pd DRMs = {} drmPositions = [] df = pd.read_csv(drm_file, sep='\t') for mi, m in df.iterrows(): pos = m.GENOMIC_POSITION-1+offset #put in correct numbering drmPositions.append(pos) if pos in DRMs: DRMs[pos]['alt_base'][m.ALT_BASE] = m.SUBSTITUTION else: DRMs[pos] = {} DRMs[pos]['drug'] = m.DRUG DRMs[pos]['alt_base'] = {} DRMs[pos]['alt_base'][m.ALT_BASE] = m.SUBSTITUTION DRMs[pos]['gene'] = m.GENE drmPositions = np.array(drmPositions) drmPositions = np.unique(drmPositions) drmPositions = np.sort(drmPositions) DRM_info = {'DRMs': DRMs, 'drmPositions': drmPositions} return DRM_info def read_if_vcf(params): """ Checks if input is VCF and reads in appropriately if it is """ ref = None aln = params.aln fixed_pi = None if hasattr(params, 'aln') and params.aln is not None: if any([params.aln.lower().endswith(x) for x in ['.vcf', '.vcf.gz']]): if not params.vcf_reference: print("ERROR: a reference Fasta is required with VCF-format alignments") return -1 compress_seq = read_vcf(params.aln, params.vcf_reference) sequences = compress_seq['sequences'] ref = compress_seq['reference'] aln = sequences if not hasattr(params, 'gtr') or params.gtr=="infer": #if not specified, set it: alpha = alphabets['aa'] if params.aa else alphabets['nuc'] fixed_pi = [ref.count(base)/len(ref) for base in alpha] if fixed_pi[-1] == 0: fixed_pi[-1] = 0.05 fixed_pi = [v-0.01 for v in fixed_pi] return aln, ref, fixed_pi def plot_rtt(tt, fname): tt.plot_root_to_tip() from matplotlib import pyplot as plt plt.savefig(fname) print("--- root-to-tip plot saved to \n\t"+fname) def export_sequences_and_tree(tt, basename, is_vcf=False, zero_based=False, report_ambiguous=False, timetree=False, confidence=False, reconstruct_tip_states=False, tree_suffix=''): seq_info = is_vcf or tt.aln if is_vcf: outaln_name = basename + f'ancestral_sequences{tree_suffix}.vcf' write_vcf(tt.get_reconstructed_alignment(reconstruct_tip_states=reconstruct_tip_states), outaln_name) elif tt.aln: outaln_name = basename + f'ancestral_sequences{tree_suffix}.fasta' AlignIO.write(tt.get_reconstructed_alignment(reconstruct_tip_states=reconstruct_tip_states), outaln_name, 'fasta') if seq_info: print("\n--- alignment including ancestral nodes saved as \n\t %s\n"%outaln_name) # decorate tree with inferred mutations terminal_count = 0 offset = 0 if zero_based else 1 if timetree: dates_fname = basename + f'dates{tree_suffix}.tsv' fh_dates = open(dates_fname, 'w', encoding='utf-8') if confidence: fh_dates.write('#Lower and upper bound delineate the 90% max posterior region\n') fh_dates.write('#node\tdate\tnumeric date\tlower bound\tupper bound\n') else: fh_dates.write('#node\tdate\tnumeric date\n') mutations_out = open(basename + "branch_mutations.txt", "w") mutations_out.write("node\tstate1\tpos\tstate2\n") for n in tt.tree.find_clades(): if timetree: if confidence: if n.bad_branch: fh_dates.write('%s\t--\t--\t--\t--\n'%(n.name)) else: conf = tt.get_max_posterior_region(n, fraction=0.9) fh_dates.write('%s\t%s\t%f\t%f\t%f\n'%(n.name, n.date, n.numdate,conf[0], conf[1])) else: if n.bad_branch: fh_dates.write('%s\t--\t--\n'%(n.name)) else: fh_dates.write('%s\t%s\t%f\n'%(n.name, n.date, n.numdate)) n.confidence=None # due to a bug in older versions of biopython that truncated filenames in nexus export # we truncate them by hand and make them unique. if n.is_terminal() and len(n.name)>40 and bioversion<"1.69": n.name = n.name[:35]+'_%03d'%terminal_count terminal_count+=1 n.comment='' if seq_info and len(n.mutations): if n.mask is None: if report_ambiguous: n.comment= '&mutations="' + ','.join([a+str(pos + offset)+d for (a,pos, d) in n.mutations])+'"' else: n.comment= '&mutations="' + ','.join([a+str(pos + offset)+d for (a,pos, d) in n.mutations if tt.gtr.ambiguous not in [a,d]])+'"' else: if report_ambiguous: n.comment= '&mutations="' + ','.join([a+str(pos + offset)+d for (a,pos, d) in n.mutations if n.mask[pos]>0])+f'",mcc="{n.mcc}"' else: n.comment= '&mutations="' + ','.join([a+str(pos + offset)+d for (a,pos, d) in n.mutations if tt.gtr.ambiguous not in [a,d] and n.mask[pos]>0])+f'",mcc="{n.mcc}"' for (a, pos, d) in n.mutations: if tt.gtr.ambiguous not in [a,d] or report_ambiguous: mutations_out.write("%s\t%s\t%s\t%s\n" %(n.name, a, pos + 1, d)) if timetree: n.comment+=(',' if n.comment else '&') + 'date=%1.2f'%n.numdate mutations_out.close() # write tree to file fmt_bl = "%1.6f" if tt.data.full_length<1e6 else "%1.8e" if timetree: outtree_name = basename + f'timetree{tree_suffix}.nexus' print("--- saved divergence times in \n\t %s\n"%dates_fname) Phylo.write(tt.tree, outtree_name, 'nexus') else: outtree_name = basename + f'annotated_tree{tree_suffix}.nexus' Phylo.write(tt.tree, outtree_name, 'nexus', format_branch_length=fmt_bl) print("--- tree saved in nexus format as \n\t %s\n"%outtree_name) # Only create auspice json if there is sequence information auspice = create_auspice_json(tt, timetree=timetree, confidence=confidence, seq_info=seq_info) outtree_name_json = basename + f'auspice_tree{tree_suffix}.json' with open(outtree_name_json, 'w') as fh: import json json.dump(auspice, fh, indent=0) print("--- tree saved in auspice json format as \n\t %s\n"%outtree_name_json) if timetree: for n in tt.tree.find_clades(): n.branch_length = n.mutation_length outtree_name = basename + f'divergence_tree{tree_suffix}.nexus' Phylo.write(tt.tree, outtree_name, 'nexus', format_branch_length=fmt_bl) print("--- divergence tree saved in nexus format as \n\t %s\n"%outtree_name) if hasattr(tt, 'outliers') and tt.outliers is not None: print("--- saved detected outliers as " + basename + 'outliers.tsv') tt.outliers.to_csv(basename + 'outliers.tsv', sep='\t') def print_save_plot_skyline(tt, n_std=2.0, screen=True, save='', plot='', gen=50): if plot: import matplotlib.pyplot as plt skyline, conf = tt.merger_model.skyline_inferred(gen=gen, confidence=n_std) if save: fh = open(save, 'w', encoding='utf-8') header1 = "Skyline assuming "+ str(gen)+" gen/year and approximate confidence bounds (+/- %f standard deviations of the LH)\n"%n_std header2 = "date \tN_e \tlower \tupper" if screen: print('\t'+header1+'\t'+header2) if save: fh.write("#"+ header1+'#'+header2+'\n') for (x,y, y1, y2) in zip(skyline.x, skyline.y, conf[0], conf[1]): if screen: print("\t%1.3f\t%1.3e\t%1.3e\t%1.3e"%(x,y, y1, y2)) if save: fh.write("%1.3f\t%1.3e\t%1.3e\t%1.3e\n"%(x,y, y1, y2)) if save: print("\n --- written skyline to %s\n"%save) fh.close() if plot: plt.figure() plt.fill_between(skyline.x, conf[0], conf[1], color=(0.8, 0.8, 0.8)) plt.plot(skyline.x, skyline.y, label='maximum likelihood skyline') plt.yscale('log') plt.legend() plt.ticklabel_format(axis='x',useOffset=False) plt.savefig(plot) def create_auspice_json(tt, timetree=False, confidence=False, seq_info=False): # mock up meta data for auspice json from datetime import datetime meta = { "title": f"Auspice visualization of TreeTime (v{treetime_version}) analysis", "build_url": "https://github.com/neherlab/treetime", "last_updated": datetime.now().strftime("%Y-%m-%d"), "treetime_version": treetime_version, "genome_annotations": { "nuc":{"start":1, "end":int(tt.data.full_length), "type":"source", "strand":"+:"} }, "panels":["tree", "entropy"], "colorings": [ { "title": "Date", "type": "continuous", "key": "num_date", }, { "title": "Genotype", "type": "categorical", "key": "gt", }, { "title": "Excluded", "type": "categorical", "key": "bad_branch" }, { "title": "Branch Support", "type": "continuous", "key": "confidence" } ], "display_defaults": {"color_by":"bad_branch"}, "filters": ["bad_branch"] } def node_to_json(n, pdiv=0.0): j = {"name":n.name, "node_attrs":{}, "branch_attrs":{}} if n.clades: j["children"] = [] if timetree: j["node_attrs"]["num_date"] = {"value":float(n.numdate)} if confidence: conf = tt.get_max_posterior_region(n, fraction=0.9) j["node_attrs"]["num_date"]["confidence"] = (float(conf[0]), float(conf[1])) j["node_attrs"]["div"] = float(pdiv + n.mutation_length) j["node_attrs"]["bad_branch"] = {"value": "Yes" if n.bad_branch else "No"} if seq_info: # only add mutations to the json if run with sequence data (fasta or vcf) j["branch_attrs"]["mutations"] = {"nuc": [f"{a}{pos+1}{d}" for a,pos,d in n.mutations if d in "ACGT-"]} # generate bootstrap confidence substitute via the negative exponential of the number of mutations # this is the bootstrap confidence for iid mutations (only ACGT mutations) j["node_attrs"]["confidence"] = {"value":round(1-np.exp(-len([pos for a,pos,d in n.mutations if d in "ACGT"])),3) if not n.is_terminal() else 1.0} return j # create the tree data structure from the Biopython tree tree = node_to_json(tt.tree.root, 0.0) # dictionary to look up nodes by name node_lookup = {tt.tree.root.name: tree} for n in tt.tree.get_nonterminals(): n_json = node_lookup[n.name] for c in n.clades: # generate node jsons for all children and attach them the to parent n_json["children"].append(node_to_json(c, n_json["node_attrs"]["div"])) node_lookup[c.name] = n_json["children"][-1] return {"meta":meta, "tree":tree} treetime-0.11.1/treetime/__init__.py000066400000000000000000000036371447636507100173650ustar00rootroot00000000000000version="0.11.1" ## Here we define an error class for TreeTime errors, MissingData, UnknownMethod and NotReady errors ## are all due to incorrect calling of TreeTime functions or input data that does not fit our base assumptions. ## Errors marked as TreeTimeUnknownErrors might be due to data not fulfilling base assumptions or due ## to bugs in TreeTime. Please report them to the developers if they persist. class TreeTimeError(Exception): """ TreeTimeError class Parent class for more specific errors Raised when treetime is used incorrectly in contrast with `TreeTimeUnknownError` `TreeTimeUnknownError` is raised when the reason of the error is unknown, could indicate bug """ pass class MissingDataError(TreeTimeError): """MissingDataError class raised when tree or alignment are missing""" pass class UnknownMethodError(TreeTimeError): """MissingDataError class raised when an unknown method is called""" pass class NotReadyError(TreeTimeError): """NotReadyError class raised when results are requested before inference""" pass class TreeTimeUnknownError(Exception): """TreeTimeUnknownError class raised when TreeTime fails during inference due to an unknown reason. This might be due to data not fulfilling base assumptions or due to bugs in TreeTime. Please report them to the developers if they persist.""" pass import os, sys recursion_limit = os.environ.get("TREETIME_RECURSION_LIMIT") if recursion_limit: sys.setrecursionlimit(int(recursion_limit)) else: sys.setrecursionlimit(max(sys.getrecursionlimit(), 10000)) from .treeanc import TreeAnc from .treetime import TreeTime, plot_vs_years from .clock_tree import ClockTree from .treetime import ttconf as treetime_conf from .gtr import GTR from .gtr_site_specific import GTR_site_specific from .merger_models import Coalescent from .treeregression import TreeRegression from .argument_parser import make_parser treetime-0.11.1/treetime/__main__.py000066400000000000000000000012111447636507100173300ustar00rootroot00000000000000#!/usr/bin/env python """ Stub function and module used as a setuptools entry point. Based on augur's __main__.py and setup.py """ import sys from treetime import make_parser # Entry point for setuptools-installed script and bin/augur dev wrapper. def main(): parser = make_parser() params = parser.parse_args() # Import matplotlib after parsing cli args # to speed up time till error if there's an arg error import matplotlib matplotlib.use("AGG") return_code = params.func(params) sys.exit(return_code) # Run when called as `python -m treetime`, here for good measure. if __name__ == "__main__": main() treetime-0.11.1/treetime/aa_models.py000066400000000000000000000107571447636507100175530ustar00rootroot00000000000000from __future__ import division, print_function, absolute_import, absolute_import import numpy as np from .seq_utils import alphabets def JTT92(mu=1.0): from .gtr import GTR # stationary concentrations: pis = np.array([ 0.07674789, 0.05169087, 0.04264509, 0.05154407, 0.01980301, 0.04075195, 0.06182989, 0.07315199, 0.02294399, 0.05376110, 0.09190390, 0.05867583, 0.02382594, 0.04012589, 0.05090097, 0.06876503, 0.05856501, 0.01426057, 0.03210196, 0.06600504]) # attempt matrix (FIXME) Q = np.array([ [-1.247831,0.044229,0.041179,0.061769,0.042704,0.043467,0.08007,0.136501,0.02059,0.027453,0.022877,0.02669,0.041179,0.011439,0.14794,0.288253,0.362223,0.006863,0.008388,0.227247 ], [0.029789,-1.025965,0.023112,0.008218,0.058038,0.159218,0.014895,0.070364,0.168463,0.011299,0.019517,0.33179,0.022599,0.002568,0.038007,0.051874,0.032871,0.064714,0.010272,0.008731 ], [0.022881,0.019068,-1.280568,0.223727,0.014407,0.03644,0.024576,0.034322,0.165676,0.019915,0.005085,0.11144,0.012712,0.004237,0.006356,0.213134,0.098304,0.00339,0.029661,0.00678 ], [0.041484,0.008194,0.270413,-1.044903,0.005121,0.025095,0.392816,0.066579,0.05736,0.005634,0.003585,0.013316,0.007682,0.002049,0.007682,0.030217,0.019462,0.002049,0.023559,0.015877 ], [0.011019,0.022234,0.00669,0.001968,-0.56571,0.001771,0.000984,0.011609,0.013577,0.003345,0.004526,0.001377,0.0061,0.015348,0.002755,0.043878,0.008264,0.022628,0.041124,0.012199 ], [0.02308,0.125524,0.034823,0.019841,0.003644,-1.04415,0.130788,0.010528,0.241735,0.003644,0.029154,0.118235,0.017411,0.00162,0.066406,0.021461,0.020651,0.007288,0.009718,0.008098 ], [0.064507,0.017816,0.035632,0.471205,0.003072,0.198435,-0.944343,0.073107,0.015973,0.007372,0.005529,0.111197,0.011058,0.003072,0.011058,0.01843,0.019659,0.006143,0.0043,0.027646 ], [0.130105,0.099578,0.058874,0.09449,0.042884,0.018898,0.086495,-0.647831,0.016717,0.004361,0.004361,0.019625,0.010176,0.003634,0.017444,0.146096,0.023986,0.039976,0.005815,0.034162 ], [0.006155,0.074775,0.089138,0.025533,0.01573,0.1361,0.005927,0.005243,-1.135695,0.003648,0.012767,0.010259,0.007523,0.009119,0.026217,0.016642,0.010487,0.001824,0.130629,0.002508 ], [0.01923,0.011752,0.025106,0.005876,0.009081,0.004808,0.00641,0.003205,0.008547,-1.273602,0.122326,0.011218,0.25587,0.047542,0.005342,0.021367,0.130873,0.004808,0.017094,0.513342 ], [0.027395,0.0347,0.010958,0.006392,0.021003,0.065748,0.008219,0.005479,0.051137,0.209115,-0.668139,0.012784,0.354309,0.226465,0.093143,0.053877,0.022829,0.047485,0.021916,0.16437 ], [0.020405,0.376625,0.153332,0.015158,0.004081,0.170239,0.105525,0.015741,0.026235,0.012243,0.008162,-0.900734,0.037896,0.002332,0.012243,0.027401,0.06005,0.00583,0.004664,0.008162 ], [0.012784,0.010416,0.007102,0.003551,0.007339,0.01018,0.004261,0.003314,0.007812,0.113397,0.091854,0.015388,-1.182051,0.01018,0.003788,0.006865,0.053503,0.005682,0.004261,0.076466 ], [0.00598,0.001993,0.003987,0.001595,0.031098,0.001595,0.001993,0.001993,0.015948,0.035484,0.098877,0.001595,0.017144,-0.637182,0.006778,0.03668,0.004784,0.021131,0.213701,0.024719 ], [0.098117,0.037426,0.007586,0.007586,0.007081,0.082944,0.009104,0.012138,0.058162,0.005058,0.051587,0.010621,0.008092,0.008598,-0.727675,0.144141,0.059679,0.003035,0.005058,0.011632 ], [0.258271,0.069009,0.343678,0.040312,0.152366,0.036213,0.020498,0.137334,0.049878,0.02733,0.040312,0.032113,0.019814,0.06286,0.194728,-1.447863,0.325913,0.023914,0.043045,0.025964 ], [0.276406,0.037242,0.135003,0.022112,0.02444,0.029677,0.018621,0.019203,0.026768,0.142567,0.014548,0.059936,0.131511,0.006983,0.068665,0.27757,-1.335389,0.006983,0.01222,0.065174 ], [0.001275,0.017854,0.001134,0.000567,0.016295,0.002551,0.001417,0.007793,0.001134,0.001275,0.007368,0.001417,0.003401,0.00751,0.00085,0.004959,0.0017,-0.312785,0.010061,0.003542 ], [0.003509,0.006379,0.022328,0.014673,0.066664,0.007655,0.002233,0.002552,0.182769,0.010207,0.007655,0.002552,0.005741,0.170967,0.00319,0.020095,0.006698,0.022647,-0.605978,0.005103 ], [0.195438,0.011149,0.010493,0.020331,0.040662,0.013117,0.029512,0.030824,0.007214,0.630254,0.11805,0.009182,0.211834,0.040662,0.015084,0.024922,0.073453,0.016396,0.010493,-1.241722] ]) Spis = np.sqrt(pis[None, :] / pis[:,None]) W = Q * Spis gtr = GTR(alphabet=alphabets['aa_nogap']) gtr.assign_rates(mu=mu, pi=pis, W=W) return gtr treetime-0.11.1/treetime/arg.py000066400000000000000000000130521447636507100163670ustar00rootroot00000000000000from matplotlib.pyplot import fill import numpy as np def parse_arg(tree1, tree2, aln1, aln2, MCC_file, fill_overhangs=True): """parse the output of TreeKnit and return a file structure to be further consumed by TreeTime Args: tree1 (str): file name of tree1 tree2 (str): file name of tree2 aln1 (str): file name of alignment 1 aln2 (str): file name of alignment 2 MCC_file (str): name of mcc file fill_overhangs (bool, optional): fill terminal gaps of alignmens before concatenating. Defaults to True. Returns: dict: dictionary containing the two trees, the concatenated alignment, full and segment masks, and the MCCs """ from Bio import Phylo, AlignIO, Seq from Bio.Align import MultipleSeqAlignment from treetime.seq_utils import seq2array # read trees and determine common terminal nodes t1 = Phylo.read(tree1, 'newick') t2 = Phylo.read(tree2, 'newick') all_leaves = set.intersection(set([x.name for x in t1.get_terminals()]), set([x.name for x in t2.get_terminals()])) # read MCCs as lists of taxon names MCCs = [] with open(MCC_file) as fh: for line in fh: if line.strip(): MCCs.append(line.strip().split(',')) # read alignments and construct edge modified sequence arrays a1 = {s.id:s for s in AlignIO.read(aln1, 'fasta')} a2 = {s.id:s for s in AlignIO.read(aln2, 'fasta')} for aln in [a1,a2]: for s,seq in aln.items(): seqstr = "".join(seq2array(seq, fill_overhangs=fill_overhangs)) seq.seq = Seq.Seq(seqstr) # construct concatenated alignment aln_combined = [] for leaf in all_leaves: seq = a1[leaf] + a2[leaf] seq.id = leaf aln_combined.append(seq) # construct masks for the concatenation and the two segments l1 = len(a1[leaf]) l2 = len(a2[leaf]) combined_mask = np.ones(l1 + l2) mask1 = np.zeros(l1 + l2) mask2 = np.zeros(l1 + l2) mask1[:l1] = 1 mask2[l1:] = 1 return {"MCCs": MCCs, "trees":[t1,t2], "alignment":MultipleSeqAlignment(aln_combined), "masks":[mask1,mask2], "combined_mask":combined_mask} def setup_arg(T, aln, total_mask, segment_mask, dates, MCCs, gtr='JC69', verbose=0, fill_overhangs=True, reroot=True, fixed_clock_rate=None, alphabet='nuc', **kwargs): """construct a TreeTime object with the appropriate masks on each node for branch length optimization with full or segment only alignment. Args: T (str, Bio.Phylo.Tree): tree of focal segment aln (Bio.Align.MultipleSeqAlignment): Concatenated multiple sequence alignment total_mask (np.array): boolean array that is true for the entire sequence segment_mask (np.array): boolean array that is true only for the focal segment dates (dict): sampling dates MCCs (list): list of MCCs gtr (str, optional): GTR model. Defaults to 'JC69'. verbose (int, optional): verbosity. Defaults to 0. fill_overhangs (bool, optional): treat terminal gap as missing. Defaults to True. reroot (bool, optional): reroot the tree. Defaults to True. Returns: TreeTime: TreeTime instance """ from treetime import TreeTime tt = TreeTime(dates=dates, tree=T, aln=aln, gtr=gtr, alphabet=alphabet, verbose=verbose, fill_overhangs=fill_overhangs, keep_node_order=True, compress=False, **kwargs) if reroot: tt.reroot("least-squares", force_positive=True, clock_rate=fixed_clock_rate) # make a lookup for the MCCs and assign to tree leaf_to_MCC = {} for mi,mcc in enumerate(MCCs): for leaf in mcc: leaf_to_MCC[leaf] = mi assign_mccs(tt.tree, leaf_to_MCC, tt.one_mutation) # assign masks to branches whenever child and parent are in the same MCC for n in tt.tree.find_clades(): if (n.mcc is not None) and n.up and n.up.mcc==n.mcc: n.mask = total_mask else: n.mask = segment_mask return tt def assign_mccs(tree, mcc_map, one_mutation=1e-4): """Assign MCCs to all terminal and internal branches of the tree. Args: tree (Bio.Phylo.Tree): tree mcc_map (dict): map from leaf to mcc one_mutation (float, optional): minimal length of branches. Defaults to 1e-4. """ # assign MCCs to leaves for leaf in tree.get_terminals(): leaf.child_mccs = set([mcc_map[leaf.name]]) leaf.mcc = mcc_map[leaf.name] leaf.branch_length = max(0.5*one_mutation, leaf.branch_length) # reconstruct MCCs with Fitch algorithm for n in tree.get_nonterminals(order='postorder'): common_mccs = set.intersection(*[c.child_mccs for c in n]) n.branch_length = max(0.5*one_mutation, n.branch_length) if len(common_mccs): n.child_mccs = common_mccs else: n.child_mccs = set.union(*[c.child_mccs for c in n]) mcc_intersection = set.intersection(*[c.child_mccs for c in tree.root]) if len(mcc_intersection): tree.root.mcc = list(mcc_intersection)[0] else: tree.root.mcc = None for n in tree.get_nonterminals(order='preorder'): if n==tree.root: continue else: if n.up.mcc in n.child_mccs: # parent MCC part of children -> that is the MCC n.mcc = n.up.mcc elif len(n.child_mccs)==1: # child is an MCC n.mcc = list(n.child_mccs)[0] else: # no unique child MCC and no match with parent -> not part of an MCCs n.mcc = None treetime-0.11.1/treetime/argument_parser.py000066400000000000000000000523551447636507100210250ustar00rootroot00000000000000#!/usr/bin/env python import sys, argparse from .wrappers import ancestral_reconstruction, mugration, scan_homoplasies,\ timetree, estimate_clock_model, arg_time_trees from . import version def set_default_subparser(self, name, args=None, positional_args=0): """default subparser selection. Call after setup, just before parse_args() name: is the name of the subparser to call by default args: if set is the argument list handed to parse_args() https://stackoverflow.com/questions/6365601/default-sub-command-or-handling-no-sub-command-with-argparse """ subparser_found = False if len(sys.argv)==1: sys.argv.append('-h') else: for x in self._subparsers._actions: if not isinstance(x, argparse._SubParsersAction): continue for sp_name in x._name_parser_map.keys(): if sp_name in sys.argv[1:]: subparser_found = True if not subparser_found: # insert default subcommand in first position if args is None: sys.argv.insert(1, name) else: args.insert(1, name) treetime_description = \ "TreeTime: Maximum Likelihood Phylodynamics\n\n" subcommand_description = \ "In addition, TreeTime implements several sub-commands:\n\n"\ "\t ancestral\tinfer ancestral sequences maximizing the joint or marginal likelihood.\n"\ "\t homoplasy\tanalyze patterns of recurrent mutations aka homoplasies.\n"\ "\t clock\t\testimate molecular clock parameters and reroot the tree.\n"\ "\t mugration\tmap discrete character such as host or country to the tree.\n\n"\ "(note that 'tt' is a default subcommand in python2 that doesn't need to be specified).\n"\ "To print a description and argument list of the individual sub-commands, type:\n\n"\ "\t treetime -h\n\n" ref_msg = \ "If you use results from treetime in a publication, please cite:"\ "\n\n\tSagulenko et al. TreeTime: Maximum-likelihood phylodynamic analysis"\ "\n\tVirus Evolution, vol 4, https://academic.oup.com/ve/article/4/1/vex042/4794731\n" timetree_description=\ "TreeTime infers a time scaled phylogeny given a tree topology, an alignment, "\ "and tip dates. Reconstructs ancestral sequences and infers a molecular clock tree. "\ "TreeTime will reroot the tree and resolve polytomies by default. "\ "In addition, treetime will infer ancestral sequences and a GTR substitution model. "\ "Inferred mutations are included as comments in the output tree.\n\n" gtr_description = "GTR model to use. '--gtr infer' will infer a model "\ "from the data. Alternatively, specify the model type. If the specified model "\ "requires additional options, use '--gtr-params' to specify those." gtr_params_description = "GTR parameters for the model specified by "\ "the --gtr argument. The parameters should be feed as 'key=value' "\ "list of parameters. Example: '--gtr K80 --gtr-params kappa=0.2 "\ "pis=0.25,0.25,0.25,0.25'. See the exact definitions of the "\ "parameters in the GTR creation methods in treetime/nuc_models.py "\ "or treetime/aa_models.py" reroot_description = "Reroot the tree using root-to-tip regression. Valid choices are "\ "'min_dev', 'least-squares', and 'oldest'. 'least-squares' adjusts the root to "\ "minimize residuals of the root-to-tip vs sampling time regression, " \ "'min_dev' minimizes variance of root-to-tip distances. "\ "'least-squares' can be combined with --covariation to account for shared ancestry. "\ "Alternatively, you can specify a node name or a list of node names "\ "to be used as outgroup or use 'oldest' to reroot to the oldest node. "\ "By default, TreeTime will reroot using 'least-squares'. "\ "Use --keep-root to keep the current root." tree_description = "Name of file containing the tree in newick, nexus, or phylip format, "\ "the branch length of the tree should be in units of average number of nucleotide or protein "\ "substitutions per site. If no file is provided, treetime will attempt "\ "to build a tree from the alignment using fasttree, iqtree, or raxml "\ "(assuming they are installed). " aln_description = "alignment file (fasta)" dates_description = "csv file with dates for nodes with 'node_name, date' where date is float (as in 2012.15)" coalescent_description = \ "coalescent time scale -- sensible values are on the order of the average "\ "hamming distance of contemporaneous sequences. In addition, 'opt' "\ "'skyline' are valid options and estimate a constant coalescent rate "\ "or a piecewise linear coalescent rate history" ancestral_description = \ "Reconstructs ancestral sequences and maps mutations to the tree. "\ "The output consists of a file 'ancestral.fasta' with ancestral sequences "\ "and a tree 'annotated_tree.nexus' with mutations added as comments "\ "like A45G,G136T,..., number in SNPs used 1-based index by default. "\ "The inferred GTR model is written to stdout." homoplasy_description = \ "Reconstructs ancestral sequences and maps mutations to the tree. "\ "The tree is then scanned for homoplasies. An excess number of homoplasies "\ "might suggest contamination, recombination, culture adaptation or similar." mugration_description = \ "Reconstructs discrete ancestral states, for example "\ "geographic location, host, or similar. In addition to ancestral states, "\ "a GTR model of state transitions is inferred." def add_seq_len_aln_group(parser): parser.add_argument('--sequence-length', type=int, help="length of the sequence, " "used to calculate expected variation in branch length. " "Not required if alignment is provided.") add_aln_group(parser, required=False) # seq_group_ex.add_argument('--aln', type=str, help=aln_description) def add_aln_group(parser, required=True): parser.add_argument('--aln', required=required, type=str, help=aln_description) parser.add_argument('--vcf-reference', type=str, help='only for vcf input: fasta file of the sequence the VCF was mapped to.') def add_reroot_group(parser): parser.add_argument('--clock-filter', type=float, default=4.0, help="ignore tips that don't follow a loose clock, " "'clock-filter=number of interquartile ranges from regression (method=`residual`)' " "or z-score of local clock deviation (method=`local`). " "Default=4.0, set to 0 to switch off.") parser.add_argument('--clock-filter-method', choices=['residual', 'local'], default='residual', help="Use residuals from global clock (`residual`, default) or local clock deviation (`clock`) " "to filter out tips that don't follow the clock") reroot_group = parser.add_mutually_exclusive_group() reroot_group.add_argument('--reroot', nargs='+', default='best', help=reroot_description) reroot_group.add_argument('--keep-root', required = False, action="store_true", default=False, help ="don't reroot the tree. Otherwise, reroot to minimize the " "the residual of the regression of root-to-tip distance and sampling time") parser.add_argument('--tip-slack', type=float, default=3, help="excess variance associated with terminal nodes accounting for " " overdispersion of the molecular clock") parser.add_argument('--covariation', action='store_true', help="Account for covariation when estimating rates " "or rerooting using root-to-tip regression, default False.") def add_gtr_arguments(parser): parser.add_argument('--gtr', default='infer', help=gtr_description) parser.add_argument('--gtr-params', nargs='+', help=gtr_params_description) parser.add_argument('--aa', action='store_true', help="use aminoacid alphabet") parser.add_argument('--custom-gtr', default = None, type=str, help="filename of pre-defined custom GTR model in standard TreeTime format") def add_time_arguments(parser): parser.add_argument('--dates', type=str, help=dates_description) parser.add_argument('--name-column', type=str, help="label of the column to be used as taxon name") parser.add_argument('--date-column', type=str, help="label of the column to be used as sampling date") def add_anc_arguments(parser): parser.add_argument('--keep-overhangs', default = False, action='store_true', help='do not fill terminal gaps') parser.add_argument('--zero-based', default = False, action='store_true', help='zero based mutation indexing') parser.add_argument('--reconstruct-tip-states', default = False, action='store_true', help='overwrite ambiguous states on tips with the most likely inferred state') parser.add_argument('--report-ambiguous', default=False, action="store_true", help='include transitions involving ambiguous states') parser.add_argument('--method-anc', default='probabilistic', type=str, choices = ['parsimony', 'fitch', 'probabilistic', 'ml'], help="method used for reconstructing ancestral sequences, default is 'probabilistic'") def add_common_args(parser): parser.add_argument('--verbose', default=1, type=int, help='verbosity of output 0-6') parser.add_argument('--outdir', type=str, help='directory to write the output to') def add_timetree_args(parser): parser.add_argument('--clock-rate', type=float, help="if specified, the rate of the molecular clock won't be optimized.") parser.add_argument('--clock-std-dev', type=float, help="standard deviation of the provided clock rate estimate") parser.add_argument('--branch-length-mode', default='auto', type=str, choices=['auto', 'input', 'joint', 'marginal'], help="If set to 'input', the provided branch length will be used without modification. " "Note that branch lengths optimized by treetime are only accurate at short evolutionary distances.") parser.add_argument('--confidence', action='store_true', help="estimate confidence intervals of divergence times using the marginal" " posterior distribution, if `--time-marginal` is False (default) inferred divergence" " times will still be calculated using the jointly most likely tree configuration.") parser.add_argument('--time-marginal', default='false', choices = ['false', 'true', 'assign', 'always', 'only-final', 'never'], help="For 'false' or 'never', TreeTime uses the jointly most likely values for the divergence times. " "For 'true' and 'always', it uses the marginal inference mode at every round of optimization, for 'only-final' " "(or 'assign' for compatibility with previous versions) only uses the marginal " "distribution in the final round.") parser.add_argument('--keep-polytomies', default=False, action='store_true', help="Don't resolve polytomies using temporal information.") parser.add_argument('--stochastic-resolve', default=False, action='store_true', help="Resolve polytomies using a random coalescent tree.") parser.add_argument('--greedy-resolve', action='store_false', dest='stochastic_resolve', help="Resolve polytomies greedily. Currently default, but will " "switched to `stochastic-resolve` in future versions.") # parser.add_argument('--keep-node-order', default=False, action='store_true', # help="Don't ladderize the tree.") parser.add_argument('--relax',nargs=2, type=float, help='use an autocorrelated molecular clock. Strength of the gaussian priors on' ' branch specific rate deviation and the coupling of parent and offspring' ' rates can be specified e.g. as --relax 1.0 0.5. Values around 1.0 correspond' ' to weak priors, larger values constrain rate deviations more strongly.' ' Coupling 0 (--relax 1.0 0) corresponds to an un-correlated clock.') parser.add_argument('--max-iter', default=2, type=int, help='maximal number of iterations the inference cycle is run. Note that for polytomy resolution and coalescence models max_iter should be at least 2') parser.add_argument('--coalescent', default="0.0", type=str, help=coalescent_description) parser.add_argument('--n-skyline', default="20", type=int, help="number of grid points in skyline coalescent model") parser.add_argument('--gen-per-year', default="50.0", type=float, help="number of generations per year - used for estimating N_e in coalescent models") parser.add_argument('--n-branches-posterior', default=False, action='store_true', help= "add posterior LH to coalescent model: use the posterior probability distributions of " "divergence times for estimating the number of branches when calculating the coalescent merger" "rate or use inferred time before present (default)." ) parser.add_argument('--plot-tree', default="timetree.pdf", help = "filename to save the plot to. Suffix will determine format" " (choices pdf, png, svg, default=pdf)") parser.add_argument('--plot-rtt', default="root_to_tip_regression.pdf", help = "filename to save the plot to. Suffix will determine format" " (choices pdf, png, svg, default=pdf)") parser.add_argument('--tip-labels', action='store_true', help = "add tip labels (default for small trees with <30 leaves)") parser.add_argument('--no-tip-labels', action='store_true', help = "don't show tip labels (default for small trees with >=30 leaves)") def make_parser(): parser = argparse.ArgumentParser(description = "", usage=treetime_description) subparsers = parser.add_subparsers() t_parser = parser t_parser.add_argument('--tree', type=str, help=tree_description) t_parser.add_argument('--rng-seed', type=int, help="random number generator seed for treetime") add_seq_len_aln_group(t_parser) add_time_arguments(t_parser) add_timetree_args(t_parser) add_reroot_group(t_parser) add_gtr_arguments(t_parser) add_anc_arguments(t_parser) add_common_args(t_parser) t_parser.add_argument("--version", action="version", version="%(prog)s " + version) def toplevel(params): if (params.aln or params.tree) and params.dates: timetree(params) else: print(treetime_description+timetree_description+subcommand_description+ "'--dates' and '--aln' or '--tree' are REQUIRED inputs, type 'treetime -h' for a full list of arguments.\n") t_parser.set_defaults(func=toplevel) ## HOMOPLASY SCANNER h_parser = subparsers.add_parser('homoplasy', description=homoplasy_description) add_aln_group(h_parser) h_parser.add_argument('--tree', type = str, help=tree_description) h_parser.add_argument('--rng-seed', type=int, help="random number generator seed for treetime") h_parser.add_argument('--const', type = int, default=0, help ="number of constant sites not included in alignment") h_parser.add_argument('--rescale', type = float, default=1.0, help ="rescale branch lengths") h_parser.add_argument('--detailed', required = False, action="store_true", help ="generate a more detailed report") add_gtr_arguments(h_parser) h_parser.add_argument('--zero-based', default = False, action='store_true', help='zero based mutation indexing') h_parser.add_argument('-n', default = 10, type=int, help='number of mutations/nodes that are printed to screen') h_parser.add_argument('--drms', type=str, help='TSV file containing DRM info. columns headers: GENOMIC_POSITION, ALT_BASE, DRUG, GENE, SUBSTITUTION') add_common_args(h_parser) h_parser.set_defaults(func=scan_homoplasies) ## ANCESTRAL RECONSTRUCTION a_parser = subparsers.add_parser('ancestral', description=ancestral_description) add_aln_group(a_parser) a_parser.add_argument('--tree', type=str, help=tree_description) a_parser.add_argument('--rng-seed', type=int, help="random number generator seed for treetime") add_gtr_arguments(a_parser) a_parser.add_argument('--marginal', default=False, action="store_true", help ="marginal reconstruction of ancestral sequences") add_anc_arguments(a_parser) add_common_args(a_parser) a_parser.set_defaults(func=ancestral_reconstruction) ## MUGRATION m_parser = subparsers.add_parser('mugration', description=mugration_description) m_parser.add_argument('--tree', required = True, type=str, help=tree_description) m_parser.add_argument('--rng-seed', type=int, help="random number generator seed for treetime") m_parser.add_argument('--name-column', type=str, help="label of the column to be used as taxon name") m_parser.add_argument('--attribute', type=str, help ="attribute to reconstruct, e.g. country") m_parser.add_argument('--states', required = True, type=str, help ="csv or tsv file with discrete characters." "\n#name,country,continent\ntaxon1,micronesia,oceania\n...") m_parser.add_argument('--weights', type=str, help="csv or tsv file with probabilities of that a randomly sampled " "sequence at equilibrium has a particular state. E.g. population of different continents or countries. E.g.:" "\n#country,weight\nmicronesia,0.1\n...") m_parser.add_argument('--confidence', action="store_true", help="output confidence of mugration inference") m_parser.add_argument('--pc', type=float, default=1.0, help ="pseudo-counts higher numbers will results in 'flatter' models") m_parser.add_argument('--missing-data', type=str, default='?', help ="string indicating missing data") m_parser.add_argument('--sampling-bias-correction', type=float, help='a rough estimate of how many more events would have been observed' ' if sequences represented an even sample. This should be' ' roughly the (1-sum_i p_i^2)/(1-sum_i t_i^2), where p_i' ' are the equilibrium frequencies and t_i are apparent ones.' '(or rather the time spent in a particular state on the tree)') add_common_args(m_parser) m_parser.set_defaults(func=mugration) ## CLOCKSIGNAL c_parser = subparsers.add_parser('clock', description="Calculates the root-to-tip regression and quantifies the 'clock-i-ness' of the tree. " "It will reroot the tree to maximize the clock-like " "signal and recalculate branch length unless run with --keep-root.") c_parser.add_argument('--tree', required=True, type=str, help=tree_description) c_parser.add_argument('--rng-seed', type=int, help="random number generator seed for treetime") add_time_arguments(c_parser) add_seq_len_aln_group(c_parser) add_reroot_group(c_parser) c_parser.add_argument('--allow-negative-rate', required = False, action="store_true", default=False, help="By default, rates are forced to be positive. For trees with little temporal " "signal it is advisable to remove this restriction to achieve essentially mid-point rooting.") c_parser.add_argument('--plot-rtt', default="root_to_tip_regression.pdf", help = "filename to save the plot to. Suffix will determine format" " (choices pdf, png, svg, default=pdf)") add_common_args(c_parser) c_parser.set_defaults(func=estimate_clock_model) ## ARG arg_parser = subparsers.add_parser('arg', description="Calculates the root-to-tip regression and quantifies the 'clock-i-ness' of the tree. " "It will reroot the tree to maximize the clock-like " "signal and recalculate branch length unless run with --keep_root.") arg_parser.add_argument('--rng-seed', type=int, help="random number generator seed for treetime") arg_parser.add_argument('--trees', nargs=2, required=True, type=str) arg_parser.add_argument('--alignments', nargs=2, required=True, type=str) arg_parser.add_argument('--mccs', required=True, type=str) add_timetree_args(arg_parser) add_time_arguments(arg_parser) add_seq_len_aln_group(arg_parser) add_anc_arguments(arg_parser) add_reroot_group(arg_parser) add_common_args(arg_parser) arg_parser.set_defaults(func=arg_time_trees) # make a version subcommand v_parser = subparsers.add_parser('version', description='print version') v_parser.set_defaults(func=lambda x: print("treetime "+version)) return parser treetime-0.11.1/treetime/branch_len_interpolator.py000066400000000000000000000140641447636507100225170ustar00rootroot00000000000000import numpy as np from . import config as ttconf from .distribution import Distribution class BranchLenInterpolator (Distribution): """ This class defines the methods to manipulate the branch length probability distributions. """ def __init__(self, node, gtr, one_mutation=None, min_width=ttconf.MIN_INTEGRATION_PEAK, branch_length_mode = 'joint', pattern_multiplicity = None, n_grid_points = ttconf.BRANCH_GRID_SIZE, ignore_gaps=True): self.node = node self.gtr = gtr if node.up is None: raise Exception("Cannot create branch length interpolator for the root node.") self._gamma = 1.0 if one_mutation is None: L = node.sequence.shape[0] one_mutation = 1.0/L self.one_mutation = one_mutation # optimal branch length mutation_length = node.mutation_length if mutation_length < np.min((1e-5, 0.1*one_mutation)): # zero-length short_range = 10*one_mutation grid = np.concatenate([short_range*(np.linspace(0, 1.0 , n_grid_points//2)[:-1]), (short_range + (ttconf.MAX_BRANCH_LENGTH - short_range)*(np.linspace(0, 1.0 , n_grid_points//2+1)**2))]) else: # branch length is not zero sigma = mutation_length #np.max([self.average_branch_len, mutation_length]) # from zero to optimal branch length grid_left = mutation_length * (1 - np.linspace(1, 0.0, n_grid_points//3)**2.0) grid_zero = grid_left[1]*np.logspace(-20,0,6)[:5] grid_zero2 = grid_left[1]*np.linspace(0,1,10)[1:-1] # from optimal branch length to the right (--> 3*branch lengths), grid_right = mutation_length + (3*sigma*(np.linspace(0, 1, n_grid_points//3)**2)) # far to the right (3*branch length ---> MAX_LEN), very sparse far_grid = grid_right.max() + ttconf.MAX_BRANCH_LENGTH*np.linspace(0, 1, n_grid_points//3)**2 grid = np.concatenate((grid_zero,grid_zero2, grid_left,grid_right[1:],far_grid[1:])) grid.sort() # just for safety if branch_length_mode=='input': # APPROXIMATE HANDLING OF BRANCH LENGTH PROPAGATOR WHEN USING INPUT BRANCH LENGTH # branch length are estimated from as those maximizing the likelihood and the # sensitivity of the likelihood depends on the branch length (gets soft for long branches) # observed differences scale as p = p_0 (1-exp(-l/p_0)) where p_0 is the distance of random sequence # (3/4 for nucleotides, more like 0.9 for amino acids). The number of observable # substitutions fluctuates by dp = \sqrt{p(1-p)/L} which corresponds to fluctuation # in branch length of dp = dl exp(-l/p0). A Gaussian approximation for the branch length would # therefore have variance p(1-p)e^{2l/p0}/L. Substituting p results in # p_0(1-exp(-l/p0))(1-p_0(1-exp(-l/p0)))e^{2l/p0}/L which can be slightly rearranged to # p_0(exp(l/p0)-1)(exp(l/p0)-p_0(exp(l/p0)-1))/L p0 = 1.0-np.sum(self.gtr.Pi**2) # variance_scale = one_mutation*ttconf.OVER_DISPERSION if mutation_length<0.05: # for short branches, the number of mutations is poissonian. the prob of a branch to have l=mutation_length*L # mutations when its length is k, is therefor e^{-kL}(kL)^(Ll)/(Ll)!. Ignoring constants, the log is # -kL + lL\log(k) log_prob = np.array([ k - mutation_length*np.log(k+ttconf.MIN_BRANCH_LENGTH*one_mutation) for k in grid])/one_mutation log_prob -= log_prob.min() else: # make it a Gaussian #sigma_sq = (mutation_length+one_mutation)*variance_scale l = (mutation_length+one_mutation) nm_inv = np.exp(l/p0) sigma_sq = p0*(nm_inv-1)*(nm_inv - p0*(nm_inv-1))*one_mutation sigma = np.sqrt(sigma_sq+ttconf.MIN_BRANCH_LENGTH*one_mutation) log_prob = np.array(np.min([[ 0.5*(mutation_length-k)**2/sigma_sq for k in grid], 100 + np.abs([(mutation_length-k)/sigma for k in grid])], axis=0)) elif branch_length_mode=='marginal': if hasattr(node, 'profile_pair'): log_prob = np.array([-self.gtr.prob_t_profiles(node.profile_pair, pattern_multiplicity, k, return_log=True) for k in grid]) else: raise Exception("profile pairs need to be assigned to node") elif branch_length_mode=='joint': if not hasattr(node, 'branch_state'): raise Exception("branch state pairs need to be assigned to nodes") log_prob = np.array([-self.gtr.prob_t_compressed(node.branch_state['pair'], node.branch_state['multiplicity'], k, return_log=True) for k in grid]) else: raise Exception("unknown branch length mode! "+branch_length_mode) # tmp_dis = Distribution(grid, log_prob, is_log=True, kind='linear') # norm = tmp_dis.integrate(a=tmp_dis.xmin, b=tmp_dis.xmax, n=200) super(BranchLenInterpolator, self).__init__(grid, log_prob, is_log=True, kind='linear', min_width=min_width) @property def gamma(self): return self._gamma @gamma.setter def gamma(self, value): new_gamma = max(ttconf.TINY_NUMBER, value) ratio = self._gamma/new_gamma self.x_rescale(ratio) self._gamma = new_gamma def __mul__(self, other): res = BranchLenInterpolator(super(BranchLenInterpolator, self).__mul__(other), gtr=self.gtr) return res treetime-0.11.1/treetime/clock_filter_methods.py000066400000000000000000000211701447636507100220010ustar00rootroot00000000000000import numpy as np import pandas as pd def residual_filter(tt, n_iqd): terminals = tt.tree.get_terminals() clock_rate = tt.clock_model['slope'] icpt = tt.clock_model['intercept'] res = {} for node in terminals: if hasattr(node, 'raw_date_constraint') and (node.raw_date_constraint is not None): res[node] = node.dist2root - clock_rate*np.mean(node.raw_date_constraint) - icpt residuals = np.array(list(res.values())) iqd = np.percentile(residuals,75) - np.percentile(residuals,25) outliers = {} for node,r in res.items(): if abs(r)>n_iqd*iqd and node.up.up is not None: node.bad_branch=True outliers[node.name] = {'tau':(node.dist2root - icpt)/clock_rate, 'avg_date': np.mean(node.raw_date_constraint), 'exact_date': node.raw_date_constraint if type(node) is float else None, 'residual': r/iqd} else: node.bad_branch=False tt.outliers=None if len(outliers): outlier_df = pd.DataFrame(outliers).T.loc[:,['avg_date', 'tau', 'residual']]\ .rename(columns={'avg_date':'given_date', 'tau':'apparent_date'}) tt.logger("Clock_filter.residual_filter marked the following outliers:", 2, warn=True) if tt.verbose>=2: print(outlier_df) tt.outliers = outlier_df return len(outliers) def local_filter(tt, z_score_threshold): tt.logger(f"TreeTime.ClockFilter: starting local_outlier_detection", 2) node_info = collect_node_info(tt) node_info, z_scale = calculate_node_timings(tt, node_info) tt.logger(f"TreeTime.ClockFilter: z-scale {z_scale:1.2f}", 2) outliers = flag_outliers(tt, node_info, z_score_threshold, z_scale) for n in tt.tree.get_terminals(): if n.name in outliers: n.bad_branch = True tt.outliers=None if len(outliers): outlier_df = pd.DataFrame(outliers).T.loc[:,['avg_date', 'tau', 'z', 'diagnosis']]\ .rename(columns={'avg_date':'given_date', 'tau':'apparent_date', 'z':'z-score'}) tt.logger("Clock_filter.local_filter marked the following outliers", 2, warn=True) if tt.verbose>=2: print(outlier_df) tt.outliers = outlier_df return len(outliers) def flag_outliers(tt, node_info, z_score_threshold, z_scale): def add_outlier_info(z, n, n_info, parent_tau, mu): n_info['z'] = z diagnosis='' # muts = n_info["nmuts"] if n.is_terminal() else 0.0 # parent_tau = node_info[n.up.name]['tau'] if n.is_terminal() else n_info['tau'] if z<0: if np.abs(n_info['avg_date']-parent_tau) > n_info["nmuts"]/mu: diagnosis='date_too_early' else: diagnosis = 'excess_mutations' else: diagnosis = 'date_too_late' n_info['diagnosis'] = diagnosis return n_info outliers = {} mu = tt.clock_model['slope']*tt.data.full_length for n in tt.tree.get_terminals(): if n.up.up is None: continue # do not label children of the root as bad -- typically a problem with root choice that will be fixed anyway n_info = node_info[n.name] parent_tau = node_info[n.up.name]['tau'] if n_info['exact_date']: z = (n_info['avg_date'] - n_info['tau'])/z_scale if np.abs(z) > z_score_threshold: outliers[n.name] = add_outlier_info(z, n, n_info, parent_tau, mu) elif n.raw_date_constraint and len(n.raw_date_constraint): zs = [(n_info['tau'] - x)/z_scale for x in n.raw_date_constraint] if zs[0]*zs[1]>0 and np.min(np.abs(zs))>z_score_threshold: outliers[n.name] = add_outlier_info(zs[0] if np.abs(zs[0])0 parent["nmuts"] = len([m for m in n.mutations if m[-1] in 'ACGT']) if aln else np.round(n.branch_length*L) d = [v['date'] for v in parent['tips'].values() if v['exact_date']] parent["observations"] = len(d) parent["avg_date"] = np.mean(d) if len(d) else 0.0 node_info[n.name] = parent return node_info treetime-0.11.1/treetime/clock_tree.py000066400000000000000000001561461447636507100177440ustar00rootroot00000000000000import numpy as np from . import config as ttconf from . import MissingDataError, UnknownMethodError, TreeTimeUnknownError from .treeanc import TreeAnc from .utils import numeric_date, DateConversion, datestring_from_numeric from .distribution import Distribution from .branch_len_interpolator import BranchLenInterpolator from .node_interpolator import NodeInterpolator class ClockTree(TreeAnc): """ ClockTree is the main class to perform the optimization of the node positions given the temporal constraints of (some) leaves. The optimization workflow includes the inference of the ancestral sequences and branch length optimization using TreeAnc. After the optimization is done, the nodes with date-time information are arranged along the time axis, the conversion between the branch lengths units and the date-time units is determined. Then, for each internal node, we compute the the probability distribution of the node's location conditional on the fixed location of the leaves, which have temporal information. In the end, the most probable location of the internal nodes is converted to the most likely time of the internal nodes. """ def __init__(self, *args, dates=None, debug=False, real_dates=True, precision_fft = 'auto', precision='auto', precision_branch='auto', branch_length_mode='joint', use_covariation=False, use_fft=True, **kwargs): """ ClockTree constructor Parameters ---------- dates : dict :code:`{leaf_name:leaf_date}` dictionary debug : bool If True, the debug mode is ON, which means no or less clean-up of obsolete parameters to control program execution in intermediate states. In debug mode, the python debugger is also allowed to interrupt program execution with intercative shell if an error occurs. real_dates : bool If True, some additional checks for the input dates sanity will be performed. precision : int Precision can be 0 (rough), 1 (default), 2 (fine), or 3 (ultra fine). This parameter determines the number of grid points that are used for the evaluation of the branch length interpolation objects. When not specified, this will default to 1 for short sequences and 2 for long sequences with L>1e4 precision_fft : int When calculating convolutions using the FFT approach a regular discrete grid needs to be chosen. To optimize the calculation the size is not set to a fixed number but is determined by the FWHM of the distributions. The number of points desired to span the width of the FWHM of a distribution can be specified explicitly by precision_fft (default is 200). branch_length_mode : str determines whether branch length are calculated using the 'joint' ML, 'marginal' ML, or branch length of the input tree ('input'). use_covariation : bool determines whether root-to-tip regression accounts for covariance introduced by shared ancestry. use_fft: boolean Use FFT for calculation of convolution integrals if true (default). The alternative is kept to be able to reproduce previous behavior. **kwargs: Key word arguments passed on to the parent class (TreeAnc) """ super(ClockTree, self).__init__(*args, **kwargs) if dates is None: raise MissingDataError("ClockTree requires date constraints!") self.debug=debug self.real_dates = real_dates self.date_dict = dates self.use_fft = use_fft self._date2dist = None # we do not know anything about the conversion self.tip_slack = ttconf.OVER_DISPERSION # extra number of mutations added # to terminal branches in covariance calculation self.rel_tol_prune = ttconf.REL_TOL_PRUNE self.rel_tol_refine = ttconf.REL_TOL_REFINE self.branch_length_mode = branch_length_mode self.clock_model=None self.use_covariation=use_covariation # if false, covariation will be ignored in rate estimates. self._set_precision(precision) self._set_precision_fft(precision_fft, precision_branch) self._assign_dates() def _assign_dates(self): """assign dates to nodes Returns ------- str success/error code """ if self.tree is None: raise MissingDataError("ClockTree._assign_dates: tree is not set, can't assign dates") bad_branch_counter = 0 for node in self.tree.find_clades(order='postorder'): if node.name in self.date_dict: tmp_date = self.date_dict[node.name] if np.isscalar(tmp_date) and np.isnan(tmp_date): self.logger("WARNING: ClockTree.init: node %s has a bad date: %s"%(node.name, str(tmp_date)), 2, warn=True) node.raw_date_constraint = None node.bad_branch = True else: try: tmp = np.mean(tmp_date) node.raw_date_constraint = tmp_date node.bad_branch = False except: self.logger("WARNING: ClockTree.init: node %s has a bad date: %s"%(node.name, str(tmp_date)), 2, warn=True) node.raw_date_constraint = None node.bad_branch = True else: # nodes without date contraints node.raw_date_constraint = None if node.is_terminal(): # Terminal branches without date constraints marked as 'bad' node.bad_branch = True else: # If all branches dowstream are 'bad', and there is no date constraint for # this node, the branch is marked as 'bad' node.bad_branch = np.all([x.bad_branch for x in node]) if node.is_terminal() and node.bad_branch: bad_branch_counter += 1 if bad_branch_counter>self.tree.count_terminals()-3: raise MissingDataError("ERROR: ALMOST NO VALID DATE CONSTRAINTS") self.logger("ClockTree._assign_dates: assigned date constraints to {} out of {} tips.".format(self.tree.count_terminals()-bad_branch_counter, self.tree.count_terminals()), 1) return ttconf.SUCCESS def _set_precision(self, precision): ''' function that sets precision to a (hopefully) reasonable guess based on the length of the sequence if not explicitly set ''' # if precision is explicitly specified, use it. if self.one_mutation: self.min_width = 10*self.one_mutation else: self.min_width = 0.001 if precision in [0,1,2,3]: self.precision=precision if self.one_mutation and self.one_mutation<1e-4 and precision<2: self.logger("ClockTree._set_precision: FOR LONG SEQUENCES (>1e4) precision>=2 IS RECOMMENDED." " precision %d was specified by the user"%precision, level=0) else: # otherwise adjust it depending on the minimal sensible branch length if self.one_mutation: if self.one_mutation>1e-4: self.precision=1 else: self.precision=2 else: self.precision=1 self.logger("ClockTree: Setting precision to level %s"%self.precision, 2) if self.precision==0: self.node_grid_points = ttconf.NODE_GRID_SIZE_ROUGH self.branch_grid_points = ttconf.BRANCH_GRID_SIZE_ROUGH self.n_integral = ttconf.N_INTEGRAL_ROUGH elif self.precision==2: self.node_grid_points = ttconf.NODE_GRID_SIZE_FINE self.branch_grid_points = ttconf.BRANCH_GRID_SIZE_FINE self.n_integral = ttconf.N_INTEGRAL_FINE elif self.precision==3: self.node_grid_points = ttconf.NODE_GRID_SIZE_ULTRA self.branch_grid_points = ttconf.BRANCH_GRID_SIZE_ULTRA self.n_integral = ttconf.N_INTEGRAL_ULTRA else: self.node_grid_points = ttconf.NODE_GRID_SIZE self.branch_grid_points = ttconf.BRANCH_GRID_SIZE self.n_integral = ttconf.N_INTEGRAL def _set_precision_fft(self, precision_fft, precision_branch='auto'): ''' function to set the number of grid points for the minimal FWHM window and branch grid when calculating the marginal distribution using the FFT-based approach The default parameters ttconf.FFT_FWHM_GRID_SIZE and branch_grid_points determined in set_precision are used unless an integer value is specified using precision_fft and precision_branch ''' if type(precision_fft) is int: self.logger("ClockTree.init._set_precision_fft: setting fft grid size explicitly," " fft_grid_points=%.3e"%(precision_fft), 2) self.fft_grid_size = precision_fft elif precision_fft!='auto': raise UnknownMethodError(f"ClockTree: precision_fft needs to be either 'auto' or an integer, got '{precision_fft}'.") else: self.fft_grid_size = ttconf.FFT_FWHM_GRID_SIZE if type(precision_branch) is int: self.logger("ClockTree.init._set_precision_fft: setting branch grid size explicitly," " branch_grid_points=%.3e"%(precision_branch), 2) self.branch_grid_points = precision_branch @property def date2dist(self): return self._date2dist @date2dist.setter def date2dist(self, val): if val is None: self._date2dist = None else: self.logger("ClockTree.date2dist: Setting new molecular clock." " rate=%.3e, R^2=%.4f"%(val.clock_rate, val.r_val**2), 2) self._date2dist = val def setup_TreeRegression(self, covariation=True): """instantiate a TreeRegression object and set its tip_value and branch_value function to defaults that are sensible for treetime instances. Parameters ---------- covariation : bool, optional account for phylogenetic covariation Returns ------- TreeRegression a TreeRegression instance with self.tree attached as tree. """ from .treeregression import TreeRegression tip_value = lambda x:np.mean(x.raw_date_constraint) if (x.is_terminal() and (x.bad_branch is False)) else None branch_value = lambda x:x.mutation_length if covariation: om = self.one_mutation branch_variance = lambda x:((max(0,x.clock_length) if hasattr(x,'clock_length') else x.mutation_length) +(self.tip_slack**2*om if x.is_terminal() else 0.0))*om else: branch_variance = lambda x:1.0 if x.is_terminal() else 0.0 Treg = TreeRegression(self.tree, tip_value=tip_value, branch_value=branch_value, branch_variance=branch_variance) Treg.valid_confidence = covariation return Treg def get_clock_model(self, covariation=True, slope=None): self.logger(f'ClockTree.get_clock_model: estimating clock model with covariation={covariation}',3) Treg = self.setup_TreeRegression(covariation=covariation) self.clock_model = Treg.regression(slope=slope) if not np.isfinite(self.clock_model['slope']): raise ValueError("Clock rate estimation failed. If your data lacks temporal signal, please specify the rate explicitly!") if not Treg.valid_confidence or (slope is not None): if 'cov' in self.clock_model: self.clock_model.pop('cov') self.clock_model['valid_confidence']=False else: self.clock_model['valid_confidence']=True self.clock_model['r_val'] = Treg.explained_variance() self.date2dist = DateConversion.from_regression(self.clock_model) def init_date_constraints(self, clock_rate=None, **kwarks): """ Get the conversion coefficients between the dates and the branch lengths as they are used in ML computations. The conversion formula is assumed to be 'length = k*numdate + b'. For convenience, these coefficients as well as regression parameters are stored in the 'dates2dist' object. .. Note:: The tree must have dates set to all nodes before calling this function. Parameters ---------- clock_rate: float If specified, timetree optimization will be done assuming a fixed clock rate as specified """ self.logger("ClockTree.init_date_constraints...",2) self.tree.coalescent_joint_LH = 0 if self.aln and (not self.sequence_reconstruction): self.infer_ancestral_sequences('probabilistic', marginal=self.branch_length_mode=='marginal', sample_from_profile='root',**kwarks) # set the None for the date-related attributes in the internal nodes. # make interpolation objects for the branches self.logger('ClockTree.init_date_constraints: Initializing branch length interpolation objects...',2) has_clock_length = [] for node in self.tree.find_clades(order='postorder'): if node.up is None: node.branch_length_interpolator = None else: has_clock_length.append(hasattr(node, 'clock_length')) # copy the merger rate and gamma if they are set if hasattr(node,'branch_length_interpolator') and node.branch_length_interpolator is not None: gamma = node.branch_length_interpolator.gamma else: gamma = 1.0 if self.branch_length_mode=='marginal': node.profile_pair = self.marginal_branch_profile(node) elif self.branch_length_mode=='joint' and (not hasattr(node, 'branch_state')): self.add_branch_state(node) node.branch_length_interpolator = BranchLenInterpolator(node, self.gtr, pattern_multiplicity = self.data.multiplicity(mask=node.mask), min_width=self.min_width, one_mutation=self.one_mutation, branch_length_mode=self.branch_length_mode, n_grid_points = self.branch_grid_points) node.branch_length_interpolator.gamma = gamma # use covariance in clock model only after initial timetree estimation is done use_cov = (np.sum(has_clock_length) > len(has_clock_length)*0.7) and self.use_covariation self.get_clock_model(covariation=use_cov, slope=clock_rate) self.logger('ClockTree.init_date_constraints: node date constraints objects...', 2) # make node distribution objects for node in self.tree.find_clades(order="postorder"): # node is constrained if hasattr(node, 'raw_date_constraint') and node.raw_date_constraint is not None: # set the absolute time before present in branch length units if np.isscalar(node.raw_date_constraint): tbp = self.date2dist.get_time_before_present(node.raw_date_constraint) node.date_constraint = Distribution.delta_function(tbp, weight=1.0, min_width=self.min_width) else: tbp = self.date2dist.get_time_before_present(np.array(node.raw_date_constraint)) node.date_constraint = Distribution(tbp, np.ones_like(tbp), is_log=False, min_width=self.min_width) if hasattr(node, 'bad_branch') and node.bad_branch is True: self.logger("ClockTree.init_date_constraints -- WARNING: Branch is marked as bad" ", excluding it from the optimization process." " Date constraint will be ignored!", 4, warn=True) else: # node without sampling date set node.raw_date_constraint = None node.date_constraint = None def make_time_tree(self, time_marginal=False, clock_rate=None, **kwargs): ''' Use the date constraints to calculate the most likely positions of unconstrained nodes. Parameters ---------- time_marginal : bool If true, use marginal reconstruction for node positions **kwargs Key word arguments to initialize dates constraints ''' self.logger("ClockTree: Maximum likelihood tree optimization with temporal constraints",1) self.init_date_constraints(clock_rate=clock_rate, **kwargs) if time_marginal: self._ml_t_marginal() else: self._ml_t_joint() self.tree.positional_LH = self.timetree_likelihood(time_marginal) self.convert_dates() def _ml_t_joint(self): """ Compute the joint maximum likelihood assignment of the internal nodes positions by propagating from the tree leaves towards the root. Given the assignment of parent nodes, reconstruct the maximum-likelihood positions of the child nodes by propagating from the root to the leaves. The result of this operation is the time_before_present value, which is the position of the node, expressed in the units of the branch length, and scaled from the present-day. The value is assigned to the corresponding attribute of each node of the tree. Returns ------- None Every internal node is assigned the probability distribution in form of an interpolation object and sends this distribution further towards the root. """ def _cleanup(): for node in self.tree.find_clades(): del node.joint_pos_Lx del node.joint_pos_Cx self.logger("ClockTree - Joint reconstruction: Propagating leaves -> root...", 2) # go through the nodes from leaves towards the root: for node in self.tree.find_clades(order='postorder'): # children first, msg to parents # Lx is the maximal likelihood of a subtree given the parent position # Cx is the branch length corresponding to the maximally likely subtree if node.bad_branch: # no information at the node node.joint_pos_Lx = None node.joint_pos_Cx = None else: # all other nodes if node.date_constraint is not None and node.date_constraint.is_delta: # there is a strict time constraint # subtree probability given the position of the parent node # Lx.x is the position of the parent node # Lx.y is the probability of the subtree (consisting of one terminal node in this case) # Cx.y is the branch length corresponding the optimal subtree bl = node.branch_length_interpolator.x x = bl + node.date_constraint.peak_pos # if a merger model is defined, add its (log) rate to the propagated distribution if hasattr(self, 'merger_model') and self.merger_model: node.joint_pos_Lx = Distribution(x, -self.merger_model.integral_merger_rate(node.date_constraint.peak_pos) + node.branch_length_interpolator(bl), min_width=self.min_width, is_log=True) else: node.joint_pos_Lx = Distribution(x, node.branch_length_interpolator(bl), min_width=self.min_width, is_log=True) node.joint_pos_Cx = Distribution(x, bl, min_width=self.min_width) # map back to the branch length else: # all nodes without precise constraint but positional information msgs_to_multiply = [node.date_constraint] if node.date_constraint is not None else [] child_messages = [child.joint_pos_Lx for child in node.clades if child.joint_pos_Lx is not None] msgs_to_multiply.extend(child_messages) ## When a coalescent model is being used, the cost of having no merger events along the branch ## and one at the node at time t is also factored in: -np.log((gamma(t) * np.exp**-I(t))**(k-1)), ## where k is the number of branches that merge at node t, gamma(t) is the total_merger_rate ## at time t and I(t) is the integral of the merger_rate (rate of a given lineage converging) ## evaluated at position t. (Note that the integral of the merger rate is in fact calculated ## for k branches, but due to the fact that inner branches overlap at time t one can be removed ## resulting in the exponent (k-1)) if hasattr(self, 'merger_model') and self.merger_model: time_points = np.unique(np.concatenate([msg.x for msg in msgs_to_multiply])) if node.is_terminal(): msgs_to_multiply.append(Distribution(time_points, -self.merger_model.integral_merger_rate(time_points), is_log=True)) else: msgs_to_multiply.append(self.merger_model.node_contribution(node, time_points)) # msgs_to_multiply combined returns the subtree likelihood given the node's constraint and child messages if len(msgs_to_multiply) == 0: # there are no constraints node.joint_pos_Lx = None node.joint_pos_Cx = None continue elif len(msgs_to_multiply)>1: # combine the different msgs and constraints subtree_distribution = Distribution.multiply(msgs_to_multiply) else: # there is exactly one constraint. subtree_distribution = msgs_to_multiply[0] if node.up is None: # this is the root, set dates if hasattr(self, 'merger_model') and self.merger_model: # Removed merger rate must be added back at the root as nolonger an internal node subtree_distribution = Distribution.multiply([subtree_distribution, Distribution(subtree_distribution.x, self.merger_model.integral_merger_rate(subtree_distribution.x), is_log=True)]) subtree_distribution._adjust_grid(rel_tol=self.rel_tol_prune) # set root position and joint likelihood of the tree node.time_before_present = subtree_distribution.peak_pos node.joint_pos_Lx = subtree_distribution node.joint_pos_Cx = None node.clock_length = node.branch_length else: # otherwise propagate to parent res, res_t = NodeInterpolator.convolve(subtree_distribution, node.branch_length_interpolator, max_or_integral='max', inverse_time=True, n_grid_points = self.node_grid_points, n_integral=self.n_integral, rel_tol=self.rel_tol_refine) res._adjust_grid(rel_tol=self.rel_tol_prune) node.joint_pos_Lx = res node.joint_pos_Cx = res_t # construct the inverse cumulant distribution for the branch number estimates from scipy.interpolate import interp1d if node.date_constraint is not None and node.date_constraint.is_delta: node.joint_inverse_cdf=interp1d([0,1], node.date_constraint.peak_pos*np.ones(2), kind="linear") elif isinstance(subtree_distribution, Distribution): dt = np.diff(subtree_distribution.x) y = subtree_distribution.prob_relative(subtree_distribution.x) int_y = np.concatenate(([0], np.cumsum(dt*(y[1:]+y[:-1])/2.0))) int_y/=int_y[-1] node.joint_inverse_cdf = interp1d(int_y, subtree_distribution.x, kind="linear") #node.joint_cdf = interp1d(subtree_distribution.x, int_y, kind="linear") # go through the nodes from root towards the leaves and assign joint ML positions: self.logger("ClockTree - Joint reconstruction: Propagating root -> leaves...", 2) for node in self.tree.find_clades(order='preorder'): # root first, msgs to children if node.up is None: # root node continue # the position was already set on the previous step if node.joint_pos_Cx is None: # no constraints or branch is bad - reconstruct from the branch len interpolator if hasattr(self, 'merger_model') and self.merger_model and node.up is not None: ##add merger_cost if using the coalescent model merger_cost = Distribution(node.branch_length_interpolator.x, self.merger_model.cost(node.time_before_present, node.branch_length_interpolator.x, multiplicity=len(node.up.clades)), is_log=True) node.branch_length = Distribution.multiply([merger_cost, node.branch_length_interpolator]).peak_pos else: node.branch_length = node.branch_length_interpolator.peak_pos elif node.date_constraint is not None and node.date_constraint.is_delta: node.branch_length = node.up.time_before_present - node.date_constraint.peak_pos elif isinstance(node.joint_pos_Cx, Distribution): # NOTE the Lx distribution is the likelihood, given the position of the parent # (Lx.x = parent position, Lx.y = LH of the node_pos given Lx.x, # the length of the branch corresponding to the most likely # subtree is node.Cx(node.up.time_before_present)) # subtree_LH = node.joint_pos_Lx(node.up.time_before_present) node.branch_length = node.joint_pos_Cx(max(node.joint_pos_Cx.xmin, node.up.time_before_present)) # clean up tiny negative branch length, warn against bigger ones. if node.branch_length<0: if node.branch_length>-2*ttconf.TINY_NUMBER: self.logger(f"ClockTree - Joint reconstruction: correcting rounding error of {node.name} bl={node.branch_length:1.2e}", 4) else: self.logger(f"ClockTree - Joint reconstruction: NEGATIVE BRANCH LENGTH {node.name} bl={node.branch_length:1.2e}", 2, warn=True) node.branch_length = 0 node.time_before_present = node.up.time_before_present - node.branch_length node.clock_length = node.branch_length # cleanup, if required if not self.debug: _cleanup() def timetree_likelihood(self, time_marginal): ''' Return the likelihood of the data given the current branch length in the tree ''' if time_marginal: LH = self.tree.root.marginal_pos_LH.integrate(return_log=True, a=self.tree.root.marginal_pos_LH.xmin, b=self.tree.root.marginal_pos_LH.xmax, n=1000) else: LH = 0 for node in self.tree.find_clades(order='preorder'): # sum the likelihood contributions of all branches if node.up is None: # root node continue LH -= node.branch_length_interpolator(node.branch_length) # add the root sequence LH and return if self.aln and self.sequence_reconstruction: LH += self.gtr.sequence_logLH(self.tree.root.cseq, pattern_multiplicity=self.data.multiplicity()) return LH def _ml_t_marginal(self): """ Compute the marginal probability distribution of the internal nodes positions by propagating from the tree leaves towards the root. The result of this operation are the probability distributions of each internal node, conditional on the constraints on all leaves of the tree, which have sampling dates. The probability distributions are set as marginal_pos_LH attributes to the nodes. Parameters ---------- assign_dates : bool, default False If True, the inferred dates will be assigned to the nodes as :code:`time_before_present' attributes, and their branch lengths will be corrected accordingly. .. Note:: Normally, the dates are assigned by running joint reconstruction. Returns ------- None Every internal node is assigned the probability distribution in form of an interpolation object and sends this distribution further towards the root. """ def _cleanup(): for node in self.tree.find_clades(): try: del node.marginal_pos_Lx del node.subtree_distribution del node.msg_from_parent #del node.marginal_pos_LH except: pass method = 'FFT' if self.use_fft else 'explicit' self.logger(f"ClockTree - Marginal reconstruction using {method} convolution: Propagating leaves -> root...", 2) # go through the nodes from leaves towards the root: for node in self.tree.find_clades(order='postorder'): # children first, msg to parents if node.bad_branch: # no information node.marginal_pos_Lx = None else: # all other nodes if node.date_constraint is not None and node.date_constraint.is_delta: # there is a hard time constraint # initialize the Lx for nodes with precise date constraint: # subtree probability given the position of the parent node # position of the parent node is given by the branch length # distribution attached to the child node position node.subtree_distribution = node.date_constraint bl = node.branch_length_interpolator.x x = bl + node.date_constraint.peak_pos if hasattr(self, 'merger_model') and self.merger_model: node.marginal_pos_Lx = Distribution(x, -self.merger_model.integral_merger_rate(node.date_constraint.peak_pos) +node.branch_length_interpolator(bl), min_width=self.min_width, is_log=True) else: node.marginal_pos_Lx = Distribution(x, node.branch_length_interpolator(bl), min_width=self.min_width, is_log=True) else: # all nodes without precise constraint but positional information # subtree likelihood given the node's constraint and child msg: msgs_to_multiply = [node.date_constraint] if node.date_constraint is not None else [] msgs_to_multiply.extend([child.marginal_pos_Lx for child in node.clades if child.marginal_pos_Lx is not None]) # combine the different msgs and constraints if len(msgs_to_multiply)==0: # no information node.marginal_pos_Lx = None continue elif len(msgs_to_multiply)==1: node.product_of_child_messages = msgs_to_multiply[0] else: # combine the different msgs and constraints node.product_of_child_messages = Distribution.multiply(msgs_to_multiply) ## When a coalescent model is being used, the cost of having no merger events along the branch ## and one at the node at time t is also factored in: -np.log((gamma(t) * np.exp**-I(t))**(k-1)), ## where k is the number of branches that merge at node t, gamma(t) is the total_merger_rate ## at time t and I(t) is the integral of the merger_rate (rate of a given lineage converging) ## evaluated at position t. (Note that the integral of the merger rate is in fact calculated ## for k branches, but due to the fact that inner branches overlap at time t one can be removed ## resulting in the exponent (k-1)) if hasattr(self, 'merger_model') and self.merger_model: time_points = node.product_of_child_messages.x # set multiplicity of node to number of good child branches if node.is_terminal(): merger_contribution = Distribution(time_points, -self.merger_model.integral_merger_rate(time_points), is_log=True) else: merger_contribution = self.merger_model.node_contribution(node, time_points) node.subtree_distribution = Distribution.multiply([merger_contribution, node.product_of_child_messages]) else: node.subtree_distribution = node.product_of_child_messages if node.up is None: # this is the root, set dates node.subtree_distribution._adjust_grid(rel_tol=self.rel_tol_prune) node.marginal_pos_Lx = node.subtree_distribution if hasattr(self, 'merger_model') and self.merger_model: # Removed merger rate must be added back at the root as nolonger an internal node node.marginal_pos_LH = Distribution.multiply([node.subtree_distribution, Distribution(node.subtree_distribution.x, self.merger_model.integral_merger_rate(node.subtree_distribution.x), is_log=True)]) else: node.marginal_pos_LH = node.subtree_distribution else: # otherwise propagate to parent if self.use_fft: res, res_t = NodeInterpolator.convolve_fft(node.subtree_distribution, node.branch_length_interpolator, self.fft_grid_size), None else: res, res_t = NodeInterpolator.convolve(node.subtree_distribution, node.branch_length_interpolator, max_or_integral='integral', n_grid_points = self.node_grid_points, n_integral=self.n_integral, rel_tol=self.rel_tol_refine) res._adjust_grid(rel_tol=self.rel_tol_prune) node.marginal_pos_Lx = res self.logger("ClockTree - Marginal reconstruction: Propagating root -> leaves...", 2) from scipy.interpolate import interp1d for node in self.tree.find_clades(order='preorder'): ## If a delta constraint in known no further work required if (node.date_constraint is not None) and (not node.bad_branch) and node.date_constraint.is_delta: node.marginal_pos_LH = node.date_constraint node.msg_from_parent = None #if internal node has a delta constraint no previous information is passed on elif node.up is None: node.msg_from_parent = None # nothing beyond the root # all other cases (All internal nodes + unconstrained terminals) else: parent = node.up msg_parent_to_node =None if node.marginal_pos_Lx is not None: if len(parent.clades)<5: # messages from the complementary subtree (iterate over all sister nodes) complementary_msgs = [parent.date_constraint] if parent.date_constraint is not None else [] complementary_msgs.extend([sister.marginal_pos_Lx for sister in parent.clades if (sister != node) and (sister.marginal_pos_Lx is not None)]) else: complementary_msgs = [Distribution.divide(parent.product_of_child_messages, node.marginal_pos_Lx)] # if parent itself got smth from the root node, include it if parent.msg_from_parent is not None: complementary_msgs.append(parent.msg_from_parent) if hasattr(self, 'merger_model') and self.merger_model: time_points = parent.marginal_pos_LH.x if len(time_points)<5: time_points = np.unique(np.concatenate([ time_points, np.linspace(np.min([x.xmin for x in complementary_msgs]), np.max([x.xmax for x in complementary_msgs]), 50), np.linspace(np.min([x.effective_support[0] for x in complementary_msgs]), np.max([x.effective_support[1] for x in complementary_msgs]), 50), ])) # As Lx (the product of child messages) does not include the node contribution this must # be added to recover the full distribution of the parent node w/o contribution of the focal node. complementary_msgs.append(self.merger_model.node_contribution(parent, time_points)) # Removed merger rate must be added back if no msgs from parent (equivalent to root node case) if parent.msg_from_parent is None: complementary_msgs.append(Distribution(time_points, self.merger_model.integral_merger_rate(time_points), is_log=True)) if len(complementary_msgs): msg_parent_to_node = NodeInterpolator.multiply(complementary_msgs) msg_parent_to_node._adjust_grid(rel_tol=self.rel_tol_prune) elif parent.marginal_pos_LH is not None: msg_parent_to_node = parent.marginal_pos_LH if msg_parent_to_node is None: x = [parent.numdate, numeric_date()] msg_parent_to_node = NodeInterpolator(x, [1.0, 1.0],min_width=self.min_width) # integral message, which delivers to the node the positional information # from the complementary subtree if self.use_fft: res, res_t = NodeInterpolator.convolve_fft(msg_parent_to_node, node.branch_length_interpolator, fft_grid_size = self.fft_grid_size, inverse_time=False), None else: res, res_t = NodeInterpolator.convolve(msg_parent_to_node, node.branch_length_interpolator, max_or_integral='integral', inverse_time=False, n_grid_points = self.node_grid_points, n_integral=self.n_integral, rel_tol=self.rel_tol_refine) node.msg_from_parent = res if node.marginal_pos_Lx is None: node.marginal_pos_LH = node.msg_from_parent else: #node.subtree_distribution contains merger model contribution of this node node.marginal_pos_LH = NodeInterpolator.multiply((node.msg_from_parent, node.subtree_distribution)) self.logger('ClockTree._ml_t_root_to_leaves: computed convolution' ' with %d points at node %s'%(len(res.x),node.name), 4) if self.debug: tmp = np.diff(res.y-res.peak_val) nsign_changed = np.sum((tmp[1:]*tmp[:-1]<0)&(res.y[1:-1]-res.peak_val<500)) if nsign_changed>1: import matplotlib.pyplot as plt plt.ion() plt.plot(res.x, res.y-res.peak_val, '-o') plt.plot(res.peak_pos - node.branch_length_interpolator.x, node.branch_length_interpolator(node.branch_length_interpolator.x)-node.branch_length_interpolator.peak_val, '-o') plt.plot(msg_parent_to_node.x,msg_parent_to_node.y-msg_parent_to_node.peak_val, '-o') plt.ylim(0,100) plt.xlim(-0.05, 0.05) # assign positions of nodes and branch length # note that marginal reconstruction can result in negative branch lengths node.time_before_present = node.marginal_pos_LH.peak_pos if node.up: node.clock_length = node.up.time_before_present - node.time_before_present node.branch_length = node.clock_length # construct the inverse cumulative distribution to evaluate confidence intervals if node.marginal_pos_LH.is_delta: node.marginal_inverse_cdf=interp1d([0,1], node.marginal_pos_LH.peak_pos*np.ones(2), kind="linear") node.marginal_cdf = interp1d(node.marginal_pos_LH.peak_pos*np.ones(2), [0,1], kind="linear") else: dt = np.diff(node.marginal_pos_LH.x) y = node.marginal_pos_LH.prob_relative(node.marginal_pos_LH.x) int_y = np.concatenate(([0], np.cumsum(dt*(y[1:]+y[:-1])/2.0))) int_x = node.marginal_pos_LH.x if int_y[-1] == 0: if len(dt)==0 or node.marginal_pos_LH.fwhm < 100*ttconf.TINY_NUMBER: ##delta function peak_idx = node.marginal_pos_LH._peak_idx int_y = np.concatenate((np.zeros(peak_idx), np.ones(len(node.marginal_pos_LH.x)-peak_idx))) if peak_idx == 0: int_y = np.concatenate(([0], int_y)) int_x = np.concatenate(([int_x[0]- ttconf.TINY_NUMBER], int_x)) else: raise TreeTimeUnknownError("Loss of probability in marginal time tree inference.") else: int_y/=int_y[-1] node.marginal_inverse_cdf = interp1d(int_y, int_x, kind="linear") node.marginal_cdf = interp1d(int_x, int_y, kind="linear") if not self.debug: _cleanup() def convert_dates(self): ''' This function converts the estimated "time_before_present" properties of all nodes to numerical dates stored in the "numdate" attribute. This date is further converted into a human readable date string in format %Y-%m-%d assuming the usual calendar. Returns ------- None All manipulations are done in place on the tree ''' from datetime import datetime, timedelta now = numeric_date() for node in self.tree.find_clades(): years_bp = self.date2dist.to_years(node.time_before_present) if years_bp < 0 and self.real_dates: if not hasattr(node, "bad_branch") or node.bad_branch is False: self.logger("ClockTree.convert_dates -- WARNING: The node is later than today, but it is not " "marked as \"BAD\", which indicates the error in the " "likelihood optimization.", 4, warn=True) else: self.logger("ClockTree.convert_dates -- WARNING: node which is marked as \"BAD\" optimized " "later than present day", 4, warn=True) node.numdate = now - years_bp node.date = datestring_from_numeric(node.numdate) def branch_length_to_years(self): ''' This function sets branch length to reflect the date differences between parent and child nodes measured in years. Should only be called after :py:meth:`timetree.ClockTree.convert_dates` has been called. Returns ------- None All manipulations are done in place on the tree ''' self.logger('ClockTree.branch_length_to_years: setting node positions in units of years', 2) if not hasattr(self.tree.root, 'numdate'): self.logger('ClockTree.branch_length_to_years: infer ClockTree first', 2,warn=True) self.tree.root.branch_length = 0.1 for n in self.tree.find_clades(order='preorder'): if n.up is not None: n.branch_length = n.numdate - n.up.numdate def calc_rate_susceptibility(self, rate_std=None, params=None): """return the time tree estimation of evolutionary rates +/- one standard deviation form the ML estimate. Returns ------- TreeTime.return_code : str success or failure """ params = params or {} if rate_std is None: if not (self.clock_model['valid_confidence'] and 'cov' in self.clock_model): raise ValueError("ClockTree.calc_rate_susceptibility: need valid standard deviation of the clock rate to estimate dating error.") rate_std = np.sqrt(self.clock_model['cov'][0,0]) if self.clock_model['slope']<0: raise ValueError("ClockTree.calc_rate_susceptibility: rate estimate is negative. In this case the heuristic treetime uses to account for uncertainty in the rate estimate does not work. Please specify the clock-rate and its standard deviation explicitly via CLI parameters or arguments.") current_rate = np.abs(self.clock_model['slope']) upper_rate = self.clock_model['slope'] + rate_std lower_rate = max(0.1*current_rate, self.clock_model['slope'] - rate_std) for n in self.tree.find_clades(): if n.up: n._orig_gamma = n.branch_length_interpolator.gamma n.branch_length_interpolator.gamma = n._orig_gamma*upper_rate/current_rate self.logger("###ClockTree.calc_rate_susceptibility: run with upper bound of rate estimate", 1) self.make_time_tree(**params) self.logger("###ClockTree.calc_rate_susceptibility: rate: %f, LH:%f"%(upper_rate, self.tree.positional_LH), 2) for n in self.tree.find_clades(): n.numdate_rate_variation = [(upper_rate, n.numdate)] if n.up: n.branch_length_interpolator.gamma = n._orig_gamma*lower_rate/current_rate self.logger("###ClockTree.calc_rate_susceptibility: run with lower bound of rate estimate", 1) self.make_time_tree(**params) self.logger("###ClockTree.calc_rate_susceptibility: rate: %f, LH:%f"%(lower_rate, self.tree.positional_LH), 2) for n in self.tree.find_clades(): n.numdate_rate_variation.append((lower_rate, n.numdate)) if n.up: n.branch_length_interpolator.gamma = n._orig_gamma self.logger("###ClockTree.calc_rate_susceptibility: run with central rate estimate", 1) self.make_time_tree(**params) self.logger("###ClockTree.calc_rate_susceptibility: rate: %f, LH:%f"%(current_rate, self.tree.positional_LH), 2) for n in self.tree.find_clades(): n.numdate_rate_variation.append((current_rate, n.numdate)) n.numdate_rate_variation.sort(key=lambda x:x[1]) # sort estimates for different rates by numdate return ttconf.SUCCESS def date_uncertainty_due_to_rate(self, node, interval=(0.05, 0.095)): """use previously calculated variation of the rate to estimate the uncertainty in a particular numdate due to rate variation. Parameters ---------- node : PhyloTree.Clade node for which the confidence interval is to be calculated interval : tuple, optional Array of length two, or tuple, defining the bounds of the confidence interval """ if hasattr(node, "numdate_rate_variation"): from scipy.special import erfinv nsig = [np.sqrt(2.0)*erfinv(-1.0 + 2.0*x) if x*(1.0-x) else 0 for x in interval] l,c,u = [x[1] for x in node.numdate_rate_variation] return np.array([c + x*np.abs(y-c) for x,y in zip(nsig, (l,u))]) else: return None def combine_confidence(self, center, limits, c1=None, c2=None): if c1 is None and c2 is None: return np.array(limits) elif c1 is None: min_val,max_val = c2 elif c2 is None: min_val,max_val = c1 else: min_val = center - np.sqrt((c1[0]-center)**2 + (c2[0]-center)**2) max_val = center + np.sqrt((c1[1]-center)**2 + (c2[1]-center)**2) return np.array([max(limits[0], min_val), min(limits[1], max_val)]) def get_confidence_interval(self, node, interval = (0.05, 0.95)): ''' If temporal reconstruction was done using the marginal ML mode, the entire distribution of times is available. This function determines the 90% (or other) confidence interval, defined as the range where 5% of probability is below and above. Note that this does not necessarily contain the highest probability position. In absense of marginal reconstruction, it will return uncertainty based on rate variation. If both are present, the wider interval will be returned. Parameters ---------- node : PhyloTree.Clade The node for which the confidence interval is to be calculated interval : tuple, list Array of length two, or tuple, defining the bounds of the confidence interval Returns ------- confidence_interval : numpy array Array with two numerical dates delineating the confidence interval ''' rate_contribution = self.date_uncertainty_due_to_rate(node, interval) if hasattr(node, "marginal_inverse_cdf"): min_date, max_date = [self.date2dist.to_numdate(x) for x in (node.marginal_pos_LH.xmax, node.marginal_pos_LH.xmin)] if node.marginal_inverse_cdf=="delta": return np.array([node.numdate, node.numdate]) else: mutation_contribution = self.date2dist.to_numdate(node.marginal_inverse_cdf(np.array(interval))[::-1]) else: min_date, max_date = [-np.inf, np.inf] return self.combine_confidence(node.numdate, (min_date, max_date), c1=rate_contribution, c2=mutation_contribution) def get_max_posterior_region(self, node, fraction = 0.9): ''' If temporal reconstruction was done using the marginal ML mode, the entire distribution of times is available. This function determines the interval around the highest posterior probability region that contains the specified fraction of the probability mass. In absense of marginal reconstruction, it will return uncertainty based on rate variation. If both are present, the wider interval will be returned. Parameters ---------- node : PhyloTree.Clade The node for which the posterior region is to be calculated interval : float Float specifying who much of the posterior probability is to be contained in the region Returns ------- max_posterior_region : numpy array Array with two numerical dates delineating the high posterior region ''' if node.marginal_inverse_cdf=="delta": return np.array([node.numdate, node.numdate]) min_max = (node.marginal_pos_LH.xmin, node.marginal_pos_LH.xmax) min_date, max_date = [self.date2dist.to_numdate(x) for x in min_max][::-1] if node.marginal_pos_LH.peak_pos == min_max[0]: #peak on the left return self.get_confidence_interval(node, (0, fraction)) elif node.marginal_pos_LH.peak_pos == min_max[1]: #peak on the right return self.get_confidence_interval(node, (1.0-fraction, 1.0)) else: # peak in the center of the distribution rate_contribution = self.date_uncertainty_due_to_rate(node, ((1-fraction)*0.5, 1.0-(1.0-fraction)*0.5)) # construct height to position interpolators left and right of the peak # this assumes there is only one peak --- might fail in odd cases from scipy.interpolate import interp1d from scipy.optimize import minimize_scalar as minimize pidx = np.argmin(node.marginal_pos_LH.y) pval = np.min(node.marginal_pos_LH.y) # check if the distribution as at least 3 points and that the peak is not either of the two # end points. Otherwise, interpolation objects can be initialized. if node.marginal_pos_LH.y.shape[0]<3 or pidx==0 or pidx==node.marginal_pos_LH.y.shape[0]-1: value_str = "values: " + ','.join([str(x) for x in node.marginal_pos_LH.y]) self.logger("get_max_posterior_region: peak on boundary or array too short." + value_str, 1, warn=True) mutation_contribution=None else: left = interp1d(node.marginal_pos_LH.y[:(pidx+1)]-pval, node.marginal_pos_LH.x[:(pidx+1)], kind='linear', fill_value=min_max[0], bounds_error=False) right = interp1d(node.marginal_pos_LH.y[pidx:]-pval, node.marginal_pos_LH.x[pidx:], kind='linear', fill_value=min_max[1], bounds_error=False) # function to minimize -- squared difference between prob mass and desired fracion def func(x, thres): interval = np.array([left(x), right(x)]).squeeze() return (thres - np.diff(node.marginal_cdf(np.array(interval))))**2 # minimze and determine success sol = minimize(func, bracket=[0,10], args=(fraction,), method='brent') if sol['success']: mutation_contribution = self.date2dist.to_numdate(np.array([right(sol['x']), left(sol['x'])]).squeeze()) else: # on failure, return standard confidence interval mutation_contribution = None return self.combine_confidence(node.numdate, (min_date, max_date), c1=rate_contribution, c2=mutation_contribution) if __name__=="__main__": pass treetime-0.11.1/treetime/config.py000066400000000000000000000020131447636507100170560ustar00rootroot00000000000000VERBOSE = 3 BIG_NUMBER = 1e10 TINY_NUMBER = 1e-12 SUPERTINY_NUMBER = 1e-24 MIN_LOG = -1e8 # minimal log value MIN_BRANCH_LENGTH = 1e-3 # fraction of length 'one_mutation' that is used as lower cut-off for branch lengths in GTR OVER_DISPERSION = 10 # distribution parameters BRANCH_GRID_SIZE_ROUGH = 75 NODE_GRID_SIZE_ROUGH = 60 N_INTEGRAL_ROUGH = 60 BRANCH_GRID_SIZE = 125 NODE_GRID_SIZE = 100 N_INTEGRAL = 100 BRANCH_GRID_SIZE_FINE = 200 NODE_GRID_SIZE_FINE = 180 N_INTEGRAL_FINE = 150 BRANCH_GRID_SIZE_ULTRA = 300 NODE_GRID_SIZE_ULTRA = 400 N_INTEGRAL_ULTRA = 250 # distribution parameters for FFT FFT_FWHM_GRID_SIZE = 150 MIN_INTEGRATION_PEAK = 0.001 # clocktree parameters BRANCH_LEN_PENALTY = 0 MAX_BRANCH_LENGTH = 4.0 # only relevant for branch length optimization and time trees - upper boundary of interpolator objects NINTEGRAL = 300 REL_TOL_PRUNE = 0.01 REL_TOL_REFINE = 0.05 NIQD = 3 # SUCCESS = "success" ERROR = "error" # treetime # autocorrelated molecular clock coefficients MU_ALPHA = 1 MU_BETA = 1 treetime-0.11.1/treetime/distribution.py000066400000000000000000000407611447636507100203440ustar00rootroot00000000000000import numpy as np from . import TreeTimeUnknownError from scipy.interpolate import interp1d try: from collections.abc import Iterable except ImportError: from collections import Iterable from .config import BIG_NUMBER, MIN_INTEGRATION_PEAK, TINY_NUMBER from .utils import clip class Distribution(object): """ Class to implement the probability distribution. This class wraps the scipy linear interpolation object, and implements some additional operations, needed to manipulate distributions for tree nodes positions, branch lengths, etc. This class is callable, so it can be treated similarly to the scipy interpolation object. """ @staticmethod def calc_fwhm(distribution, is_neg_log=True): """ Assess the width of the probability distribution. This returns full-width-half-max """ if isinstance(distribution, interp1d): if is_neg_log: ymin = distribution.y.min() log_prob = distribution.y-ymin else: log_prob = -np.log(distribution.y) log_prob -= log_prob.min() xvals = distribution.x elif isinstance(distribution, Distribution): # Distribution always stores neg log-prob with the peak value subtracted xvals = distribution._func.x log_prob = distribution._func.y else: raise TypeError("Error in computing the FWHM for the distribution. " " The input should be either Distribution or interpolation object") L = xvals.shape[0] # 0.69... is log(2), there is always one value for which this is true since # the minimum is subtracted tmp = np.where(log_prob < 0.693147)[0] if len(tmp)==0: raise ValueError("Error in computing the FWHM for the distribution. This is " "most likely caused by incorrect input data.") x_l, x_u = tmp[0], tmp[-1] if L < 2: print ("Not enough points to compute FWHM: returning zero") return min(TINY_NUMBER, distribution.xmax - distribution.xmin) else: # need to guard against out-of-bounds errors return max(TINY_NUMBER, xvals[min(x_u+1,L-1)] - xvals[max(0,x_l-1)]) @classmethod def delta_function(cls, x_pos, weight=1., min_width=MIN_INTEGRATION_PEAK): """ Create delta function distribution. """ distribution = cls(x_pos,0.,is_log=True, min_width=min_width) distribution.weight = weight return distribution @classmethod def shifted_x(cls, dist, delta_x): return Distribution(dist.x+delta_x, dist.y, kind=dist.kind) @staticmethod def multiply(dists): ''' multiplies a list of Distribution objects ''' if not all([isinstance(k, Distribution) for k in dists]): raise NotImplementedError("Can only multiply Distribution objects") n_delta = np.sum([k.is_delta for k in dists]) min_width = np.max([k.min_width for k in dists]) if n_delta>1: raise ArithmeticError("Cannot multiply more than one delta functions!") elif n_delta==1: delta_dist_ii = np.where([k.is_delta for k in dists])[0][0] delta_dist = dists[delta_dist_ii] new_xpos = delta_dist.peak_pos new_weight = np.prod([k.prob(new_xpos) for k in dists if k!=delta_dist_ii]) * delta_dist.weight res = Distribution.delta_function(new_xpos, weight = new_weight,min_width=min_width) else: new_xmin = np.max([k.xmin for k in dists]) new_xmax = np.min([k.xmax for k in dists]) x_vals = np.unique(np.concatenate([k.x for k in dists])) x_vals = x_vals[(x_vals > new_xmin - TINY_NUMBER)&(x_vals < new_xmax + TINY_NUMBER)] n_dists = len(dists) # for reduce number of points if there are many distributions if len(x_vals)>100*n_dists and n_dists>3: # make sure there are at least 3 points per distribution on average n_bins = len(x_vals)//n_dists - 6 lower_cut_off = n_dists*3 upper_cut_off = n_dists*(n_bins + 3) # use peripheral points from the original array, average the center x_vals = np.concatenate((x_vals[:lower_cut_off], x_vals[lower_cut_off:upper_cut_off].reshape((-1,n_dists)).mean(axis=1), x_vals[upper_cut_off:])) # evaluate the function at the consolidated lists of x-values y_vals = np.sum([k.__call__(x_vals) for k in dists], axis=0) try: peak = y_vals.min() except: raise TreeTimeUnknownError("Error: Unexpected behavior detected in multiply function" " when determining peak of function with y-values '"+ str(y_vals) + "'.\n\n" "If you see this error please let us know by filling an issue at: \n" "https://github.com/neherlab/treetime/issues") # remove data points exp(-1000) less likely than the peak ind = (y_vals-peak) new_xmin-TINY_NUMBER)&(x_vals< new_xmax+TINY_NUMBER)] y_vals = numerator.__call__(x_vals) - denominator.__call__(x_vals) peak = y_vals.min() ind = (y_vals-peak) self._xmin-TINY_NUMBER) & (x < self._xmax+TINY_NUMBER) res = np.full(np.shape(x), BIG_NUMBER+self.peak_val, dtype=float) tmp_x = x[valid_idxs] res[valid_idxs] = self._peak_val + self._func(clip(tmp_x, self._xmin+TINY_NUMBER, self._xmax-TINY_NUMBER)) return res elif np.isreal(x): if x < self._xmin or x > self._xmax: return BIG_NUMBER+self.peak_val # x is within interpolation range elif self._delta == True: return self._peak_val else: return self._peak_val + self._func(x) else: raise TypeError("Wrong type: should be float or array") def __mul__(self, other): return Distribution.multiply((self, other)) def calc_effective_support(self, cutoff=1e-15): """ Assess the interval on which the value of self is higher than cutoff relative to its peak """ log_cutoff = -np.log(cutoff) vals = log_cutoff - self.__call__(self.x) + self.peak_val above = vals > 0 above_idx = np.where(above)[0] if len(above_idx)==0: return (self.xmin, self.xmax) try: if above[0]: left = self.xmin else: x1, x2 = self.x[above_idx[0]-1], self.x[above_idx[0]] y1, y2 = vals[above_idx[0]-1], vals[above_idx[0]] d = y2-y1 left = x1*y2/d - x2*y1/d if above[-1]: right = self.xmax else: x1, x2 = self.x[above_idx[-1]], self.x[above_idx[-1]+1] y1, y2 = vals[above_idx[-1]], vals[above_idx[-1]+1] d = y1-y2 right = -x1*y2/d + x2*y1/d except: raise ArithmeticError("Region of support of the distribution could not be determined!") return (left,right) def _adjust_grid(self, rel_tol=0.01, yc=10): n_iter=0 while len(self.x)>200 and n_iter<5: interp_err = 2*self.y[1:-1] - self.y[2:] - self.y[:-2] ind = np.ones_like(self.y, dtype=bool) dy = self.y-self.peak_val prune = interp_err[::2] > rel_tol*(1+ (dy[1:-1:2]/yc)**4) ind[1:-1:2] = prune ind[self.peak_idx] = True if np.mean(prune)<1.0: self._func.y = self._func.y[ind] self._func.x = self._func.x[ind] n_iter+=1 else: break self._peak_idx = self.__call__(self._func.x).argmin() self._peak_pos = self._func.x[self._peak_idx] self._peak_val = self.__call__(self.peak_pos) def prob(self,x): return np.exp(-1 * self.__call__(x)) def prob_relative(self,x): return np.exp(-1 * (self.__call__(x)-self.peak_val)) def x_rescale(self, factor): self._func.x*=factor self._peak_pos*=factor if factor>=0: self._xmin*=factor self._xmax*=factor self._fwhm*=factor self._effective_support = [x*factor for x in self._effective_support] else: tmp = self.xmin self._xmin = factor*self.xmax self._xmax = factor*tmp self._func.x = self._func.x[::-1] self._func.y = self._func.y[::-1] self._fwhm *= -factor self._effective_support = [x*factor for x in self._effective_support[::-1]] def integrate(self, return_log=False ,**kwargs): if self.is_delta: return self.weight else: integral_result = self.integrate_simpson(**kwargs) if return_log: if integral_result==0: return -self.peak_val - BIG_NUMBER else: return -self.peak_val + max(-BIG_NUMBER, np.log(integral_result)) else: return np.exp(-self.peak_val)*integral_result def integrate_trapez(self, a=None, b=None,n=None): mult = 0.5 if a>b: b,a = a,b mult=-0.5 x = np.linspace(a,b,n) dx = np.diff(x) y = self.prob_relative(x) return mult*np.sum(dx*(y[:-1] + y[1:])) def integrate_simpson(self, a=None,b=None,n=None): if n % 2 == 0: n += 1 mult = 1.0/6 dpeak = max(10*self.fwhm, self.min_width) threshold = np.array([a,self.peak_pos-dpeak, self.peak_pos+dpeak,b]) threshold = threshold[(threshold>=a)&(threshold<=b)] threshold.sort() res = [] for lw, up in zip(threshold[:-1], threshold[1:]): x = np.linspace(lw,up,n) dx = np.diff(x[::2]) y = self.prob_relative(x) res.append(mult*(dx[0]*y[0]+ np.sum(4*dx*y[1:-1:2]) + np.sum((dx[:-1]+dx[1:])*y[2:-1:2]) + dx[-1]*y[-1])) return np.sum(res) def fft(self, T, n=None, inverse_time=True): if self.is_delta: raise TreeTimeUnknownError("attempting Fourier transform of delta function.") from numpy.fft import rfft if n is None: n=len(T) vals = self.prob_relative(T) if max(vals)<1e-15: # probability is lost due to sampling next to timepoints with # vanishing probability. Since we interpolate logarithms, this # results in loss of probability when we should have a delta-like # peak. Use min log-value to recalibrate and obtain a meaningful peak log_vals = self.__call__(T) vals = np.exp(-(log_vals - log_vals.min())) if inverse_time: return rfft(vals, n=n) else: return rfft(vals[::-1], n=n) treetime-0.11.1/treetime/gtr.py000066400000000000000000001145511447636507100164200ustar00rootroot00000000000000from collections import defaultdict import numpy as np from . import config as ttconf, TreeTimeError, MissingDataError from .seq_utils import alphabets, profile_maps, alphabet_synonyms def avg_transition(W,pi, gap_index=None): if gap_index is None: return np.einsum('i,ij,j', pi, W, pi) else: return (np.einsum('i,ij,j', pi, W, pi) - np.sum(pi*W[:,gap_index])*pi[gap_index])/(1-pi[gap_index]) class GTR(object): """ Defines General-Time-Reversible model of character evolution. """ def __init__(self, alphabet='nuc', prof_map=None, logger=None): """ Initialize empty evolutionary model. Parameters ---------- alphabet : str, numpy.array Alphabet of the sequence. If a string is passed, it is understood as an alphabet name. In this case, the alphabet and its profile map are pulled from :py:obj:`treetime.seq_utils`. If a numpy array of characters is passed, a new alphabet is constructed, and the default profile map is atached to it. prof_map : dict Dictionary linking characters in the sequence to the likelihood of observing characters in the alphabet. This is used to implement ambiguous characters like 'N'=[1,1,1,1] which are equally likely to be any of the 4 nucleotides. Standard profile_maps are defined in file seq_utils.py. logger : callable Custom logging function that should take arguments (msg, level, warn=False), where msg is a string and level an integer to be compared against verbose. """ self.debug=False self.is_site_specific=False if isinstance(alphabet, str): if alphabet not in alphabet_synonyms: raise AttributeError("Unknown alphabet type specified") else: tmp_alphabet = alphabet_synonyms[alphabet] self.alphabet = alphabets[tmp_alphabet] self.profile_map = profile_maps[tmp_alphabet] else: # not a predefined alphabet self.alphabet = np.array(alphabet) if prof_map is None: # generate trivial unambiguous profile map is none is given self.profile_map = {s:x for s,x in zip(self.alphabet, np.eye(len(self.alphabet)))} else: self.profile_map = {x if type(x) is str else x:k for x,k in prof_map.items()} self.state_index={s:si for si,s in enumerate(self.alphabet)} self.state_index.update({s:si for si,s in enumerate(self.alphabet)}) if logger is None: def logger_default(*args,**kwargs): """standard logging function if none provided""" if self.debug: print(*args) self.logger = logger_default else: self.logger = logger self.ambiguous = None self.gap_index = None self.n_states = len(self.alphabet) self.assign_gap_and_ambiguous() # init all matrices with dummy values self.logger("GTR: init with dummy values!", 3) self.v = None # right eigenvectors self.v_inv = None # left eigenvectors self.eigenvals = None # eigenvalues self.assign_rates() def assign_gap_and_ambiguous(self): n_states = len(self.alphabet) self.logger("GTR: with alphabet: "+str([x for x in self.alphabet]),1) # determine if a character exists that corresponds to no info, i.e. all one profile if any([x.sum()==n_states for x in self.profile_map.values()]): amb_states = [c for c,x in self.profile_map.items() if x.sum()==n_states] self.ambiguous = 'N' if 'N' in amb_states else amb_states[0] self.logger("GTR: ambiguous character: "+self.ambiguous,2) else: self.ambiguous=None # check for a gap symbol try: self.gap_index = self.state_index['-'] except: self.logger("GTR: no gap symbol!", 4, warn=True) self.gap_index=None @property def mu(self): return self._mu @property def Pi(self): return self._Pi @property def W(self): return self._W @W.setter def W(self, value): self.assign_rates(mu=self.mu, pi=self.Pi, W=value) @Pi.setter def Pi(self, value): self.assign_rates(mu=self.mu, pi=value, W=self.W) @mu.setter def mu(self, value): self.assign_rates(mu=value, pi=self.Pi, W=self.W) @property def Q(self): """function that return the product of the transition matrix and the equilibrium frequencies to obtain the rate matrix of the GTR model """ Q_tmp = (self.W*self.Pi).T Q_diag = -np.sum(Q_tmp, axis=0) np.fill_diagonal(Q_tmp, Q_diag) return Q_tmp ###################################################################### ## constructor methods ###################################################################### def __str__(self): ''' String representation of the GTR model for pretty printing ''' multi_site = len(self.Pi.shape)==2 if multi_site: eq_freq_str = "Average substitution rate (mu): "+str(np.round(self.average_rate,6))+'\n' else: eq_freq_str = "Substitution rate (mu): "+str(np.round(self.mu,6))+'\n' if not multi_site: eq_freq_str += "\nEquilibrium frequencies (pi_i):\n" for a,p in zip(self.alphabet, self.Pi): eq_freq_str+=' '+a+': '+str(np.round(p,4))+'\n' W_str = "\nSymmetrized rates from j->i (W_ij):\n" W_str+='\t'+'\t'.join(self.alphabet)+'\n' for a,Wi in zip(self.alphabet, self.W): W_str+= ' '+a+'\t'+'\t'.join([str(np.round(max(0,p),4)) for p in Wi])+'\n' if not multi_site: Q_str = "\nActual rates from j->i (Q_ij):\n" Q_str+='\t'+'\t'.join(self.alphabet)+'\n' for a,Qi in zip(self.alphabet, self.Q): Q_str+= ' '+a+'\t'+'\t'.join([str(np.round(max(0,p),4)) for p in Qi])+'\n' return eq_freq_str + W_str + Q_str @staticmethod def from_file(gtr_fname): """ Parse a GTR string and assign the rates accordingly. Note that the input string is expected to be formatted exactly like the output of the `__str__` method. Parameters ---------- gtr_fname : file name String representation of the GTR model """ try: with open(gtr_fname) as f: alphabet = [] pi = [] while True: line = f.readline() if not line: break if line.strip().startswith("Substitution rate (mu):"): mu = float(line.split(":")[1].strip()) elif line.strip().startswith("Equilibrium frequencies (pi_i):"): line = f.readline() while line.strip()!="": alphabet.append(line.split(":")[0].strip()) pi.append(float(line.split(":")[1].strip())) line = f.readline() if not np.any([len(alphabet) == len(a) and np.all(np.array(alphabet) == a) for a in alphabets.values()]): raise ValueError("GTR: was unable to read custom GTR model in "+str(gtr_fname) +" - Alphabet not recognized") elif line.strip().startswith("Symmetrized rates from j->i (W_ij):"): line = f.readline() line = f.readline() n = len(pi) W = np.ones((n,n)) j = 0 while line.strip()!="": values = line.split() for i in range(n): W[j,i] = float(values[i+1]) j +=1 line = f.readline() if j != n: raise ValueError("GTR: was unable to read custom GTR model in "+str(gtr_fname) +" - Number of lines in W matrix does not match alphabet length") gtr = GTR.custom(mu, pi, W, alphabet = alphabet) return gtr except: raise MissingDataError('GTR: was unable to read custom GTR model in '+str(gtr_fname)) def assign_rates(self, mu=1.0, pi=None, W=None): """ Overwrite the GTR model given the provided data Parameters ---------- mu : float Substitution rate W : nxn matrix Substitution matrix pi : n vector Equilibrium frequencies """ n = len(self.alphabet) self._mu = mu self.is_site_specific=False if pi is not None and len(pi)==n: Pi = np.array(pi) else: if pi is not None and len(pi)!=n: self.logger("length of equilibrium frequency vector does not match alphabet length", 4, warn=True) self.logger("Ignoring input equilibrium frequencies", 4, warn=True) Pi = np.ones(shape=(n,)) self._Pi = Pi/np.sum(Pi) if W is None or W.shape!=(n,n): if (W is not None) and W.shape!=(n,n): self.logger("Substitution matrix size does not match alphabet size", 4, warn=True) self.logger("Ignoring input substitution matrix", 4, warn=True) # flow matrix W = np.ones((n,n)) np.fill_diagonal(W, 0.0) np.fill_diagonal(W, - W.sum(axis=0)) else: W=np.array(W) self._W = 0.5*(W+W.T) np.fill_diagonal(W,0) average_rate = avg_transition(W, self.Pi, gap_index=self.gap_index) self._W = W/average_rate self._mu *=average_rate self._eig() @classmethod def custom(cls, mu=1.0, pi=None, W=None, **kwargs): """ Create a GTR model by specifying the matrix explicitly Parameters ---------- mu : float Substitution rate W : nxn matrix Substitution matrix pi : n vector Equilibrium frequencies **kwargs: Key word arguments to be passed Keyword Args ------------ alphabet : str Specify alphabet when applicable. If the alphabet specification is required, but no alphabet is specified, the nucleotide alphabet will be used as default. """ gtr = cls(**kwargs) gtr.assign_rates(mu=mu, pi=pi, W=W) return gtr @staticmethod def standard(model, **kwargs): """ Create standard model of molecular evolution. Parameters ---------- model : str Model to create. See list of available models below **kwargs: Key word arguments to be passed to the model **Available models** - JC69: Jukes-Cantor 1969 model. This model assumes equal frequencies of the nucleotides and equal transition rates between nucleotide states. For more info, see: Jukes and Cantor (1969). Evolution of Protein Molecules. New York: Academic Press. pp. 21-132. To create this model, use: :code:`mygtr = GTR.standard(model='jc69', mu=, alphabet=)` :code:`my_mu` - substitution rate (float) :code:`my_alph` - alphabet (str: :code:`'nuc'` or :code:`'nuc_nogap'`) - K80: Kimura 1980 model. Assumes equal concentrations across nucleotides, but allows different rates between transitions and transversions. The ratio of the transversion/transition rates is given by kappa parameter. For more info, see Kimura (1980), J. Mol. Evol. 16 (2): 111-120. doi:10.1007/BF01731581. Current implementation of the model does not account for the gaps. :code:`mygtr = GTR.standard(model='k80', mu=, kappa=)` :code:`mu` - overall substitution rate (float) :code:`kappa` - ratio of transversion/transition rates (float) - F81: Felsenstein 1981 model. Assumes non-equal concentrations across nucleotides, but the transition rate between all states is assumed to be equal. See Felsenstein (1981), J. Mol. Evol. 17 (6): 368-376. doi:10.1007/BF01734359 for details. :code:`mygtr = GTR.standard(model='F81', mu=, pi=, alphabet=)` :code:`mu` - substitution rate (float) :code:`pi` - : nucleotide concentrations (numpy.array) :code:`alphabet' - alphabet to use. (:code:`'nuc'` or :code:`'nuc_nogap'`) - HKY85: Hasegawa, Kishino and Yano 1985 model. Allows different concentrations of the nucleotides (as in F81) + distinguishes between transition/transversion substitutions (similar to K80). Link: Hasegawa, Kishino, Yano (1985), J. Mol. Evol. 22 (2): 160-174. doi:10.1007/BF02101694 Current implementation of the model does not account for the gaps :code:`mygtr = GTR.standard(model='HKY85', mu=, pi=, kappa=)` :code:`mu` - substitution rate (float) :code:`pi` - : nucleotide concentrations (numpy.array) :code:`kappa` - ratio of transversion/transition rates (float) - T92: Tamura 1992 model. Extending Kimura (1980) model for the case where a G+C-content bias exists. Link: Tamura K (1992), Mol. Biol. Evol. 9 (4): 678-687. DOI: 10.1093/oxfordjournals.molbev.a040752 Current implementation of the model does not account for the gaps :code:`mygtr = GTR.standard(model='T92', mu=, pi_GC=, kappa=)` :code:`mu` - substitution rate (float) :code:`pi_GC` - : relative GC content :code:`kappa` - ratio of transversion/transition rates (float) - TN93: Tamura and Nei 1993. The model distinguishes between the two different types of transition: (A <-> G) is allowed to have a different rate to (C<->T). Transversions have the same rate. The frequencies of the nucleotides are allowed to be different. Link: Tamura, Nei (1993), MolBiol Evol. 10 (3): 512-526. DOI:10.1093/oxfordjournals.molbev.a040023 :code:`mygtr = GTR.standard(model='TN93', mu=, kappa1=, kappa2=)` :code:`mu` - substitution rate (float) :code:`kappa1` - relative A<-->C, A<-->T, T<-->G and G<-->C rates (float) :code:`kappa` - relative C<-->T rate (float) .. Note:: Rate of A<-->G substitution is set to one. All other rates (kappa1, kappa2) are specified relative to this rate """ from .nuc_models import JC69, K80, F81, HKY85, T92, TN93 from .aa_models import JTT92 if model.lower() in ['jc', 'jc69', 'jukes-cantor', 'jukes-cantor69', 'jukescantor', 'jukescantor69']: model = JC69(**kwargs) elif model.lower() in ['k80', 'kimura80', 'kimura1980']: model = K80(**kwargs) elif model.lower() in ['f81', 'felsenstein81', 'felsenstein1981']: model = F81(**kwargs) elif model.lower() in ['hky', 'hky85', 'hky1985']: model = HKY85(**kwargs) elif model.lower() in ['t92', 'tamura92', 'tamura1992']: model = T92(**kwargs) elif model.lower() in ['tn93', 'tamura_nei_93', 'tamuranei93']: model = TN93(**kwargs) elif model.lower() in ['jtt', 'jtt92']: model = JTT92(**kwargs) else: raise KeyError("The GTR model '{}' is not in the list of available models." "".format(model)) model.mu = kwargs['mu'] if 'mu' in kwargs else 1.0 return model @classmethod def random(cls, mu=1.0, alphabet='nuc', rng=None): """ Creates a random GTR model Parameters ---------- mu : float Substitution rate alphabet : str Alphabet name (should be standard: 'nuc', 'nuc_gap', 'aa', 'aa_gap') """ if rng is None: rng = np.random.default_rng() alphabet=alphabets[alphabet] gtr = cls(alphabet) n = gtr.alphabet.shape[0] pi = 1.0*rng.randint(0,100,size=(n)) W = 1.0*rng.randint(0,100,size=(n,n)) # with gaps gtr.assign_rates(mu=mu, pi=pi, W=W) return gtr @classmethod def infer(cls, nij, Ti, root_state, fixed_pi=None, pc=1.0, gap_limit=0.01, **kwargs): r""" Infer a GTR model by specifying the number of transitions and time spent in each character. The basic equation that is being solved is :math:`n_{ij} = pi_i W_{ij} T_j` where :math:`n_{ij}` are the transitions, :math:`pi_i` are the equilibrium state frequencies, :math:`W_{ij}` is the "substitution attempt matrix", while :math:`T_i` is the time on the tree spent in character state :math:`i`. To regularize the process, we add pseudocounts and also need to account for the fact that the root of the tree is in a particular state. the modified equation is :math:`n_{ij} + pc = pi_i W_{ij} (T_j+pc+root\_state)` Parameters ---------- nij : nxn matrix The number of times a change in character state is observed between state j and i Ti :n vector The time spent in each character state root_state : n vector The number of characters in state i in the sequence of the root node. pc : float Pseudocounts, this determines the lower cutoff on the rate when no substitutions are observed **kwargs: Key word arguments to be passed Keyword Args ------------ alphabet : str Specify alphabet when applicable. If the alphabet specification is required, but no alphabet is specified, the nucleotide alphabet will be used as default. """ from scipy import linalg as LA gtr = cls(**kwargs) gtr.logger("GTR: model inference ",1) dp = 1e-5 Nit = 40 pc_mat = pc*np.ones_like(nij) np.fill_diagonal(pc_mat, 0.0) np.fill_diagonal(nij, 0.0) count = 0 pi_old = np.zeros_like(Ti) if fixed_pi is None: pi = np.ones_like(Ti) else: pi = np.copy(fixed_pi) pi/=pi.sum() W_ij = np.ones_like(nij) mu = (nij.sum()+pc)/(Ti.sum()+pc) # if pi is fixed, this will immediately converge while LA.norm(pi_old-pi) > dp and count < Nit: gtr.logger(' '.join(map(str, ['GTR inference iteration',count,'change:',LA.norm(pi_old-pi)])), 3) count += 1 pi_old = np.copy(pi) W_ij = (nij+nij.T+2*pc_mat)/mu/(np.outer(pi,Ti) + np.outer(Ti,pi) + ttconf.TINY_NUMBER + 2*pc_mat) np.fill_diagonal(W_ij, 0) scale_factor = avg_transition(W_ij,pi, gap_index=gtr.gap_index) W_ij = W_ij/scale_factor if fixed_pi is None: pi = (np.sum(nij+pc_mat,axis=1)+root_state)/(ttconf.TINY_NUMBER + mu*np.dot(W_ij,Ti)+root_state.sum()+np.sum(pc_mat, axis=1)) pi /= pi.sum() mu = (nij.sum() + pc)/(np.sum(pi * (W_ij.dot(Ti)))+pc) else: mu = (nij.sum() + pc)/(np.sum(pi * (W_ij.dot(pi)))*Ti.sum() + pc) if count >= Nit: gtr.logger('WARNING: maximum number of iterations has been reached in GTR inference',3, warn=True) if LA.norm(pi_old-pi) > dp: gtr.logger('the iterative scheme has not converged',3,warn=True) elif np.abs(1-np.max(pi.sum(axis=0))) > dp: gtr.logger('the iterative scheme has converged, but proper normalization was not reached',3,warn=True) if gtr.gap_index is not None: if pi[gtr.gap_index] .9 * ttconf.MAX_BRANCH_LENGTH: self.logger("WARNING: GTR.optimal_t_compressed -- The branch length seems to be very long!", 4, warn=True) if opt["success"] != True: # return hamming distance: number of state pairs where state differs/all pairs new_len = hamming_distance return new_len def prob_t_profiles(self, profile_pair, multiplicity, t, return_log=False, ignore_gaps=True): ''' Calculate the probability of observing a node pair at a distance t Parameters ---------- profile_pair: numpy arrays Probability distributions of the nucleotides at either end of the branch. pp[0] = parent, pp[1] = child multiplicity : numpy array The number of times an alignment pattern is observed t : float Length of the branch separating parent and child ignore_gaps: bool If True, ignore mutations to and from gaps in distance calculations return_log : bool Whether or not to exponentiate the result ''' if t<0: logP = -ttconf.BIG_NUMBER else: Qt = self.expQt(t) if len(Qt.shape)==3: # site specific GTR model res = np.einsum('ai,ija,aj->a', profile_pair[1], Qt, profile_pair[0]) else: res = np.einsum('ai,ij,aj->a', profile_pair[1], Qt, profile_pair[0]) if ignore_gaps and (self.gap_index is not None): # calculate the probability that neither outgroup/node has a gap non_gap_frac = (1-profile_pair[0][:,self.gap_index])*(1-profile_pair[1][:,self.gap_index]) # weigh log LH by the non-gap probability logP = np.sum(multiplicity*np.log(res+ttconf.SUPERTINY_NUMBER)*non_gap_frac) else: logP = np.sum(multiplicity*np.log(res+ttconf.SUPERTINY_NUMBER)) return logP if return_log else np.exp(logP) def propagate_profile(self, profile, t, return_log=False): """ Compute the probability of the sequence state of the parent at time (t+t0, backwards), given the sequence state of the child (profile) at time t0. Parameters ---------- profile : numpy.array Sequence profile. Shape = (L, a), where L - sequence length, a - alphabet size. t : double Time to propagate return_log: bool If True, return log-probability Returns ------- res : np.array Profile of the sequence after time t in the past. Shape = (L, a), where L - sequence length, a - alphabet size. """ Qt = self.expQt(t) res = profile.dot(Qt) return np.log(res) if return_log else res def evolve(self, profile, t, return_log=False): """ Compute the probability of the sequence state of the child at time t later, given the parent profile. Parameters ---------- profile : numpy.array Sequence profile. Shape = (L, a), where L - sequence length, a - alphabet size. t : double Time to propagate return_log: bool If True, return log-probability Returns ------- res : np.array Profile of the sequence after time t in the future. Shape = (L, a), where L - sequence length, a - alphabet size. """ Qt = self.expQt(t).T res = profile.dot(Qt) return np.log(res) if return_log else res def _exp_lt(self, t): """ Parameters ---------- t : float time to propagate Returns -------- exp_lt : numpy.array Array of values exp(lambda(i) * t), where (i) - alphabet index (the eigenvalue number). """ log_val = self.mu * t * self.eigenvals if any(i > 10 for i in log_val): raise ValueError("Error in computing exp(Q * t): Q has positive eigenvalues or the branch length t is too large. " "This is most likely caused by incorrect input data.") return np.exp(log_val) def expQt(self, t): ''' Parameters ---------- t : float Time to propagate Returns -------- expQt : numpy.array Matrix exponential of exo(Qt) ''' eLambdaT = np.diag(self._exp_lt(t)) # vector length = a Qs = self.v.dot(eLambdaT.dot(self.v_inv)) # This is P(nuc1 | given nuc_2) return np.maximum(0,Qs) def expQs(self, s): return self.expQt(s**2) def expQsds(self, s): r''' Returns ------- Qtds : Returns 2 V_{ij} \lambda_j s e^{\lambda_j s**2 } V^{-1}_{jk} This is the derivative of the branch probability with respect to s=\sqrt(t) ''' lambda_eLambdaT = np.diag(2.0*self._exp_lt(s**2)*self.eigenvals*s) return self.v.dot(lambda_eLambdaT.dot(self.v_inv)) def sequence_logLH(self,seq, pattern_multiplicity=None): """ Returns the log-likelihood of sampling a sequence from equilibrium frequency. Expects a sequence as numpy array Parameters ---------- seq : numpy array Compressed sequence as an array of chars pattern_multiplicity : numpy_array The number of times each position in sequence is observed in the initial alignment. If None, sequence is assumed to be not compressed """ if pattern_multiplicity is None: pattern_multiplicity = np.ones_like(seq, dtype=float) return np.sum([np.sum((seq==state)*pattern_multiplicity*np.log(self.Pi[si])) for si,state in enumerate(self.alphabet)]) def average_rate(self): return self.mu*avg_transition(self.W, self.Pi, gap_index=self.gap_index) def save_to_npz(self, outfile): full_gtr = self.mu * np.dot(self.Pi, self.W) desc=np.array(["GTR matrix description\n", "Substitution rate: " + str(self.mu)]) np.savez(outfile, description=desc, full_gtr=full_gtr, char_dist=self.Pi, flow_matrix=self.W) if __name__ == "__main__": pass treetime-0.11.1/treetime/gtr_site_specific.py000066400000000000000000000372411447636507100213110ustar00rootroot00000000000000from collections import defaultdict import numpy as np from . import config as ttconf from .seq_utils import alphabets, profile_maps, alphabet_synonyms from .gtr import GTR class GTR_site_specific(GTR): """ Defines General-Time-Reversible model of character evolution that allows for different models at different sites in the alignment """ def __init__(self, seq_len=1, approximate=True, **kwargs): """constructor for site specfic GTR models Parameters ---------- seq_len : int, optional number of sites, determines dimensions of frequency vectors etc approximate : bool, optional use linear interpolation for exponentiated matrices to speed up calcuations **kwargs Description """ self.seq_len=seq_len self.approximate = approximate super(GTR_site_specific, self).__init__(**kwargs) self.is_site_specific=True @property def Q(self): """function that return the product of the transition matrix and the equilibrium frequencies to obtain the rate matrix of the GTR model """ tmp = np.einsum('ia,ij->ija', self.Pi, self.W) diag_vals = np.sum(tmp, axis=0) for x in range(tmp.shape[-1]): np.fill_diagonal(tmp[:,:,x], -diag_vals[:,x]) return tmp def assign_rates(self, mu=1.0, pi=None, W=None): """ Overwrite the GTR model given the provided data Parameters ---------- mu : float Substitution rate W : nxn matrix Substitution matrix pi : n vector Equilibrium frequencies """ if not np.isscalar(mu) and pi is not None and len(pi.shape)==2: if mu.shape[0]!=pi.shape[1]: raise ValueError("GTR_site_specific: length of rate vector (got {}) and equilibrium frequency vector (got {}) must match!".format(mu.shape[0], pi.shape[1])) n = len(self.alphabet) if np.isscalar(mu): self._mu = mu*np.ones(self.seq_len) else: self._mu = np.copy(mu) self.seq_len = mu.shape[0] if pi is not None and pi.shape[0]==n and len(pi.shape)==2: self.seq_len = pi.shape[1] Pi = np.copy(pi) else: if pi is not None: if len(pi)==n: Pi = np.repeat([pi], self.seq_len, axis=0).T else: raise ValueError("GTR_site_specific: length of equilibrium frequency vector (got {}) does not match alphabet length {}".format(len(pi), n)) else: Pi = np.ones(shape=(n,self.seq_len)) self._Pi = Pi/np.sum(Pi, axis=0) if W is None or W.shape!=(n,n): if (W is not None) and W.shape!=(n,n): raise ValueError("GTR_site_specific: Size of substitution matrix (got {}) does not match alphabet length {}".format(W.shape, n)) W = np.ones((n,n)) np.fill_diagonal(W, 0.0) np.fill_diagonal(W, - W.sum(axis=0)) else: W=0.5*(np.copy(W)+np.copy(W).T) np.fill_diagonal(W,0) average_rate = np.einsum('ia,ij,ja',self.Pi, W, self.Pi)/self.seq_len # average_rate = W.dot(avg_pi).dot(avg_pi) self._W = W/average_rate self._mu *=average_rate self.is_site_specific=True self._eig() self._make_expQt_interpolator() @classmethod def random(cls, L=1, avg_mu=1.0, alphabet='nuc', pi_dirichlet_alpha=1, W_dirichlet_alpha=3.0, mu_gamma_alpha=3.0, rng=None): """ Creates a random GTR model Parameters ---------- L : int, optional number of sites for which to generate a model avg_mu : float Substitution rate alphabet : str Alphabet name (should be standard: 'nuc', 'nuc_gap', 'aa', 'aa_gap') pi_dirichlet_alpha : float, optional parameter of dirichlet distribution W_dirichlet_alpha : float, optional parameter of dirichlet distribution mu_gamma_alpha : float, optional parameter of dirichlet distribution Returns ------- GTR_site_specific model with randomly sampled frequencies """ if rng is None: rng = np.random.default_rng() alphabet=alphabets[alphabet] gtr = cls(alphabet=alphabet, seq_len=L) n = gtr.alphabet.shape[0] # Dirichlet distribution == l_1 normalized vector of samples of the Gamma distribution if pi_dirichlet_alpha: pi = 1.0*rng.gamma(pi_dirichlet_alpha, size=(n,L)) else: pi = np.ones((n,L)) pi /= pi.sum(axis=0) if W_dirichlet_alpha: tmp = 1.0*rng.gamma(W_dirichlet_alpha, size=(n,n)) else: tmp = np.ones((n,n)) tmp = np.tril(tmp,k=-1) W = tmp + tmp.T if mu_gamma_alpha: mu = rng.gamma(mu_gamma_alpha, size=(L,)) else: mu = np.ones(L) gtr.assign_rates(mu=mu, pi=pi, W=W) gtr.mu *= avg_mu/np.mean(gtr.average_rate()) return gtr @classmethod def custom(cls, mu=1.0, pi=None, W=None, **kwargs): """ Create a GTR model by specifying the matrix explicitly Parameters ---------- mu : float Substitution rate W : nxn matrix Substitution matrix pi : n vector Equilibrium frequencies **kwargs: Key word arguments to be passed to the constructor Keyword Args ------------ alphabet : str Specify alphabet when applicable. If the alphabet specification is required, but no alphabet is specified, the nucleotide alphabet will be used as default. """ gtr = cls(**kwargs) gtr.assign_rates(mu=mu, pi=pi, W=W) return gtr @classmethod def infer(cls, sub_ija, T_ia, root_state, pc=1.0, gap_limit=0.01, Nit=30, dp=1e-5, **kwargs): r""" Infer a GTR model by specifying the number of transitions and time spent in each character. The basic equation that is being solved is :math:`n_{ij} = pi_i W_{ij} T_j` where :math:`n_{ij}` are the transitions, :math:`pi_i` are the equilibrium state frequencies, :math:`W_{ij}` is the "substitution attempt matrix", while :math:`T_i` is the time on the tree spent in character state :math:`i`. To regularize the process, we add pseudocounts and also need to account for the fact that the root of the tree is in a particular state. the modified equation is :math:`n_{ij} + pc = pi_i W_{ij} (T_j+pc+root\_state)` Parameters ---------- nija : nxn matrix The number of times a change in character state is observed between state j and i at position a Tia :n vector The time spent in each character state at position a root_state : np.array probability that site a is in state i. pc : float Pseudocounts, this determines the lower cutoff on the rate when no substitutions are observed **kwargs: Key word arguments to be passed Keyword Args ------------ alphabet : str Specify alphabet when applicable. If the alphabet specification is required, but no alphabet is specified, the nucleotide alphabet will be used as default. """ from scipy import linalg as LA gtr = cls(**kwargs) gtr.logger("GTR: model inference ",1) q = len(gtr.alphabet) L = sub_ija.shape[-1] n_iter = 0 n_ija = np.copy(sub_ija) n_ija[range(q),range(q),:] = 0 n_ij = n_ija.sum(axis=-1) m_ia = np.sum(n_ija,axis=1) + root_state + pc n_a = n_ija.sum(axis=1).sum(axis=0) + pc Lambda = np.sum(root_state,axis=0) + q*pc p_ia_old=np.zeros((q,L)) p_ia = np.ones((q,L))/q mu_a = np.ones(L) W_ij = np.ones((q,q)) - np.eye(q) while (LA.norm(p_ia_old-p_ia)>dp) and n_itera', p_ia, W_ij, T_ia)) if n_iter >= Nit: gtr.logger('WARNING: maximum number of iterations has been reached in GTR inference',3, warn=True) if LA.norm(p_ia_old-p_ia) > dp: gtr.logger('the iterative scheme has not converged',3,warn=True) if gtr.gap_index is not None: for p in range(p_ia.shape[-1]): if p_ia[gtr.gap_index,p]2: W = np.copy(self.W[:,:,pi]) np.fill_diagonal(W, 0) elif pi==0: np.fill_diagonal(self.W, 0) W=self.W ev, evec, evec_inv = self._eig_single_site(W,self.Pi[:,pi]) eigvals.append(ev) vec.append(evec) vec_inv.append(evec_inv) self.eigenvals = np.array(eigvals).T self.v = np.swapaxes(vec,0,-1) self.v_inv = np.swapaxes(vec_inv, 0,-1) def _make_expQt_interpolator(self): """Function that evaluates the exponentiated substitution matrix at multiple time points and constructs a linear interpolation object """ self.rate_scale = self.average_rate().mean() t_grid = (1.0/self.rate_scale)*np.concatenate((np.linspace(0,.1,11)[:-1], np.linspace(.1,1,21)[:-1], np.linspace(1,5,21)[:-1], np.linspace(5,10,11))) stacked_expQT = np.stack([self._expQt(t) for t in t_grid], axis=0) from scipy.interpolate import interp1d self.expQt_interpolator = interp1d(t_grid, stacked_expQT, axis=0, assume_sorted=True, copy=False, kind='linear') def _expQt(self, t): """Raw numerical matrix exponentiation using the diagonalized matrix. This is the computational bottleneck in many simulations. Parameters ---------- t : float time Returns ------- np.array stack of matrices for each site """ eLambdaT = np.exp(t*self.mu*self.eigenvals) return np.einsum('jia,ja,kja->ika', self.v, eLambdaT, self.v_inv) def expQt(self, t): if t*self.rate_scale<10 and self.approximate: return self.expQt_interpolator(t) else: return self._expQt(t) def prop_t_compressed(self, seq_pair, multiplicity, t, return_log=False): print("NOT IMPEMENTED") def propagate_profile(self, profile, t, return_log=False): """ Compute the probability of the sequence state of the parent at time (t+t0, backwards), given the sequence state of the child (profile) at time t0. Parameters ---------- profile : numpy.array Sequence profile. Shape = (L, a), where L - sequence length, a - alphabet size. t : double Time to propagate return_log: bool If True, return log-probability Returns ------- ` res : np.array Profile of the sequence after time t in the past. Shape = (L, a), where L - sequence length, a - alphabet size. """ Qt = self.expQt(t) res = np.einsum('ai,ija->aj', profile, Qt) return np.log(np.maximum(ttconf.TINY_NUMBER,res)) if return_log else np.maximum(0,res) def evolve(self, profile, t, return_log=False): """ Compute the probability of the sequence state of the child at time t later, given the parent profile. Parameters ---------- profile : numpy.array Sequence profile. Shape = (L, a), where L - sequence length, a - alphabet size. t : double Time to propagate return_log: bool If True, return log-probability Returns ------- res : np.array Profile of the sequence after time t in the future. Shape = (L, a), where L - sequence length, a - alphabet size. """ Qt = self.expQt(t) res = np.einsum('ai,jia->aj', profile, Qt) return np.log(res) if return_log else res def prob_t(self, seq_p, seq_ch, t, pattern_multiplicity = None, return_log=False, ignore_gaps=True): """ Compute the probability to observe seq_ch (child sequence) after time t starting from seq_p (parent sequence). Parameters ---------- seq_p : character array Parent sequence seq_c : character array Child sequence t : double Time (branch len) separating the profiles. pattern_multiplicity : numpy array If sequences are reduced by combining identical alignment patterns, these multplicities need to be accounted for when counting the number of mutations across a branch. If None, all pattern are assumed to occur exactly once. return_log : bool It True, return log-probability. Returns ------- prob : np.array Resulting probability """ if t<0: logP = -ttconf.BIG_NUMBER else: tmp_eQT = self.expQt(t) bad_indices=(tmp_eQT==0) logQt = np.log(tmp_eQT + ttconf.TINY_NUMBER*(bad_indices)) logQt[np.isnan(logQt) | np.isinf(logQt) | bad_indices] = -ttconf.BIG_NUMBER seq_indices_c = np.zeros(len(seq_ch), dtype=int) seq_indices_p = np.zeros(len(seq_p), dtype=int) for ai, a in enumerate(self.alphabet): seq_indices_p[seq_p==a] = ai seq_indices_c[seq_ch==a] = ai if len(logQt.shape)==2: logP = np.sum(logQt[seq_indices_p, seq_indices_c]*pattern_multiplicity) else: logP = np.sum(logQt[seq_indices_p, seq_indices_c, np.arange(len(seq_ch))]*pattern_multiplicity) return logP if return_log else np.exp(logP) def average_rate(self): if self.Pi.shape[1]>1: return np.einsum('a,ia,ij,ja->a',self.mu, self.Pi, self.W, self.Pi) else: return self.mu*np.einsum('ia,ij,ja->a',self.Pi, self.W, self.Pi) treetime-0.11.1/treetime/merger_models.py000066400000000000000000000441611447636507100204470ustar00rootroot00000000000000""" methods to calculate merger models for a time tree """ import numpy as np import scipy.special as sf from scipy.interpolate import interp1d try: from collections.abc import Iterable except ImportError: from collections import Iterable from . import config as ttconf from .utils import clip class Coalescent(object): """ Class for adding the Kingman coalescent model to the tree time inference, this is optional. The coalescent model is based on the idea that certain tree structures are more likely given a specific population structure and this likelihood can be added to divergence time inference. The coalescent depends on the effective population size (:math:`Tc`) and the number of lineages at any point in time :math:`k(t)`. """ def __init__(self, tree, Tc=0.001, logger=None, date2dist=None, n_branches_posterior=False): ''' Initialize :math:`k(t)` and :math:`Tc` functions Parameters ----------- Tc: float time scale of coalescence / effective population size n_branches_posterior: boolean True if the uncertainty of the divergence time estimates should be taken into consideration when calculating the number of lineages function :math:`k(t)`, False if current divergence times should be seen as fixed (default). Using the uncertainty should make :math:`k(t)` more smooth. ''' super(Coalescent, self).__init__() self.tree = tree self.n_branches_posterior = n_branches_posterior self.calc_branch_count(posterior=n_branches_posterior) self.set_Tc(Tc) self.date2dist = date2dist if logger is None: def f(*args): print(*args) self.logger = f else: self.logger = logger def set_Tc(self, Tc, T=None): ''' initialize the merger model with a coalescent time and calculate the integral of the merger rate Parameters ---------- Tc: float, iterable float if the coalescence rate is constant, if this should be approximated by a piece-wise linear merger rate (skyline method) an iterable with another argument T of the same shape is required T: array an array of same shape as Tc that specifies the time pivots corresponding to Tc note that this array is ordered past to present corresponding to decreasing 'time before present' values ''' if isinstance(Tc, Iterable): if len(Tc)==len(T): x = np.concatenate(([ttconf.BIG_NUMBER], T, [-ttconf.BIG_NUMBER])) y = np.concatenate(([Tc[0]], Tc, [Tc[-1]])) self.Tc = interp1d(x,y) else: self.logger("need Tc values and Timepoints of equal length",2,warn=True) self.Tc = interp1d([-ttconf.BIG_NUMBER, ttconf.BIG_NUMBER], [1e-5, 1e-5]) else: self.Tc = interp1d([-ttconf.BIG_NUMBER, ttconf.BIG_NUMBER], [Tc+ttconf.TINY_NUMBER, Tc+ttconf.TINY_NUMBER]) self.calc_integral_merger_rate() def calc_branch_count(self, posterior=False): ''' Calculates an interpolation object that maps time to the number of concurrent branches in the tree: :math:`k(t)` Parameters ---------- posterior: boolean If False use current best estimate of divergence times, else use posterior distributions of divergence times (If the marginal posterior time distribution of a node has been calculated this is used or approximated using the joint posterior time distribution) ''' ## Divide merger events into either smooth merger events where a posterior likelihood distribution is known or ## delta events where either a date constraint for that node exists or the likelihood distribution is unknown. ## For delta distributions the corresponding nbranches step function can be calculated faster as the nodes can be ## sorted by time and mergers added or subtracted from the previous time, for smooth distributions when a new merger ## event occurs the previous distribution must be evaluated at the corresponding position. self.tree_events = sorted([(n.time_before_present, len(n.clades)-1) for n in self.tree.find_clades() if not n.bad_branch], key=lambda x:-x[0]) tree_delta_events = [] tree_smooth_events = [] if not posterior: tree_delta_events = self.tree_events else: y_power = np.array([-8, -4, -3, -2, 0, 2, 3, 4, 8]) y_points= np.exp(y_power)/(1 + np.exp(y_power)) for n in self.tree.find_clades(): cdf_function=None # use cdf function if exists and not from a delta function if hasattr(n, 'marginal_inverse_cdf') and not n.marginal_pos_LH.is_delta: cdf_function=n.marginal_inverse_cdf elif hasattr(n, 'joint_inverse_cdf') and (n.date_constraint is None or not n.date_constraint.is_delta): cdf_function=n.joint_inverse_cdf if cdf_function is not None: x_vals = np.concatenate([[-ttconf.BIG_NUMBER], cdf_function(y_points), [ttconf.BIG_NUMBER]]) y_vals = np.concatenate([ [(len(n.clades)-1),(len(n.clades)-1)], (1-y_points[1:-1]), [0,0]]) tree_smooth_events += [interp1d(x_vals, y_vals, kind="linear")] else: tree_delta = [(n.time_before_present, len(n.clades)-1)] tree_delta_events += tree_delta tree_delta_events= sorted(tree_delta_events, key=lambda x:-x[0]) if tree_delta_events: # collapse multiple events at one time point into sum of changes from collections import defaultdict dn_branch = defaultdict(int) for (t, dn) in tree_delta_events: dn_branch[t]+=dn unique_mergers = np.array(sorted(dn_branch.items(), key = lambda x:-x[0])) # calculate the branch count at each point summing the delta branch counts nbranches_discrete = [[ttconf.BIG_NUMBER, 1], [unique_mergers[0,0]+ttconf.TINY_NUMBER, 1]] for ti, (t, dn) in enumerate(unique_mergers[:-1]): new_n = nbranches_discrete[-1][1]+dn next_t = unique_mergers[ti+1,0]+ttconf.TINY_NUMBER nbranches_discrete.append([t, new_n]) nbranches_discrete.append([next_t, new_n]) new_n += unique_mergers[-1,1] nbranches_discrete.append([unique_mergers[ti+1,0], new_n]) nbranches_discrete.append([-ttconf.BIG_NUMBER, new_n]) nbranches_discrete=np.array(nbranches_discrete) nbranches_discrete = interp1d(nbranches_discrete[:,0], nbranches_discrete[:,1], kind='linear') if tree_smooth_events: # add all smooth events by evaluating at all unique x points x_tot = np.unique(np.concatenate([t.x for t in tree_smooth_events])) y_tot = np.array([t(x_tot) for t in tree_smooth_events]).sum(axis=0) nbranches_smooth = interp1d(x_tot, y_tot +1, kind='linear') if tree_delta_events: # join smooth and delta merger events into one distribution object x_tot = np.unique(np.concatenate([nbranches_discrete.x, nbranches_smooth.x])) y_tot = nbranches_discrete(x_tot) + nbranches_smooth(x_tot) # if both delta and smooth event objects exist must remove the initial starting value so not double self.nbranches = interp1d(x_tot, y_tot -1, kind='linear') else: self.nbranches = nbranches_smooth else: self.nbranches = nbranches_discrete self.tree_events = np.array(self.tree_events) def calc_integral_merger_rate(self): ''' calculates the integral :math:`int_0^t (k(t')-1)/2Tc(t') dt` and stores it as self.integral_merger_rate. This differences of this quantity evaluated at different times points are the cost of a branch. ''' # integrate the piecewise constant branch count function. tvals = np.unique(self.nbranches.x[1:-1]) rate = self.branch_merger_rate(tvals) avg_rate = 0.5*(rate[1:] + rate[:-1]) cost = np.concatenate(([0],np.cumsum(np.diff(tvals)*avg_rate))) # make interpolation objects for the branch count and its integral # the latter is scaled by 0.5/Tc # need to add extra point at very large time before present to # prevent 'out of interpolation range' errors self.integral_merger_rate = interp1d(np.concatenate(([-ttconf.BIG_NUMBER], tvals,[ttconf.BIG_NUMBER])), np.concatenate(([cost[0]], cost,[cost[-1]])), kind='linear') def branch_merger_rate(self, t): ''' rate at which one particular branch merges with any other branch at time t, in the Kingman model this is: :math:`\kappa(t) = (k(t)-1)/(2Tc(t))` ''' # note that we always have a positive merger rate by capping the # number of branches at 0.5 from below. in these regions, the # function should only be called if the tree changes. return 0.5*np.maximum(0.5,self.nbranches(t)-1.0)/self.Tc(t) def total_merger_rate(self, t): ''' rate at which any branch merges with any other branch at time t, in the Kingman model this is: :math:`\lambda(t) = k(t)(k(t)-1)/(2Tc(t))` ''' # note that we always have a positive merger rate by capping the # number of branches at 0.5 from below. in these regions, the # function should only be called if the tree changes. nlineages = np.maximum(0.5,self.nbranches(t)-1.0) return 0.5*nlineages*(nlineages+1)/self.Tc(t) def cost(self, t_node, branch_length, multiplicity=2.0): ''' returns the cost associated with a branch starting with divergence time t_node (:math:`t_n`) having a branch length :math:`\\tau`. This is equivalent to the probability of there being no merger on that branch and a merger at the end of the branch, calculated in the negative log :math:`-log(\lambda(t_n+ \\tau)^{(m-1)/m}) + \int_{t_n}^{t_n+ \\tau} \kappa(t) dt`, where m is the multiplicity Parameters ---------- t_node: float time of the node branch_length: float branch length, determines when this branch merges with sister multiplicity: int 2 if merger is binary, higher if this is a polytomy ''' merger_time = t_node + np.maximum(0,branch_length) return self.integral_merger_rate(merger_time) - self.integral_merger_rate(t_node)\ - np.log(self.total_merger_rate(merger_time))*(multiplicity-1.0)/multiplicity def node_contribution(self, node, t, multiplicity=None): ''' returns the contribution of node at time t to cost of merging branch that node is parent of ''' from treetime.node_interpolator import NodeInterpolator if multiplicity is None: multiplicity = len(node.clades) # the number of mergers is 'number of children' - 1 multiplicity -= 1.0 y = (self.integral_merger_rate(t) - np.log(self.total_merger_rate(t)))*multiplicity return NodeInterpolator(t, y, is_log=True) def total_LH(self): LH = 0.0 #np.log(self.total_merger_rate([node.time_before_present for node in self.tree.get_nonterminals()])).sum() for node in self.tree.find_clades(): if node.up: LH -= self.cost(node.time_before_present, node.branch_length) return LH def optimize_Tc(self): ''' determines the coalescent time scale Tc that optimizes the coalescent likelihood of the tree (product of the cost of coalescence of all nodes) ''' from scipy.optimize import minimize_scalar initial_Tc = self.Tc def cost(logTc): self.set_Tc(np.exp(logTc)) return -self.total_LH() sol = minimize_scalar(cost, bracket=[-20.0, 2.0], method='brent') if "success" in sol and sol["success"]: self.set_Tc(np.exp(sol['x'])) else: self.logger("merger_models:optimize_Tc: optimization of coalescent time scale failed: " + str(sol), 0, warn=True) self.set_Tc(initial_Tc.y, T=initial_Tc.x) def optimize_skyline(self, n_points=20, stiffness=2.0, method = 'SLSQP', tol=0.03, regularization=10.0, **kwarks): ''' optimize the trajectory of the clock rate 1./T_c to maximize the coalescent likelihood, this is the product of the cost of coalescence of all nodes Parameters ---------- n_points: int number of pivots of the Tc interpolation object stiffness: float penalty for rapid changes in log(Tc) methods: str method used to optimize, see documentation of scipy.optimize.minimize for options tol: float optimization tolerance regularization: float cost of moving log(Tc) outsize of the range [-100,0] merger rate is measured in branch length units, no plausible rates should ever be outside this window ''' self.logger("Coalescent:optimize_skyline:... current LH: %f"%self.total_LH(),2) from scipy.optimize import minimize initial_Tc = self.Tc tvals = np.linspace(self.tree_events[0,0], self.tree_events[-1,0], n_points) def cost(logTc): # cap log Tc to avoid under or overflow and nan in logs self.set_Tc(np.exp(clip(logTc, -200, 100)), tvals) neglogLH = -self.total_LH() + stiffness*np.sum(np.diff(logTc)**2) \ + np.sum((logTc>0)*logTc)*regularization\ - np.sum((logTc<-100)*logTc)*regularization return neglogLH sol = minimize(cost, np.ones_like(tvals)*np.log(self.Tc.y.mean()), method=method, tol=tol) if "success" in sol and sol["success"]: dlogTc = 0.1 opt_logTc = sol['x'] dcost = [] for ii in range(len(opt_logTc)): tmp = opt_logTc.copy() tmp[ii]+=dlogTc cost_plus = cost(tmp) tmp[ii]-=2*dlogTc cost_minus = cost(tmp) dcost.append([cost_minus, cost_plus]) dcost = np.array(dcost) optimal_cost = cost(opt_logTc) self.confidence = dlogTc/np.sqrt(np.abs(2*optimal_cost - dcost[:,0] - dcost[:,1])) self.logger("Coalescent:optimize_skyline:...done. new LH: %f"%self.total_LH(),2) else: self.set_Tc(initial_Tc.y, T=initial_Tc.x) self.confidence = [np.nan for i in initial_Tc.x] self.logger("Coalescent:optimize_skyline:...failed:"+str(sol),0, warn=True) def skyline_empirical(self, gen=1.0, n_points = 20): ''' returns the skyline, i.e., an estimate of the inverse rate of coalesence. Here, the skyline is estimated from a sliding window average of the observed mergers, i.e., without reference to the coalescence likelihood. Parameters ---------- gen: float number of generations per year n_points: int ''' merger_times = np.array(self.tree_events[self.tree_events[:,1]>0, 0]) nlineages = self.nbranches(merger_times -ttconf.TINY_NUMBER) expected_merger_density = nlineages*(nlineages-1)*0.5 nmergers = len(merger_times) et = merger_times ev = 1.0/expected_merger_density # reduce the window size if there are few events in the tree if 2*n_points>len(expected_merger_density): n_points = len(ev)//4 # smoothes with a sliding window over data points avg = np.sum(ev)/np.abs(et[0]-et[-1]) dt = et[0]-et[-1] mid_points = np.concatenate(([et[0]-0.5*(et[1]-et[0])], 0.5*(et[1:] + et[:-1]), [et[-1]+0.5*(et[-1]-et[-2])])) # this smoothes the ratio of expected and observed merger rate # epsilon is added to avoid division by 0 and to normalize Tc epsilon= (1/n_points)*dt/nmergers self.Tc_inv = interp1d(mid_points[n_points:-n_points], [np.sum(ev[(et>=l)&(etg.xmin and t-tauf.xmin tau_max = min(t_val - f.xmin, g.xmax) else: ## tau>g.xmin and t+tau>f.xmin tau_min = max(f.xmin-t_val, g.xmin) ## tau node_interp.fwhm: ## node distribution is much narrower than the branch distribution, proceed as if # node distribution is a delta distribution with the peak 4 full-width-half-maxima # away from the nominal peak to avoid slicing the relevant range to zero log_scale_node_interp = node_interp.integrate(return_log=True, a=node_interp.xmin,b=node_interp.xmax,n=max(100, len(node_interp.x))) #probability of node distribution if inverse_time: x = branch_interp.x + max(n_effsupport[0], node_interp._peak_pos - 4.0*node_interp.fwhm) dist = Distribution(x, branch_interp(x - node_interp._peak_pos) - log_scale_node_interp, min_width=max(node_interp.min_width, branch_interp.min_width), is_log=True) else: x = - branch_interp.x + min(n_effsupport[1], node_interp._peak_pos + 4.0*node_interp.fwhm) dist = Distribution(x, branch_interp(branch_interp.x) - log_scale_node_interp, min_width=max(node_interp.min_width, branch_interp.min_width), is_log=True) return dist elif ratio > fft_grid_size and 4*dt > branch_interp.fwhm: raise ValueError("ERROR: Unexpected behavior: branch distribution is much narrower than the node distribution.") else: tmax = 2*max(b_support_range, n_support_range) Tb = np.arange(b_effsupport[0], b_effsupport[0] + tmax + dt, dt) if inverse_time: Tn = np.arange(n_effsupport[0], n_effsupport[0] + tmax + dt, dt) Tmin = node_interp.xmin Tmax = ttconf.MAX_BRANCH_LENGTH else: Tn = np.arange(n_effsupport[1] - tmax, n_effsupport[1] + dt, dt) Tmin = -ttconf.MAX_BRANCH_LENGTH Tmax = node_interp.xmax raw_len = len(Tb) fft_len = 2*raw_len fftb = branch_interp.fft(Tb, n=fft_len) fftn = node_interp.fft(Tn, n=fft_len, inverse_time=inverse_time) if inverse_time: fft_res = np.fft.irfft(fftb*fftn, fft_len)[:raw_len] Tres = Tn + Tb[0] else: fft_res = np.fft.irfft(fftb*fftn, fft_len)[::-1] fft_res = fft_res[raw_len:] Tres = Tn - Tb[0] # determine region in which we can trust the FFT convolution and avoid # inaccuracies due to machine precision. 1e-13 seems robust ind = fft_res>fft_res.max()*1e-13 res = -np.log(fft_res[ind]) + branch_interp.peak_val + node_interp.peak_val - np.log(dt) Tres_cropped = Tres[ind] # extrapolate the tails exponentially: use margin last data points margin = np.minimum(3, Tres_cropped.shape[0]//3) if margin<1 or len(res)==0: raise TreeTimeUnknownError("Error: Unexpected behavior detected in FFT function. " "No valid points left after reducing to plausible region.\n\n" "If you see this error please let us know by filling an issue at:\n" "https://github.com/neherlab/treetime/issues") else: left_slope = (res[margin]-res[0])/(Tres_cropped[margin]-Tres_cropped[0]) right_slope = (res[-1]-res[-margin-1])/(Tres_cropped[-1]-Tres_cropped[-margin-1]) # only extrapolate on the left when the slope is negative and we are not on the boundary if Tmin0: Tright = np.linspace(Tres_cropped[-1], Tmax,10)[1:] res_right = res[-1] + right_slope*(Tright - Tres_cropped[-1]) else: #otherwise Tright, res_right = [], [] # instantiate the new interpolation object and return return cls(np.concatenate((Tleft,Tres_cropped,Tright)), np.concatenate((res_left, res, res_right)), is_log=True, kind='linear', assume_sorted=True) @classmethod def convolve(cls, node_interp, branch_interp, max_or_integral='integral', n_grid_points = ttconf.NODE_GRID_SIZE, n_integral=ttconf.N_INTEGRAL, inverse_time=True, rel_tol=0.05, yc=10): r''' calculate H(t) = \int_tau f(t-tau)g(tau) if inverse_time=True H(t) = \int_tau f(t+tau)g(tau) if inverse_time=False This function determines the time points of the grid of the result to ensure an accurate approximation. ''' if max_or_integral not in ['max', 'integral']: raise Exception("Max_or_integral expected to be 'max' or 'integral', got " + str(max_or_integral) + " instead.") def conv_in_point(time_point): if max_or_integral == 'integral': # compute integral of the convolution return _evaluate_convolution(time_point, node_interp, branch_interp, n_integral=n_integral, return_log=True, inverse_time = inverse_time) else: # compute max of the convolution return _max_of_integrand(time_point, node_interp, branch_interp, return_log=True, inverse_time = inverse_time) # estimate peak and width joint_fwhm = (node_interp.fwhm + branch_interp.fwhm) min_fwhm = min(node_interp.fwhm, branch_interp.fwhm) # determine support of the resulting convolution # in order to be positive, the flipped support of f, shifted by t and g need to overlap if inverse_time: new_peak_pos = node_interp.peak_pos + branch_interp.peak_pos tmin = node_interp.xmin+branch_interp.xmin tmax = node_interp.xmax+branch_interp.xmax else: new_peak_pos = node_interp.peak_pos - branch_interp.peak_pos tmin = node_interp.xmin - branch_interp.xmax tmax = node_interp.xmax - branch_interp.xmin # make initial node grid consisting of linearly spaced points around # the center and quadratically spaced points at either end n = n_grid_points//3 center_width = 3*joint_fwhm grid_center = new_peak_pos + np.linspace(-1, 1, n)*center_width # add the right and left grid if it is needed right_range = (tmax - grid_center[-1]) if right_range>4*center_width: grid_right = grid_center[-1] + right_range*(np.linspace(0, 1, n)**2.0) elif right_range>0: # use linear grid the right_range is comparable to center_width grid_right = grid_center[-1] + right_range*np.linspace(0,1, int(min(n,1+0.5*n*right_range/center_width))) else: grid_right =[] left_range = grid_center[0]-tmin if left_range>4*center_width: grid_left = tmin + left_range*(np.linspace(0, 1, n)**2.0) elif left_range>0: grid_left = tmin + left_range*np.linspace(0,1, int(min(n,1+0.5*n*left_range/center_width))) else: grid_left =[] if tmin>-1: grid_zero_left = tmin + (tmax-tmin)*np.linspace(0,0.01,11)**2 else: grid_zero_left = [tmin] if tmax<1: grid_zero_right = tmax - (tmax-tmin)*np.linspace(0,0.01,11)**2 else: grid_zero_right = [tmax] # make grid and calculate convolution t_grid_0 = np.unique(np.concatenate([grid_zero_left, grid_left[:-1], grid_center, grid_right[1:], grid_zero_right])) t_grid_0 = t_grid_0[(t_grid_0 > tmin-ttconf.TINY_NUMBER) & (t_grid_0 < tmax+ttconf.TINY_NUMBER)] # res0 - the values of the convolution (integral or max) # t_0 - the value, at which the res0 achieves maximum # (when determining the maximum of the integrand, otherwise meaningless) res_0, t_0 = np.array([conv_in_point(t_val) for t_val in t_grid_0]).T # refine grid as necessary and add new points # calculate interpolation error at all internal points [2:-2] bc end points are sometime off scale interp_error = np.abs(res_0[3:-1]+res_0[1:-3]-2*res_0[2:-2]) # determine the number of extra points needed, criterion depends on distance from peak dy dy = (res_0[2:-2]-res_0.min()) dx = np.diff(t_grid_0) refine_factor = np.minimum(np.minimum(np.array(np.floor(np.sqrt(interp_error/(rel_tol*(1+(dy/yc)**4)))), dtype=int), np.array(100*(dx[1:-2]+dx[2:-1])/min_fwhm, dtype=int)), 10) insert_point_idx = np.zeros(interp_error.shape[0]+1, dtype=int) insert_point_idx[1:] = refine_factor insert_point_idx[:-1] += refine_factor # add additional points if there are any to add if np.sum(insert_point_idx): add_x = np.concatenate([np.linspace(t1,t2,n+2)[1:-1] for t1,t2,n in zip(t_grid_0[1:-2], t_grid_0[2:-1], insert_point_idx) if n>0]) # calculate convolution at these points add_y, add_t = np.array([conv_in_point(t_val) for t_val in add_x]).T t_grid_0 = np.concatenate((t_grid_0, add_x)) res_0 = np.concatenate ((res_0, add_y)) t_0 = np.concatenate ((t_0, add_t)) # instantiate the new interpolation object and return res_y = cls(t_grid_0, res_0, is_log=True, kind='linear') # the interpolation object, which is used to store the value of the # grid, which maximizes the convolution (for 'max' option), # or flat -1 distribution (for 'integral' option) # this grid is the optimal branch length res_t = Distribution(t_grid_0, t_0, is_log=True, min_width=node_interp.min_width, kind='linear') return res_y, res_t treetime-0.11.1/treetime/nuc_models.py000066400000000000000000000161371447636507100177550ustar00rootroot00000000000000#!/usr/local/bin/python # -*- coding: utf-8 -*- import numpy as np from .seq_utils import alphabets from .gtr import GTR def get_alphabet(a): if type(a)==str and a in alphabets: return alphabets[a] else: try: return np.array(a) except: raise TypeError def JC69 (mu=1.0, alphabet="nuc", **kwargs): """ Jukes-Cantor 1969 model. This model assumes equal concentrations of the nucleotides and equal transition rates between nucleotide states. For more info, see: Jukes and Cantor (1969). Evolution of Protein Molecules. New York: Academic Press. pp. 21–132 Parameters ----------- mu : float substitution rate alphabet : str or character array specify alphabet to use. Available alphabets are: 'nuc_nogap' - nucleotides only, gaps ignored 'nuc' - nucleotide alphabet with gaps, gaps can be ignored optionally """ num_chars = len(get_alphabet(alphabet)) W, pi = np.ones((num_chars,num_chars)), np.ones(num_chars) gtr = GTR(alphabet=alphabet) gtr.assign_rates(mu=mu, pi=pi, W=W) return gtr def K80(mu=1., kappa=0.1, **kwargs): """ Kimura 1980 model. Assumes equal concentrations across nucleotides, but allows different rates between transitions and transversions. The ratio of the transversion/transition rates is given by kappa parameter. For more info, see Kimura (1980), J. Mol. Evol. 16 (2): 111–120. doi:10.1007/BF01731581. Current implementation of the model does not account for the gaps. Parameters ----------- mu : float Overall substitution rate kappa : float Ratio of transversion/transition rates """ num_chars = len(alphabets['nuc_nogap']) pi = np.ones(len(alphabets['nuc_nogap']), dtype=float)/len(alphabets['nuc_nogap']) W = _create_transversion_transition_W(kappa) gtr = GTR(alphabet=alphabets['nuc_nogap']) gtr.assign_rates(mu=mu, pi=pi, W=W) return gtr def F81(mu=1.0, pi=None, alphabet="nuc", **kwargs): """ Felsenstein 1981 model. Assumes non-equal concentrations across nucleotides, but the transition rate between all states is assumed to be equal. See Felsenstein (1981), J. Mol. Evol. 17 (6): 368–376. doi:10.1007/BF01734359 for details. Current implementation of the model does not account for the gaps (treatment of gaps as characters is possible if specify alphabet='nuc_gap'). Parameters ----------- mu : float Substitution rate pi : numpy.array Nucleotide concentrations alphabet : str Alphabet to use. POsiible values are: ['nuc', 'nuc_gap'] Default 'nuc', which discounts al gaps. 'nuc_gap' alphabet enables treatmen of gaps as characters. """ if pi is None: pi=0.25*np.ones(4, dtype=float) num_chars = len(get_alphabet(alphabet)) pi = np.array(pi, dtype=float) if num_chars != len(pi) : pi = np.ones((num_chars, ), dtype=float) print ("GTR: Warning!The number of the characters in the alphabet does not match the " "shape of the vector of equilibrium frequencies Pi -- assuming equal frequencies for all states.") W = np.ones((num_chars,num_chars)) pi /= (1.0 * np.sum(pi)) gtr = GTR(alphabet=get_alphabet(alphabet)) gtr.assign_rates(mu=mu, pi=pi, W=W) return gtr def HKY85(mu=1.0, pi=None, kappa=0.1, **kwargs): """ Hasegawa, Kishino and Yano 1985 model. Allows different concentrations of the nucleotides (as in F81) + distinguishes between transition/transversionsubstitutions (similar to K80). Link: Hasegawa, Kishino, Yano (1985), J. Mol. Evol. 22 (2): 160–174. doi:10.1007/BF02101694 Current implementation of the model does not account for the gaps Parameters ----------- mu : float Substitution rate pi : numpy.array Nucleotide concentrations kappa : float Ratio of transversion/transition substitution rates """ if pi is None: pi=0.25*np.ones(4, dtype=float) num_chars = len(alphabets['nuc_nogap']) if num_chars != pi.shape[0] : pi = np.ones((num_chars, ), dtype=float) print ("GTR: Warning!The number of the characters in the alphabet does not match the " "shape of the vector of equilibrium frequencies Pi -- assuming equal frequencies for all states.") W = _create_transversion_transition_W(kappa) pi /= pi.sum() gtr = GTR(alphabet=alphabets['nuc_nogap']) gtr.assign_rates(mu=mu, pi=pi, W=W) return gtr def T92(mu=1.0, pi_GC=0.5, kappa=0.1, **kwargs): """ Tamura 1992 model. Extending Kimura (1980) model for the case where a G+C-content bias exists. Link: Tamura K (1992), Mol. Biol. Evol. 9 (4): 678–687. DOI: 10.1093/oxfordjournals.molbev.a040752 Current implementation of the model does not account for the gaps Parameters ----------- mu : float substitution rate pi_GC : float relative GC content kappa : float relative transversion/transition rate """ W = _create_transversion_transition_W(kappa) # A C G T if pi_GC >=1.: raise ValueError("The relative GC content specified is larger than 1.0!") pi = np.array([(1.-pi_GC)*0.5, pi_GC*0.5, pi_GC*0.5, (1-pi_GC)*0.5]) gtr = GTR(alphabet=alphabets['nuc_nogap']) gtr.assign_rates(mu=mu, pi=pi, W=W) return gtr def TN93(mu=1.0, kappa1=1., kappa2=1., pi=None, **kwargs): """ Tamura and Nei 1993. The model distinguishes between the two different types of transition: (A <-> G) is allowed to have a different rate to (C<->T). Transversions have the same rate. The frequencies of the nucleotides are allowed to be different. Link: Tamura, Nei (1993), MolBiol Evol. 10 (3): 512–526. DOI:10.1093/oxfordjournals.molbev.a040023 Parameters ----------- mu : float Substitution rate kappa1 : float relative A<-->C, A<-->T, T<-->G and G<-->C rates kappa2 : float relative C<-->T rate Note ---- Rate of A<-->G substitution is set to one. All other rates (kappa1, kappa2) are specified relative to this rate """ if pi is None: pi=0.25*np.ones(4, dtype=float) W = np.ones((4,4)) W = np.array([ [1, kappa1, 1, kappa1], [kappa1, 1, kappa1, kappa2], [1, kappa1, 1, kappa1], [kappa1, kappa2, kappa1, 1]], dtype=float) pi /=pi.sum() num_chars = len(alphabets['nuc_nogap']) if num_chars != pi.shape[0] : pi = np.ones((num_chars, ), dtype=float) print ("GTR: Warning!The number of the characters in the alphabet does not match the " "shape of the vector of equilibrium frequencies Pi -- assuming equal frequencies for all states.") gtr = GTR(alphabet=alphabets['nuc']) gtr.assign_rates(mu=mu, pi=pi, W=W) return gtr def _create_transversion_transition_W(kappa): """ Alphabet = [A, C, G, T] """ W = np.ones((4,4)) W[0, 2]=W[1, 3]=W[2, 0]=W[3,1]=kappa return W if __name__ == '__main__': pass treetime-0.11.1/treetime/seq_utils.py000066400000000000000000000334011447636507100176260ustar00rootroot00000000000000import numpy as np from Bio import Seq, SeqRecord alphabet_synonyms = {'nuc':'nuc', 'nucleotide':'nuc', 'aa':'aa', 'aminoacid':'aa', 'nuc_nogap':'nuc_nogap', 'nucleotide_nogap':'nuc_nogap', 'aa_nogap':'aa_nogap', 'aminoacid_nogap':'aa_nogap', 'DNA':'nuc', 'DNA_nogap':'nuc_nogap'} alphabets = { "nuc": np.array(['A', 'C', 'G', 'T', '-']), "nuc_nogap":np.array(['A', 'C', 'G', 'T']), "aa": np.array(['A', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'K', 'L', 'M', 'N', 'P', 'Q', 'R', 'S', 'T', 'V', 'W', 'Y', '*', '-']), "aa_nogap": np.array(['A', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'K', 'L', 'M', 'N', 'P', 'Q', 'R', 'S', 'T', 'V', 'W', 'Y']) } profile_maps = { 'nuc':{ 'A': np.array([1, 0, 0, 0, 0], dtype='float'), 'C': np.array([0, 1, 0, 0, 0], dtype='float'), 'G': np.array([0, 0, 1, 0, 0], dtype='float'), 'T': np.array([0, 0, 0, 1, 0], dtype='float'), '-': np.array([0, 0, 0, 0, 1], dtype='float'), 'N': np.array([1, 1, 1, 1, 1], dtype='float'), 'X': np.array([1, 1, 1, 1, 1], dtype='float'), 'R': np.array([1, 0, 1, 0, 0], dtype='float'), 'Y': np.array([0, 1, 0, 1, 0], dtype='float'), 'S': np.array([0, 1, 1, 0, 0], dtype='float'), 'W': np.array([1, 0, 0, 1, 0], dtype='float'), 'K': np.array([0, 0, 1, 1, 0], dtype='float'), 'M': np.array([1, 1, 0, 0, 0], dtype='float'), 'D': np.array([1, 0, 1, 1, 0], dtype='float'), 'H': np.array([1, 1, 0, 1, 0], dtype='float'), 'B': np.array([0, 1, 1, 1, 0], dtype='float'), 'V': np.array([1, 1, 1, 0, 0], dtype='float') }, 'nuc_nogap':{ 'A': np.array([1, 0, 0, 0], dtype='float'), 'C': np.array([0, 1, 0, 0], dtype='float'), 'G': np.array([0, 0, 1, 0], dtype='float'), 'T': np.array([0, 0, 0, 1], dtype='float'), '-': np.array([1, 1, 1, 1], dtype='float'), # gaps are completely ignored in distance computations 'N': np.array([1, 1, 1, 1], dtype='float'), 'X': np.array([1, 1, 1, 1], dtype='float'), 'R': np.array([1, 0, 1, 0], dtype='float'), 'Y': np.array([0, 1, 0, 1], dtype='float'), 'S': np.array([0, 1, 1, 0], dtype='float'), 'W': np.array([1, 0, 0, 1], dtype='float'), 'K': np.array([0, 0, 1, 1], dtype='float'), 'M': np.array([1, 1, 0, 0], dtype='float'), 'D': np.array([1, 0, 1, 1], dtype='float'), 'H': np.array([1, 1, 0, 1], dtype='float'), 'B': np.array([0, 1, 1, 1], dtype='float'), 'V': np.array([1, 1, 1, 0], dtype='float') }, 'aa':{ 'A': np.array([1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], dtype='float'), #Alanine Ala 'C': np.array([0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], dtype='float'), #Cysteine Cys 'D': np.array([0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], dtype='float'), #Aspartic AciD Asp 'E': np.array([0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], dtype='float'), #Glutamic Acid Glu 'F': np.array([0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], dtype='float'), #Phenylalanine Phe 'G': np.array([0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], dtype='float'), #Glycine Gly 'H': np.array([0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], dtype='float'), #Histidine His 'I': np.array([0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], dtype='float'), #Isoleucine Ile 'K': np.array([0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], dtype='float'), #Lysine Lys 'L': np.array([0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], dtype='float'), #Leucine Leu 'M': np.array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], dtype='float'), #Methionine Met 'N': np.array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], dtype='float'), #AsparagiNe Asn 'P': np.array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0], dtype='float'), #Proline Pro 'Q': np.array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0], dtype='float'), #Glutamine Gln 'R': np.array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0], dtype='float'), #ARginine Arg 'S': np.array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0], dtype='float'), #Serine Ser 'T': np.array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0], dtype='float'), #Threonine Thr 'V': np.array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0], dtype='float'), #Valine Val 'W': np.array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0], dtype='float'), #Tryptophan Trp 'Y': np.array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0], dtype='float'), #Tyrosine Tyr '*': np.array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0], dtype='float'), #stop '-': np.array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1], dtype='float'), #gap 'X': np.array([1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], dtype='float'), #not specified/any 'B': np.array([0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], dtype='float'), #Asparagine/Aspartic Acid Asx 'Z': np.array([0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0], dtype='float'), #Glutamine/Glutamic Acid Glx }, 'aa_nogap':{ 'A': np.array([1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], dtype='float'), #Alanine Ala 'C': np.array([0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], dtype='float'), #Cysteine Cys 'D': np.array([0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], dtype='float'), #Aspartic AciD Asp 'E': np.array([0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], dtype='float'), #Glutamic Acid Glu 'F': np.array([0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], dtype='float'), #Phenylalanine Phe 'G': np.array([0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], dtype='float'), #Glycine Gly 'H': np.array([0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], dtype='float'), #Histidine His 'I': np.array([0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], dtype='float'), #Isoleucine Ile 'K': np.array([0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], dtype='float'), #Lysine Lys 'L': np.array([0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], dtype='float'), #Leucine Leu 'M': np.array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0], dtype='float'), #Methionine Met 'N': np.array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0], dtype='float'), #AsparagiNe Asn 'P': np.array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0], dtype='float'), #Proline Pro 'Q': np.array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0], dtype='float'), #Glutamine Gln 'R': np.array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0], dtype='float'), #ARginine Arg 'S': np.array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0], dtype='float'), #Serine Ser 'T': np.array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0], dtype='float'), #Threonine Thr 'V': np.array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0], dtype='float'), #Valine Val 'W': np.array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0], dtype='float'), #Tryptophan Trp 'Y': np.array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1], dtype='float'), #Tyrosine Tyr 'X': np.array([1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], dtype='float'), #not specified/any 'B': np.array([0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0], dtype='float'), #Asparagine/Aspartic Acid Asx 'Z': np.array([0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0], dtype='float'), #Glutamine/Glutamic Acid Glx } } def extend_profile(gtr, aln, logger=None): tmp_unique_chars = [] for seq in aln: tmp_unique_chars.extend(np.unique(seq)) unique_chars = np.unique(tmp_unique_chars) for c in unique_chars: if c not in gtr.profile_map: gtr.profile_map[c] = np.ones(gtr.n_states) if logger: logger("WARNING: character %s is unknown. Treating it as missing information"%c,1,warn=True) def guess_alphabet(aln): total=0 nuc_count = 0 for seq in aln: total += len(seq) for n in np.array(list('acgtACGT-N')): nuc_count += np.sum(seq==n) if nuc_count>0.9*total: return 'nuc' else: return 'aa' def seq2array(seq, word_length=1, convert_upper=False, fill_overhangs=False, ambiguous='N'): """ Take the raw sequence, substitute the "overhanging" gaps with 'N' (missequenced), and convert the sequence to the numpy array of chars. Parameters ---------- seq : Biopython.SeqRecord, str, iterable Sequence as an object of SeqRecord, string or iterable word_length : int, optional 1 for nucleotide or amino acids, 3 for codons etc. convert_upper : bool, optional convert the sequence to upper case fill_overhangs : bool If True, substitute the "overhanging" gaps with ambiguous character symbol ambiguous : char Specify the character for ambiguous state ('N' default for nucleotide) Returns ------- sequence : np.array Sequence as 1D numpy array of chars """ if isinstance(seq, str): seq_str = seq elif isinstance(seq, Seq.Seq): seq_str = str(seq) elif isinstance(seq, SeqRecord.SeqRecord): seq_str = str(seq.seq) else: raise TypeError("seq2array: sequence must be Bio.Seq, Bio.SeqRecord, or string. Got "+str(seq)) if convert_upper: seq_str = seq_str.upper() if word_length==1: seq_array = np.array(list(seq_str)) else: if len(seq_str)%word_length: raise ValueError("sequence length has to be multiple of word length") seq_array = np.array([seq_str[i*word_length:(i+1)*word_length] for i in range(len(seq_str)/word_length)]) # substitute overhanging unsequenced tails if fill_overhangs: gaps = np.where(seq_array != '-')[0] if len(gaps): seq_array[:gaps[0]] = ambiguous seq_array[gaps[-1]+1:] = ambiguous else: seq_array[:] = ambiguous return seq_array def seq2prof(seq, profile_map): """ Convert the given character sequence into the profile according to the alphabet specified. Parameters ---------- seq : numpy.array Sequence to be converted to the profile profile_map : dic Mapping valid characters to profiles Returns ------- idx : numpy.array Profile for the character. Zero array if the character not found """ return np.array([profile_map[k] for k in seq]) def prof2seq(profile, gtr, sample_from_prof=False, normalize=True, rng=None): """ Convert profile to sequence and normalize profile across sites. Parameters ---------- profile : numpy 2D array Profile. Shape of the profile should be (L x a), where L - sequence length, a - alphabet size. gtr : gtr.GTR Instance of the GTR class to supply the sequence alphabet collapse_prof : bool Whether to convert the profile to the delta-function Returns ------- seq : numpy.array Sequence as numpy array of length L prof_values : numpy.array Values of the profile for the chosen sequence characters (length L) idx : numpy.array Indices chosen from profile as array of length L """ if rng is None: rng = np.random.default_rng() # normalize profile such that probabilities at each site sum to one if normalize: tmp_profile, pre=normalize_profile(profile, return_offset=False) else: tmp_profile = profile # sample sequence according to the probabilities in the profile # (sampling from cumulative distribution over the different states) if sample_from_prof: cumdis = tmp_profile.cumsum(axis=1).T randnum = rng.random(size=cumdis.shape[1]) idx = np.argmax(cumdis>=randnum, axis=0) else: idx = tmp_profile.argmax(axis=1) seq = gtr.alphabet[idx] # max LH over the alphabet prof_values = tmp_profile[np.arange(tmp_profile.shape[0]), idx] return seq, prof_values, idx def normalize_profile(in_profile, log=False, return_offset = True): """return a normalized version of a profile matrix Parameters ---------- in_profile : np.array shape Lxq, will be normalized to one across each row log : bool, optional treat the input as log probabilities return_offset : bool, optional return the log of the scale factor for each row Returns ------- tuple normalized profile (fresh np object) and offset (if return_offset==True) """ if log: tmp_prefactor = in_profile.max(axis=1) tmp_prof = np.exp(in_profile.T - tmp_prefactor).T else: tmp_prefactor = 0.0 tmp_prof = in_profile norm_vector = tmp_prof.sum(axis=1) return (np.einsum('ai,a->ai',tmp_prof,1.0/norm_vector), (np.log(norm_vector) + tmp_prefactor) if return_offset else None) treetime-0.11.1/treetime/seqgen.py000066400000000000000000000061511447636507100171020ustar00rootroot00000000000000from collections import defaultdict import numpy as np from . import config as ttconf from .seq_utils import seq2array, seq2prof from .gtr import GTR from .treeanc import TreeAnc class SeqGen(TreeAnc): ''' Evolve sequences along a given tree with a specific GTR model. This class inherits from TreeAnc. ''' def __init__(self, L, *args, **kwargs): """Instantiate. Mandatory arguments are a the sequence length, tree and GTR model. """ super(SeqGen, self).__init__(seq_len=L, compress=False, **kwargs) def sample_from_profile(self, p): """returns a sequence sampled from a profile (column wise state probabilities) Parameters ---------- p : np.array sequence profile with dimensions (L,q) Returns ------- np.array (character) sequence as character array array(['A', 'C', 'G',...]) """ cum_p = p.cumsum(axis=1).T prand = self.rng.random(self.seq_len) seq = self.gtr.alphabet[np.argmax(cum_p>prand, axis=0)] return seq def evolve(self, root_seq=None): """Evolve a root sequences along a tree. If no root sequences is provided, one will be sampled from the equilibrium probabilities of the GTR model Parameters ---------- root_seq : numpy character array, optional sequence to be used as the root sequence of the tree. if not given, will sample a sequence from the equilibrium probabilities of the GTR model. """ # set root if not given if root_seq: self.tree.root.ancestral_sequence = seq2array(root_seq) else: if len(self.gtr.Pi.shape)==2: self.tree.root.ancestral_sequence = self.sample_from_profile(self.gtr.Pi.T) else: self.tree.root.ancestral_sequence = self.sample_from_profile(np.repeat([self.gtr.Pi], self.seq_len, axis=0)) # generate sequences in preorder for n in self.tree.get_nonterminals(order='preorder'): profile_p = seq2prof(n.ancestral_sequence, self.gtr.profile_map) for c in n: profile = self.gtr.evolve(profile_p, c.branch_length) c.ancestral_sequence = self.sample_from_profile(profile) self.aln = self.get_aln() def get_aln(self, internal=False): """assemble a multiple sequence alignment from the evolved sequences. Optionally in clude internal sequences Parameters ---------- internal : bool, optional include sequences of internal nodes in the alignment Returns ------- Bio.Align.MultipleSeqAlignment multiple sequence alignment """ from Bio import SeqRecord, Seq from Bio.Align import MultipleSeqAlignment tmp = [] for n in self.tree.find_clades(): if n.is_terminal() or internal: tmp.append(SeqRecord.SeqRecord(id=n.name, name=n.name, description='', seq=Seq.Seq(''.join(n.ancestral_sequence.astype('U'))))) return MultipleSeqAlignment(tmp) treetime-0.11.1/treetime/sequence_data.py000066400000000000000000000540601447636507100204230ustar00rootroot00000000000000import sys from os.path import isfile from collections import defaultdict import numpy as np from Bio import AlignIO, SeqIO from . import config as ttconf from . import MissingDataError from .seq_utils import seq2array, guess_alphabet, alphabets string_types = [str] if sys.version_info[0]==3 else [str, unicode] def simple_logger(*args, **kwargs): print(args) class SequenceData(object): """docstring for SeqData Attributes ---------- additional_constant_sites : int length of the sequence without variation not included in the alignment aln : dict sequences, either sparse of full ambiguous : byte character signifying missing data compress : bool compress the alignment compressed_alignment : dict dictionary mapping sequence names to compressed sequences compressed_to_full_sequence_map : dict for each compressed position, contain a list of positions in the full alignment fill_overhangs : bool treat gaps at either end of sequence as missing data full_length : int length of the sequence full_to_compressed_sequence_map : np.array a map of each position in the full sequence to the compressed sequence inferred_const_sites : list list of positions that are constant but differ from the reference, or contain ambiguous characters is_sparse : bool whether the representation of the alignment is sparse (dict) or fill (array) likely_alphabet : str simply guess as to whether the sequence alignment is nucleotides or amino acids logger : callable function writting log messages multiplicity : np.array specifies for each column of the compressed alignment how often this pattern occurs nonref_positions : list positions where at least one sequence differs from the reference ref : np.array reference sequence (stored as np.array(dtype="S")) seq_multiplicity : dict store the multiplicity of sequence, for example read count in a deep sequencing experiment sequence_names : list list of all sequences in a fixed order word_length : int length of state (typically 1 A,C,G,T, but could be 3 for codons) """ def __init__(self, aln, ref=None, logger=None, convert_upper=True, sequence_length=None, compress=True, word_length=1, sequence_type=None, fill_overhangs=True, seq_multiplicity=None, ambiguous=None, **kwargs): """construct an sequence data object Parameters ---------- aln : Bio.Align.MultipleSeqAlignment, str alignment or file name ref : Seq, str sequence or file name logger : callable, optional logging function convert_upper : bool, optional convert all sequences to upper case, default true sequence_length : None, optional length of the sequence, only necessary when no alignment or ref is given compress : bool, optional compress identical alignment columns into one word_length : int length of state (typically 1 A,C,G,T, but could be 3 for codons) fill_overhangs : bool treat gaps at either end of sequence as missing data seq_multiplicity : dict store the multiplicity of sequence, for example read count in a deep sequencing experiment ambiguous : byte character signifying missing data **kwargs Description """ self.logger = logger if logger else simple_logger self._aln = None self._ref = None self.likely_alphabet = None self.compressed_to_full_sequence_map = None self._multiplicity = None self.is_sparse = None self.convert_upper = convert_upper self.compress = compress self.seq_multiplicity = seq_multiplicity or {} # possibly a dict mapping sequences to their read cound/sample count self.additional_constant_sites = kwargs['additional_constant_sites'] if 'additional_constant_sites' in kwargs else 0 # if not specified, this will be set as the alignment_length or reference length self._full_length = None self.full_length = sequence_length self._compressed_length = None self.word_length = word_length self.fill_overhangs = fill_overhangs self.ambiguous = ambiguous self.sequence_type = sequence_type self.ref = ref self.aln = aln @property def aln(self): """ The multiple sequence alignment currently used by the TreeAnc :setter: Takes in alignment as MultipleSeqAlignment, str, or dict/defaultdict \ and attaches sequences to tree nodes. :getter: Returns alignment as MultipleSeqAlignment or dict/defaultdict """ return self._aln @aln.setter def aln(self,in_aln): """ Reads in the alignment (from a dict, MultipleSeqAlignment, or file, as necessary), sets tree-related parameters, and attaches sequences to the tree nodes. Parameters ---------- in_aln : MultipleSeqAlignment, str, dict/defaultdict The alignment to be read in """ # load alignment from file if necessary from Bio.Align import MultipleSeqAlignment self._aln, self.is_sparse = None, None if in_aln is None: return elif type(in_aln) in [defaultdict, dict]: #if input is sparse (i.e. from VCF) self._aln = in_aln self.is_sparse = True elif type(in_aln) in string_types and isfile(in_aln): if any([in_aln.lower().endswith(x) for x in ['.vcf', '.vcf.gz']]) and (self.ref is not None): from .vcf_utils import read_vcf compress_seq = read_vcf(in_aln) in_aln = compress_seq['sequences'] else: for fmt in ['fasta', 'phylip-relaxed', 'nexus']: try: in_aln=AlignIO.read(in_aln, fmt) except: continue if isinstance(in_aln, MultipleSeqAlignment): # check whether the alignment is consistent with a nucleotide alignment. self._aln = {} for s in in_aln: if s.id==s.name: tmp_name = s.id elif ' in_aln.get_alignment_length(): self.logger("SequenceData.aln: specified sequence length doesn't match alignment length. Treating difference as constant sites.", 2, warn=True) self.additional_constant_sites = max(0, self.full_length - in_aln.get_alignment_length()) else: if self.is_sparse: self.full_length = len(self.ref) else: self.full_length = in_aln.get_alignment_length() self.sequence_names = list(self.aln.keys()) self.make_compressed_alignment() @property def full_length(self): """length of the uncompressed sequence """ return self._full_length @full_length.setter def full_length(self,L): """set the length of the uncompressed sequence. its inverse 'one_mutation' is frequently used as a general length scale. This can't be changed once it is set. Parameters ---------- L : int length of the sequence alignment """ if (not hasattr(self, '_full_length')) or self._full_length is None: if L: self._full_length = int(L) else: self.logger("Alignment: one_mutation and sequence length can only be specified once!",1) @property def compressed_length(self): return self._compressed_length @property def ref(self): """ :setter: Sets the string reference sequence :getter: Returns the string reference sequence """ return self._ref @ref.setter def ref(self, in_ref): """ Parameters ---------- in_ref : file name, str, Bio.Seq.Seq, Bio.SeqRecord.SeqRecord reference sequence will read and stored a byte array """ read_from_file=False if in_ref and isfile(in_ref): for fmt in ['fasta', 'genbank']: try: in_ref = SeqIO.read(in_ref, fmt) self.logger("SequenceData: loaded reference sequence as %s format"%fmt,1) read_from_file=True break except: continue if not read_from_file: raise TypeError('SequenceData.ref: reference sequence file %s could not be parsed, fasta and genbank formats are supported.') if in_ref: self._ref = seq2array(in_ref, fill_overhangs=False, word_length=self.word_length) self.full_length = self._ref.shape[0] self.compressed_to_full_sequence_map = None self._multiplicity = None def multiplicity(self, mask=None): if mask is None: return self._multiplicity else: return self._multiplicity*mask def check_alphabet(self, seqs): self.likely_alphabet = guess_alphabet(seqs) if self.sequence_type: if self.likely_alphabet!=self.sequence_type: if self.sequence_type=='nuc': self.logger("POSSIBLE ERROR: This does not look like a nucleotide alignment!", 0, warn=True) elif self.sequence_type=='aa': self.logger("POSSIBLE ERROR: This looks like a nucleotide alignment, you indicated amino acids!", 0, warn=True) if self.ambiguous is None: self.ambiguous = 'N' if self.likely_alphabet=='nuc' else 'X' def make_compressed_alignment(self): """ Create the compressed alignment from the full sequences. This method counts the multiplicity for each column of the alignment ('alignment pattern'), and creates the compressed alignment, where only the unique patterns are present. The maps from full sequence to compressed sequence and back are also stored to allow compressing and expanding the sequences. Notes ----- full_to_compressed_sequence_map : (array) Map to reduce a sequence compressed_to_full_sequence_map : (dict) Map to restore sequence from compressed alignment multiplicity : (array) Numpy array, which stores the pattern multiplicity for each position of the compressed alignment. compressed_alignment : (2D numpy array) The compressed alignment. Shape is (N x L'), where N is number of sequences, L' - number of unique alignment patterns """ if not self.compress: # self._multiplicity = np.ones(self.full_length, dtype=float) self.full_to_compressed_sequence_map = np.arange(self.full_length) self.compressed_to_full_sequence_map = {p:np.array([p]) for p in np.arange(self.full_length)} self._compressed_length = self._full_length self.compressed_alignment = self._aln return ttconf.SUCCESS self.logger("SeqData: making compressed alignment...", 1) # bind positions in full length sequence to that of the compressed (compressed) sequence self.full_to_compressed_sequence_map = np.zeros(self.full_length, dtype=int) # bind position in compressed sequence to the array of positions in full length sequence self.compressed_to_full_sequence_map = {} #if alignment is sparse, don't iterate over all invarible sites. #so pre-load alignment_patterns with the location of const sites! #and get the sites that we want to iterate over only! if self.is_sparse: from .vcf_utils import process_sparse_alignment tmp = process_sparse_alignment(self.aln, self.ref, self.ambiguous) compressed_aln_transpose = tmp["constant_columns"] alignment_patterns = tmp["constant_patterns"] variable_positions = tmp["variable_positions"] self.inferred_const_sites = tmp["constant_up_to_ambiguous"] self.nonref_positions = tmp["nonref_positions"] else: # transpose real alignment, for ease of iteration alignment_patterns = {} compressed_aln_transpose = [] aln_transpose = np.array([self.aln[k] for k in self.sequence_names]).T variable_positions = np.arange(aln_transpose.shape[0]) for pi in variable_positions: if self.is_sparse: pattern = np.array([self.aln[k][pi] if pi in self.aln[k] else self.ref[pi] for k in self.sequence_names]) else: # pylint: disable=unsubscriptable-object pattern = np.copy(aln_transpose[pi]) # if the column contains only one state and ambiguous nucleotides, replace # those with the state in other strains right away unique_letters = list(np.unique(pattern)) if len(unique_letters)==2 and self.ambiguous in unique_letters: other = [c for c in unique_letters if c!=self.ambiguous][0] #also replace in original pattern! pattern[pattern == self.ambiguous] = other unique_letters = [other] str_pattern = "".join(pattern.astype('U')) # if there is a mutation in this column, give it its private pattern # this is required when sampling mutations from reconstructed profiles. # otherwise, all mutations corresponding to the same pattern will be coupled. # FIXME: this could be done more efficiently if len(unique_letters)>1: str_pattern += '_%d'%pi # if the pattern is not yet seen, if str_pattern not in alignment_patterns: # bind the index in the compressed aln, index in sequence to the pattern string alignment_patterns[str_pattern] = (len(compressed_aln_transpose), [pi]) # append this pattern to the compressed alignment compressed_aln_transpose.append(pattern) else: # if the pattern is already seen, append the position in the real # sequence to the compressed aln<->sequence_pos_indexes map alignment_patterns[str_pattern][1].append(pi) # add constant alignment column not in the alignment. We don't know where they # are, so just add them to the end. First, determine sequence composition. if self.additional_constant_sites: character_counts = {c:np.sum(aln_transpose==c) for c in alphabets[self.likely_alphabet+'_nogap'] if c not in [self.ambiguous, '-']} total = np.sum(list(character_counts.values())) additional_columns_per_character = [(c,int(np.round(self.additional_constant_sites*n/total))) for c, n in character_counts.items()] columns_left = self.additional_constant_sites pi = np.max(variable_positions)+1 for c,n in additional_columns_per_character: if c==additional_columns_per_character[-1][0]: # make sure all additions add up to the correct number to avoid rounding n = columns_left str_pattern = c*len(self.sequence_names) pos_list = list(range(pi, pi+n)) if n: if str_pattern in alignment_patterns: alignment_patterns[str_pattern][1].extend(pos_list) else: alignment_patterns[str_pattern] = (len(compressed_aln_transpose), pos_list) compressed_aln_transpose.append(np.array(list(str_pattern))) pi += n columns_left -= n # count how many times each column is repeated in the real alignment self._multiplicity = np.zeros(len(alignment_patterns)) for p, pos in alignment_patterns.values(): self._multiplicity[p]=len(pos) # create the compressed alignment as a dictionary linking names to sequences tmp_compressed_alignment = np.array(compressed_aln_transpose).T # pylint: disable=unsubscriptable-object self.compressed_alignment = {k: tmp_compressed_alignment[i] for i,k in enumerate(self.sequence_names)} # create map to compress a sequence for p, pos in alignment_patterns.values(): self.full_to_compressed_sequence_map[np.array(pos)]=p # create a map to reconstruct full sequence from the compressed (compressed) sequence for p, val in alignment_patterns.items(): self.compressed_to_full_sequence_map[val[0]]=np.array(val[1], dtype=int) self.logger("SequenceData: constructed compressed alignment...", 1) self._compressed_length = len(self._multiplicity) return ttconf.SUCCESS def full_to_sparse_sequence(self, sequence): """turn a sequence into a dictionary of differences from a reference sequence Parameters ---------- sequence : str, numpy.ndarray sequence to convert Returns ------- dict dictionary of difference from reference """ if self.ref is None: raise TypeError("SequenceData: sparse sequences can only be constructed when a reference sequence is defined") if type(sequence) is not np.ndarray: aseq = seq2array(sequence, fill_overhangs=False) else: aseq = sequence differences = np.where(self.ref!=aseq)[0] return {p:aseq[p] for p in differences} def compressed_to_sparse_sequence(self, sequence): """turn a compressed sequence into a list of difference from a reference Parameters ---------- sequence : numpy.ndarray compressed sequence stored as array Returns ------- dict dictionary of difference from reference """ if self.ref is None: raise TypeError("SequenceData: sparse sequences can only be constructed when a reference sequence is defined") compressed_nonref_positions = self.full_to_compressed_sequence_map[self.nonref_positions] compressed_nonref_values = sequence[compressed_nonref_positions] mismatches = (compressed_nonref_values != self.ref[self.nonref_positions]) return dict(zip(self.nonref_positions[mismatches], compressed_nonref_values[mismatches])) def compressed_to_full_sequence(self, sequence, include_additional_constant_sites=False, as_string=False): """expand a compressed sequence Parameters ---------- sequence : np.ndarray compressed sequence include_additional_constant_sites : bool, optional add sites assumed constant as_string : bool, optional return a string instead of an array Returns ------- array,str expanded sequence """ if include_additional_constant_sites: L = self.full_length else: L = self.full_length - self.additional_constant_sites tmp_seq = sequence[self.full_to_compressed_sequence_map[:L]] if as_string: return "".join(tmp_seq.astype('U')) else: return tmp_seq def differences(self, seq1, seq2, seq1_compressed=True, seq2_compressed=True, mask=None): diffs = [] if self.is_sparse: if seq1_compressed: seq1 = self.compressed_to_sparse_sequence(seq1) if seq2_compressed: seq2 = self.compressed_to_sparse_sequence(seq2) for pos in set(seq1.keys()).union(seq2.keys()): ref_state = self.ref[pos] s1 = seq1.get(pos, ref_state) s2 = seq2.get(pos, ref_state) if s1!=s2: diffs.append((s1,pos,s2)) else: if seq1_compressed: seq1 = self.compressed_to_full_sequence(seq1) if seq2_compressed: seq2 = self.compressed_to_full_sequence(seq2) if mask is None: diff_pos = np.where(seq1 != seq2)[0] else: diff_pos = np.where((seq1 != seq2)&(mask>0))[0] for pos in diff_pos: diffs.append((seq1[pos], pos, seq2[pos])) return sorted(diffs, key=lambda x:x[1]) treetime-0.11.1/treetime/treeanc.py000066400000000000000000002162261447636507100172470ustar00rootroot00000000000000import time, sys import gc import numpy as np from Bio import Phylo from Bio.Phylo.BaseTree import Clade from . import config as ttconf from . import MissingDataError,UnknownMethodError from .seq_utils import seq2prof, prof2seq, normalize_profile, extend_profile from .gtr import GTR from .gtr_site_specific import GTR_site_specific from .sequence_data import SequenceData def compressed_sequence(node): if node.name in node.tt.data.compressed_alignment and (not node.tt.reconstructed_tip_sequences): return node.tt.data.compressed_alignment[node.name] elif hasattr(node, '_cseq'): return node._cseq elif node.is_terminal(): # node without sequence when tip-reconstruction is off. return None elif hasattr(node, '_cseq'): return node._cseq else: raise ValueError('Ancestral sequences are not yet inferred') def mutations(node): """ Get the mutations on a tree branch. Take compressed sequences from both sides of the branch (attached to the node), compute mutations between them, and expand these mutations to the positions in the real sequences. """ if node.up is None: return [] elif (not node.tt.reconstructed_tip_sequences) and node.name in node.tt.data.aln: return node.tt.data.differences(node.up.cseq, node.tt.data.aln[node.name], seq2_compressed=False, mask=node.mask) elif node.is_terminal() and (node.name not in node.tt.data.aln): return [] else: return node.tt.data.differences(node.up.cseq, node.cseq, mask=node.mask) string_types = [str] if sys.version_info[0]==3 else [str, unicode] Clade.sequence = property(lambda x: x.tt.sequence(x, as_string=False)) Clade.cseq = property(compressed_sequence) Clade.mutations = property(mutations) class TreeAnc(object): """ Class defines simple tree object with basic interface methods: reading and saving from/to files, initializing leaves with sequences from the alignment, making ancestral state inference """ def __init__(self, tree=None, aln=None, gtr=None, fill_overhangs=True, ref=None, verbose = ttconf.VERBOSE, ignore_gaps=True, convert_upper=True, seq_multiplicity=None, log=None, compress=True, seq_len=None, ignore_missing_alns=False, keep_node_order=False, rng_seed=None, **kwargs): """ TreeAnc constructor. It prepares the tree, attaches sequences to the leaf nodes, and sets some configuration parameters. Parameters ---------- tree : str, Bio.Phylo.Tree Phylogenetic tree. String passed is interpreted as a filename with a tree in a standard format that can be parsed by the Biopython Phylo module. Branch length should be in units of average number of nucleotide or protein substitutions per site. Use on trees with longer branches (>4) is not recommended. aln : str, Bio.Align.MultipleSequenceAlignment, dict Sequence alignment. If a string passed, it is interpreted as the filename to read Biopython alignment from. If a dict is given, this is assumed to be the output of vcf_utils.read_vcf which specifies for each sequence the differences from a reference gtr : str, GTR GTR model object. If string passed, it is interpreted as the type of the GTR model. A new GTR instance will be created for this type. fill_overhangs : bool, default True In some cases, the missing data on both ends of the alignment is filled with the gap sign('-'). If set to True, the end-gaps are converted to "unknown" characters ('N' for nucleotides, 'X' for aminoacids). Otherwise, the alignment is treated as-is ref : None, optional Reference sequence used in VCF mode verbose : int, default 3 Verbosity level as number from 0 (lowest) to 10 (highest). ignore_gaps : bool, default True Ignore gaps in branch length calculations convert_upper : bool, default True Convert all sequences to upper case seq_multiplicity : dict If individual nodes in the tree correspond to multiple sampled sequences (i.e. read count in a deep sequencing experiment), these can be specified as a dictionary. This currently only affects rooting and can be used to weigh individual tips by abundance or important during root search. compress : bool, default True reduce identical alignment columns to one (not useful when inferring site specific GTR models). seq_len : int, optional length of the sequence. this is inferred from the input alignment or the reference sequence in most cases but can be specified for other applications. ignore_missing_alns : bool, default False **kwargs Keyword arguments to construct the GTR model .. Note:: Some GTR types require additional configuration parameters. If the new GTR is being instantiated, these parameters are expected to be passed as kwargs. If nothing is passed, the default values are used, which might cause unexpected results. Raises ------ AttributeError If no tree is passed in """ if tree is None: raise TypeError("TreeAnc requires a tree!") self.t_start = time.time() self.verbose = verbose self.log = log self.ok = False self.data = None self.log_messages = set() self.logger("TreeAnc: set-up",1) self._internal_node_count = 0 self.use_mutation_length = False self.ignore_gaps = ignore_gaps self.reconstructed_tip_sequences = False self.sequence_reconstruction = None self.ignore_missing_alns = ignore_missing_alns self.keep_node_order = keep_node_order self.rng = np.random.default_rng(seed=rng_seed) self._tree = None self.tree = tree if tree is None: raise MissingDataError("TreeAnc: tree loading failed! exiting") # set up GTR model self._gtr = None self.set_gtr(gtr or 'JC69', **kwargs) # set alignment and attach sequences to tree on success. # otherwise self.data.aln will be None self.data = SequenceData(aln, ref=ref, logger=self.logger, compress=compress, convert_upper=convert_upper, fill_overhangs=fill_overhangs, ambiguous=self.gtr.ambiguous, sequence_length=seq_len) if self.gtr.is_site_specific and self.data.compress: raise TypeError("TreeAnc: sequence compression and site specific gtr models are incompatible!" ) if self.data.aln and self.tree: self._check_alignment_tree_gtr_consistency() def logger(self, msg, level, warn=False, only_once=False): """ Print log message *msg* to stdout. Parameters ----------- msg : str String to print on the screen level : int Log-level. Only the messages with a level higher than the current verbose level will be shown. warn : bool Warning flag. If True, the message will be displayed regardless of its log-level. """ if only_once and msg in self.log_messages: return self.log_messages.add(msg) lw=80 if level ttconf.MAX_BRANCH_LENGTH: branch_length_warning = True if hasattr(node, "_cseq"): node.__delattr__("_cseq") node.original_length = node.branch_length node.mutation_length = node.branch_length if branch_length_warning: self.logger("WARNING: TreeTime has detected branches that are longer than %d. " "TreeTime requires trees where branch length is in units of average number " "of nucleotide or protein substitutions per site. " "Use on trees with longer branches is not recommended for ancestral sequence reconstruction."%(ttconf.MAX_BRANCH_LENGTH), 0, warn=True) self.prepare_tree() if self.data: self._check_alignment_tree_gtr_consistency() return ttconf.SUCCESS @property def one_mutation(self): """ Returns ------- float inverse of the uncompressed sequence length - length scale for short branches """ return 1.0/self.data.full_length if self.data.full_length else np.nan @one_mutation.setter def one_mutation(self,om): self.logger("TreeAnc: one_mutation can't be set",1) @property def seq_len(self): return self.data.full_length @property def sequence_length(self): return self.data.full_length def _check_alignment_tree_gtr_consistency(self): ''' For each node of the tree, check whether there is a sequence available in the alignment and assign this sequence as a character array ''' if len(self.tree.get_terminals()) != len(self.data.aln): self.logger(f"**WARNING: Number of tips in tree ({len(self.tree.get_terminals())}) differs from number of sequences in alignment ({len(self.data.aln)})**", 3, warn=True) failed_leaves= 0 # loop over leaves and assign multiplicities of leaves (e.g. number of identical reads) for l in self.tree.get_terminals(): if l.name in self.data.seq_multiplicity: l.count = self.data.seq_multiplicity[l.name] else: l.count = 1.0 # loop over tree, and assign sequences for l in self.tree.find_clades(): if hasattr(l, 'branch_state'): del l.branch_state if l.name not in self.data.compressed_alignment and l.is_terminal(): self.logger("***WARNING: TreeAnc._check_alignment_tree_gtr_consistency: NO SEQUENCE FOR LEAF: '%s'" % l.name, 0, warn=True) failed_leaves += 1 if not self.ignore_missing_alns and failed_leaves > self.tree.count_terminals()/3: raise MissingDataError("TreeAnc._check_alignment_tree_gtr_consistency: At least 30\\% terminal nodes cannot be assigned a sequence!\n" "Are you sure the alignment belongs to the tree?") else: # could not assign sequence for internal node - is OK pass if failed_leaves: self.logger("***WARNING: TreeAnc: %d nodes don't have a matching sequence in the alignment." " POSSIBLE ERROR."%failed_leaves, 0, warn=True) # extend profile to contain additional unknown characters extend_profile(self.gtr, [self.data.ref] if self.data.is_sparse else self.data.aln.values(), logger=self.logger) self.ok = True def prepare_tree(self): """ Set link to parent and calculate distance to root for all tree nodes. Should be run once the tree is read and after every rerooting, topology change or branch length optimizations. """ self.sequence_reconstruction = False self.tree.root.branch_length = 0.001 self.tree.root.mask = None self.tree.root.mutation_length = self.tree.root.branch_length if not self.keep_node_order: self.tree.ladderize() self._prepare_nodes() self._leaves_lookup = {node.name:node for node in self.tree.get_terminals()} def _prepare_nodes(self): """ Set auxilliary parameters to every node of the tree. """ self.tree.root.up = None self.tree.root.tt = self self.tree.root.bad_branch=self.tree.root.bad_branch if hasattr(self.tree.root, 'bad_branch') else False name_set = {n.name for n in self.tree.find_clades() if n.name} internal_node_count = 0 for clade in self.tree.get_nonterminals(order='preorder'): # parents first if clade.name is None: tmp = "NODE_" + format(internal_node_count, '07d') while tmp in name_set: internal_node_count += 1 tmp = "NODE_" + format(internal_node_count, '07d') clade.name = tmp name_set.add(clade.name) internal_node_count+=1 for c in clade.clades: c.up = clade c.tt = self for clade in self.tree.find_clades(order='postorder'): # children first if clade.is_terminal(): clade.bad_branch = clade.bad_branch if hasattr(clade, 'bad_branch') else False else: clade.bad_branch = all([c.bad_branch for c in clade]) if not hasattr(clade, "mask"): clade.mask = None self._calc_dist2root() self._internal_node_count = max(internal_node_count, self._internal_node_count) def _calc_dist2root(self): """ For each node in the tree, set its root-to-node distance as dist2root attribute """ self.tree.root.dist2root = 0.0 for clade in self.tree.get_nonterminals(order='preorder'): # parents first for c in clade.clades: c.dist2root = clade.dist2root + c.mutation_length #################################################################### ## END SET-UP #################################################################### ################################################################### ### ancestral reconstruction ################################################################### def reconstruct_anc(self,*args, **kwargs): """Shortcut for :py:meth:`treetime.TreeAnc.infer_ancestral_sequences` """ return self.infer_ancestral_sequences(*args,**kwargs) def infer_ancestral_sequences(self, method='probabilistic', infer_gtr=False, marginal=False, reconstruct_tip_states=False, **kwargs): """Reconstruct ancestral sequences Parameters ---------- method : str Method to use. Supported values are "parsimony", "fitch", "probabilistic" and "ml" infer_gtr : bool Infer a GTR model before reconstructing the sequences marginal : bool Assign sequences that are most likely after averaging over all other nodes instead of the jointly most likely sequences. reconstruct_tip_states : bool, optional Reconstruct sequences of terminal nodes/leaves, thereby replacing ambiguous characters with the inferred base/state. default: False **kwargs additional keyword arguments that are passed down to :py:meth:`TreeAnc.infer_gtr` and :py:meth:`TreeAnc._ml_anc` Returns ------- N_diff : int Number of nucleotides different from the previous reconstruction. If there were no pre-set sequences, returns N*L """ if not self.ok: raise MissingDataError("TreeAnc.infer_ancestral_sequences: ERROR, sequences or tree are missing") self.logger("TreeAnc.infer_ancestral_sequences with method: %s, %s"%(method, 'marginal' if marginal else 'joint'), 1) if method.lower() in ['ml', 'probabilistic']: if marginal: _ml_anc = self._ml_anc_marginal else: _ml_anc = self._ml_anc_joint elif method.lower() in ['fitch', 'parsimony']: _ml_anc = self._fitch_anc else: raise UnknownMethodError("Reconstruction method needs to be in ['ml', 'probabilistic', 'fitch', 'parsimony'], got '{}'".format(method)) if infer_gtr: self.infer_gtr(marginal=marginal, **kwargs) N_diff = _ml_anc(reconstruct_tip_states=reconstruct_tip_states, **kwargs) else: N_diff = _ml_anc(reconstruct_tip_states=reconstruct_tip_states, **kwargs) return N_diff ################################################################### ### FITCH ################################################################### def _fitch_anc(self, **kwargs): """ Reconstruct ancestral states using Fitch's algorithm. It implements the iteration from leaves to the root constructing the Fitch profiles for each character of the sequence, and then by propagating from the root to the leaves, reconstructs the sequences of the internal nodes. Keyword Args ------------ Returns ------- Ndiff : int Number of the characters that changed since the previous reconstruction. These changes are determined from the pre-set sequence attributes of the nodes. If there are no sequences available (i.e., no reconstruction has been made before), returns the total number of characters in the tree. """ # set fitch profiiles to each terminal node for l in self.tree.get_terminals(): l.state = [[k] for k in l.cseq] L = self.data.compressed_length self.logger("TreeAnc._fitch_anc: Walking up the tree, creating the Fitch profiles",2) for node in self.tree.get_nonterminals(order='postorder'): node.state = [self._fitch_state(node, k) for k in range(L)] ambs = [i for i in range(L) if len(self.tree.root.state[i])>1] if len(ambs) > 0: for amb in ambs: self.logger("Ambiguous state of the root sequence " "in the position %d: %s, " "choosing %s" % (amb, str(self.tree.root.state[amb]), self.tree.root.state[amb][0]), 4) self.tree.root._cseq = np.array([k[self.rng.randint(len(k)) if len(k)>1 else 0] for k in self.tree.root.state]) self.logger("TreeAnc._fitch_anc: Walking down the self.tree, generating sequences from the " "Fitch profiles.", 2) N_diff = 0 for node in self.tree.get_nonterminals(order='preorder'): if node.up != None: # not root sequence = np.array([node.up._cseq[i] if node.up._cseq[i] in node.state[i] else node.state[i][0] for i in range(L)]) if self.sequence_reconstruction: N_diff += (sequence!=node.cseq).sum() else: N_diff += L node._cseq = sequence del node.state # no need to store Fitch states self.sequence_reconstruction = 'parsimony' self.logger("Done ancestral state reconstruction",3) return N_diff def _fitch_state(self, node, pos): """ Determine the Fitch profile for a single character of the node's sequence. The profile is essentially the intersection between the children's profiles or, if the former is empty, the union of the profiles. Parameters ---------- node : PhyloTree.Clade: Internal node which the profiles are to be determined pos : int Position in the node's sequence which the profiles should be determinedf for. Returns ------- state : numpy.array Fitch profile for the character at position pos of the given node. """ state = self._fitch_intersect([k.state[pos] for k in node.clades]) if len(state) == 0: state = np.concatenate([k.state[pos] for k in node.clades]) return state def _fitch_intersect(self, arrays): """ Find the intersection of any number of 1D arrays. Return the sorted, unique values that are in all of the input arrays. Adapted from numpy.lib.arraysetops.intersect1d """ def pairwise_intersect(arr1, arr2): s2 = set(arr2) b3 = [val for val in arr1 if val in s2] return b3 arrays = list(arrays) # allow assignment N = len(arrays) while N > 1: arr1 = arrays.pop() arr2 = arrays.pop() arr = pairwise_intersect(arr1, arr2) arrays.append(arr) N = len(arrays) return arrays[0] ################################################################### ### Maximum Likelihood ################################################################### def sequence_LH(self, pos=None, full_sequence=False): """return the likelihood of the observed sequences given the tree Parameters ---------- pos : int, optional position in the sequence, if none, the sum over all positions will be returned full_sequence : bool, optional does the position refer to the full or compressed sequence, by default compressed sequence is assumed. Returns ------- float likelihood """ if not hasattr(self.tree, "total_sequence_LH"): self.logger("TreeAnc.sequence_LH: you need to run marginal ancestral inference first!", 1) self.infer_ancestral_sequences(marginal=True) if pos is not None: if full_sequence: compressed_pos = self.data.full_to_compressed_sequence_map[pos] else: compressed_pos = pos return self.tree.sequence_LH[compressed_pos] else: return self.tree.total_sequence_LH def ancestral_likelihood(self): """ Calculate the likelihood of the given realization of the sequences in the tree Returns ------- log_lh : float The tree likelihood given the sequences """ log_lh = np.zeros(self.data.multiplicity().shape[0]) for node in self.tree.find_clades(order='postorder'): if node.up is None: # root node # 0-1 profile profile = seq2prof(node.cseq, self.gtr.profile_map) # get the probabilities to observe each nucleotide profile *= self.gtr.Pi profile = profile.sum(axis=1) log_lh += np.log(profile) # product over all characters continue t = node.branch_length indices = np.array([(self.gtr.state_index[a], self.gtr.state_index[b]) for a, b in zip(node.up.cseq, node.cseq)]) logQt = np.log(self.gtr.expQt(t)) lh = logQt[indices[:, 1], indices[:, 0]] log_lh += lh return log_lh def _branch_length_to_gtr(self, node): """ Set branch lengths to either mutation lengths of given branch lengths. The assigend values are to be used in the following ML analysis. """ if self.use_mutation_length: return max(ttconf.MIN_BRANCH_LENGTH*self.one_mutation, node.mutation_length) else: return max(ttconf.MIN_BRANCH_LENGTH*self.one_mutation, node.branch_length) def _ml_anc_marginal(self, sample_from_profile=False, reconstruct_tip_states=False, debug=False, **kwargs): """ Perform marginal ML reconstruction of the ancestral states. In contrast to joint reconstructions, this needs to access the probabilities rather than only log probabilities and is hence handled by a separate function. Parameters ---------- sample_from_profile : bool or str assign sequences probabilistically according to the inferred probabilities of ancestral states instead of to their ML value. This parameter can also take the value 'root' in which case probabilistic sampling will happen at the root but at no other node. reconstruct_tip_states : bool, default False reconstruct sequence assigned to leaves, will replace ambiguous characters with the most likely definite character. Note that this will affect the mutations assigned to branches. """ self.logger("TreeAnc._ml_anc_marginal: type of reconstruction: Marginal", 2) self.postorder_traversal_marginal() # choose sequence characters from this profile. # treat root node differently to avoid piling up mutations on the longer branch if sample_from_profile=='root': root_sample_from_profile = True other_sample_from_profile = False elif isinstance(sample_from_profile, bool): root_sample_from_profile = sample_from_profile other_sample_from_profile = sample_from_profile self.total_LH_and_root_sequence(sample_from_profile=root_sample_from_profile, assign_sequence=True) N_diff = self.preorder_traversal_marginal(reconstruct_tip_states=reconstruct_tip_states, sample_from_profile=other_sample_from_profile, assign_sequence=True) self.logger("TreeAnc._ml_anc_marginal: ...done", 3) self.reconstructed_tip_sequences = reconstruct_tip_states # do clean-up: if not debug: for node in self.tree.find_clades(): try: del node.marginal_log_Lx del node.marginal_subtree_LH_prefactor except: pass gc.collect() self.sequence_reconstruction = 'marginal' return N_diff def total_LH_and_root_sequence(self, sample_from_profile=False, assign_sequence=False): self.logger("Computing root node sequence and total tree likelihood...",3) # Msg to the root from the distant part (equ frequencies) if len(self.gtr.Pi.shape)==1: self.tree.root.marginal_outgroup_LH = np.repeat([self.gtr.Pi], self.data.compressed_length, axis=0) else: self.tree.root.marginal_outgroup_LH = np.copy(self.gtr.Pi.T) self.tree.root.marginal_profile, pre = normalize_profile(self.tree.root.marginal_outgroup_LH*self.tree.root.marginal_subtree_LH) marginal_LH_prefactor = self.tree.root.marginal_subtree_LH_prefactor + pre self.tree.sequence_LH = marginal_LH_prefactor self.tree.total_sequence_LH = (self.tree.sequence_LH*self.data.multiplicity()).sum() self.tree.sequence_marginal_LH = self.tree.total_sequence_LH if assign_sequence: seq, prof_vals, idxs = prof2seq(self.tree.root.marginal_profile, self.gtr, sample_from_prof=sample_from_profile, normalize=False, rng=self.rng) self.tree.root._cseq = seq def postorder_traversal_marginal(self): L = self.data.compressed_length n_states = self.gtr.alphabet.shape[0] self.logger("Attaching sequence profiles to leafs... ", 3) # set the leaves profiles. This doesn't ever need to be reassigned for leaves for leaf in self.tree.get_terminals(): if not hasattr(leaf, "marginal_subtree_LH"): if leaf.name in self.data.compressed_alignment: leaf.marginal_subtree_LH = seq2prof(self.data.compressed_alignment[leaf.name], self.gtr.profile_map) else: leaf.marginal_subtree_LH = np.ones((L, n_states)) if not hasattr(leaf, "marginal_subtree_LH_prefactor"): leaf.marginal_subtree_LH_prefactor = np.zeros(L) self.logger("Postorder: computing likelihoods... ", 3) # propagate leaves --> root, set the marginal-likelihood messages for node in self.tree.get_nonterminals(order='postorder'): #leaves -> root # regardless of what was before, set the profile to ones tmp_log_subtree_LH = np.zeros((L,n_states), dtype=float) node.marginal_subtree_LH_prefactor = np.zeros(L, dtype=float) for ch in node.clades: if ch.mask is None: ch.marginal_log_Lx = self.gtr.propagate_profile(ch.marginal_subtree_LH, self._branch_length_to_gtr(ch), return_log=True) # raw prob to transfer prob up else: ch.marginal_log_Lx = (self.gtr.propagate_profile(ch.marginal_subtree_LH, self._branch_length_to_gtr(ch), return_log=True).T*ch.mask).T # raw prob to transfer prob up tmp_log_subtree_LH += ch.marginal_log_Lx node.marginal_subtree_LH_prefactor += ch.marginal_subtree_LH_prefactor node.marginal_subtree_LH, offset = normalize_profile(tmp_log_subtree_LH, log=True) node.marginal_subtree_LH_prefactor += offset # and store log-prefactor def preorder_traversal_marginal(self, reconstruct_tip_states=False, sample_from_profile=False, assign_sequence=False): self.logger("Preorder: computing marginal profiles...",3) # propagate root -->> leaves, reconstruct the internal node sequences # provided the upstream message + the message from the complementary subtree N_diff = 0 for node in self.tree.find_clades(order='preorder'): if node.up is None: # skip if node is root continue if hasattr(node, 'branch_state'): del node.branch_state # integrate the information coming from parents with the information # of all children my multiplying it to the prev computed profile node.marginal_outgroup_LH, pre = normalize_profile(np.log(np.maximum(ttconf.TINY_NUMBER, node.up.marginal_profile)) - node.marginal_log_Lx, log=True, return_offset=False) if node.is_terminal() and (not reconstruct_tip_states): # skip remainder unless leaves are to be reconstructed continue tmp_msg_from_parent = self.gtr.evolve(node.marginal_outgroup_LH, self._branch_length_to_gtr(node), return_log=False) if node.mask is None: node.marginal_profile, pre = normalize_profile(node.marginal_subtree_LH * tmp_msg_from_parent, return_offset=False) else: node.marginal_profile, pre = normalize_profile(node.marginal_subtree_LH * (node.mask*tmp_msg_from_parent.T + (1.0-node.mask)).T, return_offset=False) # choose sequence based maximal marginal LH. if assign_sequence: seq, prof_vals, idxs = prof2seq(node.marginal_profile, self.gtr, sample_from_prof=sample_from_profile, normalize=False, rng=self.rng) if self.sequence_reconstruction: N_diff += (seq!=node.cseq).sum() else: N_diff += self.data.compressed_length #assign new sequence node._cseq = seq return N_diff def _ml_anc_joint(self, sample_from_profile=False, reconstruct_tip_states=False, debug=False, **kwargs): """ Perform joint ML reconstruction of the ancestral states. In contrast to marginal reconstructions, this only needs to compare and multiply LH and can hence operate in log space. Parameters ---------- sample_from_profile : str This parameter can take the value 'root' in which case probabilistic sampling will happen at the root. otherwise sequences at ALL nodes are set to the value that jointly optimized the likelihood. reconstruct_tip_states : bool, default False reconstruct sequence assigned to leaves, will replace ambiguous characters with the most likely definite character. Note that this will affect the mutations assigned to branches. """ N_diff = 0 # number of sites differ from perv reconstruction L = self.data.compressed_length n_states = self.gtr.alphabet.shape[0] self.logger("TreeAnc._ml_anc_joint: type of reconstruction: Joint", 2) self.logger("TreeAnc._ml_anc_joint: Walking up the tree, computing likelihoods... ", 3) # for the internal nodes, scan over all states j of this node, maximize the likelihood for node in self.tree.find_clades(order='postorder'): if hasattr(node, 'branch_state'): del node.branch_state if node.up is None: node.joint_Cx=None # not needed for root continue branch_len = self._branch_length_to_gtr(node) # transition matrix from parent states to the current node states. # denoted as Pij(i), where j - parent state, i - node state log_transitions = np.log(np.maximum(ttconf.TINY_NUMBER, self.gtr.expQt(branch_len))) if node.is_terminal(): if node.name in self.data.compressed_alignment: tmp_prof = seq2prof(self.data.compressed_alignment[node.name], self.gtr.profile_map) msg_from_children = np.log(np.maximum(tmp_prof, ttconf.TINY_NUMBER)) else: msg_from_children = np.zeros((L, n_states)) msg_from_children[np.isnan(msg_from_children) | np.isinf(msg_from_children)] = -ttconf.BIG_NUMBER else: # Product (sum-Log) over all child subtree likelihoods. # this is prod_ch L_x(i) msg_from_children = np.sum(np.stack([c.joint_Lx for c in node.clades], axis=0), axis=0) if not debug: # Now that we have calculated the current node's likelihood # from its children, clean up likelihood matrices attached # to children to save memory. for c in node.clades: del c.joint_Lx # for every possible state of the parent node, # get the best state of the current node # and compute the likelihood of this state # preallocate storage node.joint_Lx = np.zeros((L, n_states)) # likelihood array node.joint_Cx = np.zeros((L, n_states), dtype=np.uint16) # max LH indices for char_i, char in enumerate(self.gtr.alphabet): # Pij(i) * L_ch(i) for given parent state j # if the node has a mask, P_ij is uniformly 1 at masked positions as no info is propagated if node.mask is None: msg_to_parent = (log_transitions[:,char_i].T + msg_from_children) else: msg_to_parent = ((log_transitions[:,char_i]*np.repeat([node.mask], self.gtr.n_states, axis=0).T) + msg_from_children) # For this parent state, choose the best state of the current node node.joint_Cx[:, char_i] = msg_to_parent.argmax(axis=1) # and compute the likelihood of the best state of the current node # given the state of the parent (char_i) -- at masked position, there is no contribution node.joint_Lx[:, char_i] = msg_to_parent.max(axis=1) if node.mask is not None: node.joint_Lx[:, char_i] *= node.mask # root node profile = likelihood of the total tree msg_from_children = np.sum(np.stack([c.joint_Lx for c in self.tree.root], axis = 0), axis=0) # Pi(i) * Prod_ch Lch(i) self.tree.root.joint_Lx = msg_from_children + np.log(self.gtr.Pi).T normalized_profile = (self.tree.root.joint_Lx.T - self.tree.root.joint_Lx.max(axis=1)).T # choose sequence characters from this profile. # treat root node differently to avoid piling up mutations on the longer branch if sample_from_profile=='root': root_sample_from_profile = True elif isinstance(sample_from_profile, bool): root_sample_from_profile = sample_from_profile seq, anc_lh_vals, idxs = prof2seq(np.exp(normalized_profile), self.gtr, sample_from_prof = root_sample_from_profile, rng=self.rng) # compute the likelihood of the most probable root sequence self.tree.sequence_LH = np.choose(idxs, self.tree.root.joint_Lx.T) self.tree.sequence_joint_LH = (self.tree.sequence_LH*self.data.multiplicity()).sum() self.tree.root._cseq = seq self.tree.root.seq_idx = idxs self.logger("TreeAnc._ml_anc_joint: Walking down the tree, computing maximum likelihood sequences...",3) # for each node, resolve the conditioning on the parent node nodes_to_reconstruct = self.tree.get_nonterminals(order='preorder') if reconstruct_tip_states: nodes_to_reconstruct += self.tree.get_terminals() #TODO: Should we add tips without sequence here? for node in nodes_to_reconstruct: # root node has no mutations, everything else has been already set if node.up is None: continue # choose the value of the Cx(i), corresponding to the state of the # parent node i. This is the state of the current node node.seq_idx = np.choose(node.up.seq_idx, node.joint_Cx.T) # reconstruct seq, etc tmp_sequence = np.choose(node.seq_idx, self.gtr.alphabet) if self.sequence_reconstruction: N_diff += (tmp_sequence!=node.cseq).sum() else: N_diff += L node._cseq = tmp_sequence self.logger("TreeAnc._ml_anc_joint: ...done", 3) self.reconstructed_tip_sequences = reconstruct_tip_states # do clean-up if not debug: for node in self.tree.find_clades(order='preorder'): # Check for the likelihood matrix, since we might have cleaned # it up earlier. if hasattr(node, "joint_Lx"): del node.joint_Lx del node.joint_Cx if hasattr(node, 'seq_idx'): del node.seq_idx self.sequence_reconstruction = 'joint' return N_diff ############################################################### ### sequence and mutation storing ############################################################### def get_branch_mutation_matrix(self, node, full_sequence=False): """uses results from marginal ancestral inference to return a joint distribution of the sequence states at both ends of the branch. Parameters ---------- node : Phylo.clade node of the tree full_sequence : bool, optional expand the sequence to the full sequence, if false (default) the there will be one mutation matrix for each column in the compressed alignment Returns ------- numpy.array an Lxqxq stack of matrices (q=alphabet size, L (compressed)sequence length) """ pp,pc = self.marginal_branch_profile(node) # calculate pc_i [e^Qt]_ij pp_j for each site expQt = self.gtr.expQt(self._branch_length_to_gtr(node)) + ttconf.SUPERTINY_NUMBER if len(expQt.shape)==3: # site specific model mut_matrix_stack = np.einsum('ai,aj,ija->aij', pc, pp, expQt) else: mut_matrix_stack = np.einsum('ai,aj,ij->aij', pc, pp, expQt) # normalize this distribution normalizer = mut_matrix_stack.sum(axis=2).sum(axis=1) mut_matrix_stack = np.einsum('aij,a->aij', mut_matrix_stack, 1.0/normalizer) # expand to full sequence if requested if full_sequence: return mut_matrix_stack[self.data.full_to_compressed_sequence_map] else: return mut_matrix_stack def marginal_branch_profile(self, node): ''' calculate the marginal distribution of sequence states on both ends of the branch leading to node, Parameters ---------- node : PhyloTree.Clade TreeNode, attached to the branch. Returns ------- pp, pc : Pair of vectors (profile parent, pp) and (profile child, pc) that are of shape (L,n) where L is sequence length and n is alphabet size. note that this correspond to the compressed sequences. ''' parent = node.up if parent is None: raise Exception("Branch profiles can't be calculated for the root!") if not hasattr(node, 'marginal_outgroup_LH'): raise Exception("marginal ancestral inference needs to be performed first!") pc = node.marginal_subtree_LH pp = node.marginal_outgroup_LH return pp, pc def add_branch_state(self, node): """add a dictionary to the node containing tuples of state pairs and a list of their number across the branch Parameters ---------- node : tree.node attaces attribute :branch_state: """ seq_pairs, multiplicity = self.gtr.state_pair( node.up.cseq, node.cseq, pattern_multiplicity = self.data.multiplicity(mask=node.mask), ignore_gaps = self.ignore_gaps) node.branch_state = {'pair':seq_pairs, 'multiplicity':multiplicity} ################################################################### ### Branch length optimization ################################################################### def optimize_branch_len(self, **kwargs): """Deprecated in favor of 'optimize_branch_lengths_joint'""" return self.optimize_branch_lengths_joint(**kwargs) def optimize_branch_len_joint(self, **kwargs): """Deprecated in favor of 'optimize_branch_lengths_joint'""" return self.optimize_branch_lengths_joint(**kwargs) def optimize_branch_lengths_joint(self, **kwargs): """ Perform optimization for the branch lengths of the entire tree. This method only does a single path and needs to be iterated. **Note** this method assumes that each node stores information about its sequence as numpy.array object (node.sequence attribute). Therefore, before calling this method, sequence reconstruction with either of the available models must be performed. Parameters ---------- **kwargs : Keyword arguments Keyword Args ------------ store_old : bool If True, the old lengths will be saved in :code:`node._old_dist` attribute. Useful for testing, and special post-processing. """ self.logger("TreeAnc.optimize_branch_length: running branch length optimization using jointML ancestral sequences",1) if (self.tree is None) or (self.data.aln is None): raise MissingDataError("TreeAnc.optimize_branch_length: ERROR, alignment or tree are missing.") store_old_dist = kwargs['store_old'] if 'store_old' in kwargs else False max_bl = 0 for node in self.tree.find_clades(order='postorder'): if node.up is None: continue # this is the root if store_old_dist: node._old_length = node.branch_length new_len = max(0,self.optimal_branch_length(node)) self.logger("Optimization results: old_len=%.4e, new_len=%.4e" " Updating branch length..."%(node.branch_length, new_len), 5) node.branch_length = new_len node.mutation_length=new_len max_bl = max(max_bl, new_len) if max_bl>0.15: self.logger("TreeAnc.optimize_branch_lengths_joint: THIS TREE HAS LONG BRANCHES." " \n\t ****TreeTime's JOINT IS NOT DESIGNED TO OPTIMIZE LONG BRANCHES." " \n\t ****PLEASE OPTIMIZE BRANCHES USING: " " \n\t ****branch_length_mode='input' or 'marginal'", 0, warn=True) # as branch lengths changed, the distance to root etc need to be recalculated self.tree.root.up = None self.tree.root.dist2root = 0.0 self._prepare_nodes() return ttconf.SUCCESS def optimal_branch_length(self, node): ''' Calculate optimal branch length given the sequences of node and parent Parameters ---------- node : PhyloTree.Clade TreeNode, attached to the branch. Returns ------- new_len : float Optimal length of the given branch ''' if node.up is None: return self.one_mutation if not hasattr(node, 'branch_state'): if node.cseq is None and node.is_terminal(): raise MissingDataError("TreeAnc.optimal_branch_length: terminal node alignments required; sequence is missing for leaf: '%s'. " "Missing terminal sequences can be inferred from sister nodes by rerunning with `reconstruct_tip_states=True` or `--reconstruct-tip-states`" % node.name) self.add_branch_state(node) return self.gtr.optimal_t_compressed(node.branch_state['pair'], node.branch_state['multiplicity']) def optimal_marginal_branch_length(self, node, tol=1e-10): ''' calculate the marginal distribution of sequence states on both ends of the branch leading to node, Parameters ---------- node : PhyloTree.Clade TreeNode, attached to the branch. Returns ------- branch_length : float branch length of the branch leading to the node. note: this can be unstable on iteration ''' if node.up is None: return self.one_mutation else: pp, pc = self.marginal_branch_profile(node) return self.gtr.optimal_t_compressed((pp, pc), self.data.multiplicity(mask=node.mask), profiles=True, tol=tol) def optimize_tree_marginal(self, max_iter=10, infer_gtr=False, pc=1.0, damping=0.75, LHtol=0.1, site_specific_gtr=False, **kwargs): self.infer_ancestral_sequences(marginal=True, **kwargs) oldLH = self.sequence_LH() self.logger("TreeAnc.optimize_tree_marginal: initial, LH=%1.2f, total branch_length %1.4f"% (oldLH, self.tree.total_branch_length()), 2) for i in range(max_iter): if infer_gtr: self.infer_gtr(site_specific=site_specific_gtr, marginal=True, normalized_rate=True, pc=pc) self.infer_ancestral_sequences(marginal=True, **kwargs) old_bl = self.tree.total_branch_length() tol = 1e-8 + 0.01**(i+1) for n in self.tree.find_clades(): if n.up is None: continue if n.up.up is None and len(n.up.clades)==2: # children of a bifurcating root! n1, n2 = n.up.clades total_bl = n1.branch_length+n2.branch_length bl_ratio = n1.branch_length/total_bl prof_c = n1.marginal_subtree_LH prof_p = normalize_profile(n2.marginal_subtree_LH*self.tree.root.marginal_outgroup_LH)[0] if n1.mask is None or n2.mask is None: new_bl = self.gtr.optimal_t_compressed((prof_p, prof_c), self.data.multiplicity(), profiles=True, tol=tol) else: new_bl = self.gtr.optimal_t_compressed((prof_p, prof_c), self.data.multiplicity(mask=n1.mask*n2.mask), profiles=True, tol=tol) update_val = new_bl*(1-damping**(i+1)) + total_bl*damping**(i+1) n1.branch_length = update_val*bl_ratio n2.branch_length = update_val*(1-bl_ratio) n1.mutation_length = n1.branch_length n2.mutation_length = n2.branch_length else: new_val = self.optimal_marginal_branch_length(n, tol=tol) update_val = new_val*(1-damping**(i+1)) + n.branch_length*damping**(i+1) n.branch_length = update_val n.mutation_length = n.branch_length self.infer_ancestral_sequences(marginal=True, **kwargs) LH = self.sequence_LH() deltaLH = LH - oldLH oldLH = LH dbl = self.tree.total_branch_length() - old_bl self.logger("TreeAnc.optimize_tree_marginal: iteration %d, LH=%1.2f (%1.2f), delta branch_length=%1.4f, total branch_length %1.4f"% (i, LH, deltaLH, dbl, self.tree.total_branch_length()), 2) if deltaLH 0.1)): # re-assign the node children directly to its parent node.up.clades = [k for k in node.up.clades if k != node] + node.clades for clade in node.clades: clade.up = node.up ##################################################################### ## GTR INFERENCE ##################################################################### def infer_gtr(self, marginal=False, site_specific=False, normalized_rate=True, fixed_pi=None, pc=5.0, **kwargs): """ Calculates a GTR model given the multiple sequence alignment and the tree. It performs ancestral sequence inferrence (joint or marginal), followed by the branch lengths optimization. Then, the numbers of mutations are counted in the optimal tree and related to the time within the mutation happened. From these statistics, the relative state transition probabilities are inferred, and the transition matrix is computed. The result is used to construct the new GTR model of type 'custom'. The model is assigned to the TreeAnc and is used in subsequent analysis. Parameters ----------- print_raw : bool If True, print the inferred GTR model marginal : bool If True, use marginal sequence reconstruction normalized_rate : bool If True, sets the mutation rate prefactor to 1.0. fixed_pi : np.array Provide the equilibrium character concentrations. If None is passed, the concentrations will be inferred from the alignment. pc: float Number of pseudo counts to use in gtr inference Returns ------- gtr : GTR The inferred GTR model """ if site_specific and self.data.compress: raise TypeError("TreeAnc.infer_gtr(): sequence compression and site specific GTR models are incompatible!" ) if not self.ok: raise MissingDataError("TreeAnc.infer_gtr: ERROR, sequences or tree are missing", 0) # if ancestral sequences are not in place, reconstruct them if marginal and self.sequence_reconstruction!='marginal': self._ml_anc_marginal(**kwargs) elif not self.sequence_reconstruction: self._ml_anc_joint(**kwargs) n = self.gtr.n_states L = len(self.tree.root._cseq) # matrix of mutations n_{ij}: i = derived state, j=ancestral state n_ija = np.zeros((n,n,L)) T_ia = np.zeros((n,L)) self.logger("TreeAnc.infer_gtr: counting mutations...", 2) for node in self.tree.get_nonterminals(): for c in node: if marginal: mut_stack = np.transpose(self.get_branch_mutation_matrix(c, full_sequence=False), (1,2,0)) T_ia += 0.5*self._branch_length_to_gtr(c) * mut_stack.sum(axis=0) * self.data.multiplicity(mask=c.mask) T_ia += 0.5*self._branch_length_to_gtr(c) * mut_stack.sum(axis=1) * self.data.multiplicity(mask=c.mask) n_ija += mut_stack * self.data.multiplicity(mask=c.mask) else: for a,pos, d in c.mutations: try: i,j = self.gtr.state_index[d], self.gtr.state_index[a] except: # ambiguous positions continue cpos = self.data.full_to_compressed_sequence_map[pos] n_ija[i,j,cpos]+=1 T_ia[j,cpos] += 0.5*self._branch_length_to_gtr(c) T_ia[i,cpos] -= 0.5*self._branch_length_to_gtr(c) for i, nuc in enumerate(self.gtr.alphabet): cseq = c.cseq if cseq is not None: ind = cseq==nuc T_ia[i,ind] += self._branch_length_to_gtr(c)*self.data.multiplicity(mask=c.mask)[ind] self.logger("TreeAnc.infer_gtr: counting mutations...done", 3) if site_specific: if marginal: root_state = self.tree.root.marginal_profile.T else: root_state = seq2prof(self.tree.root.cseq, self.gtr.profile_map).T self._gtr = GTR_site_specific.infer(n_ija, T_ia, pc=pc, root_state=root_state, logger=self.logger, alphabet=self.gtr.alphabet, prof_map=self.gtr.profile_map) else: root_state = np.array([np.sum((self.tree.root.cseq==nuc)*self.data.multiplicity(mask=self.tree.root.mask)) for nuc in self.gtr.alphabet]) n_ij = n_ija.sum(axis=-1) self._gtr = GTR.infer(n_ij, T_ia.sum(axis=-1), root_state, fixed_pi=fixed_pi, pc=pc, alphabet=self.gtr.alphabet, logger=self.logger, prof_map = self.gtr.profile_map) if normalized_rate: self.logger("TreeAnc.infer_gtr: setting overall rate to 1.0...", 2) if site_specific: self._gtr.mu /= self._gtr.average_rate().mean() else: self._gtr.mu=1.0 return self._gtr def infer_gtr_iterative(self, max_iter=10, site_specific=False, LHtol=0.1, pc=1.0, normalized_rate=False): """infer GTR model by iteratively estimating ancestral sequences and the GTR model Parameters ---------- max_iter : int, optional maximal number of iterations site_specific : bool, optional use a site specific model LHtol : float, optional stop iteration when LH improvement falls below this cutoff pc : float, optional pseudocount to use normalized_rate : bool, optional set the overall rate to 1 (makes sense when optimizing branch lengths as well) Returns ------- str success/failure code """ self.infer_ancestral_sequences(marginal=True) old_p = np.copy(self.gtr.Pi) old_LH = self.sequence_LH() for i in range(max_iter): self.infer_gtr(site_specific=site_specific, marginal=True, normalized_rate=normalized_rate, pc=pc) self.infer_ancestral_sequences(marginal=True) dp = np.abs(self.gtr.Pi - old_p).mean() if self.gtr.Pi.shape==old_p.shape else np.nan deltaLH = self.sequence_LH() - old_LH old_p = np.copy(self.gtr.Pi) old_LH = self.sequence_LH() self.logger("TreeAnc.infer_gtr_iterative: iteration %d, LH=%1.2f (%1.2f), deltaP=%1.4f"% (i, old_LH, deltaLH, dp), 2) if deltaLH0: slope = (Q[dtavgii] - Q[tavgii]*Q[davgii]/Q[sii]) \ /(Q[tsqii] - Q[tavgii]**2/Q[sii]) else: raise ValueError("No variation in sampling dates! Please specify your clock rate explicitly.") only_intercept=False else: only_intercept=True intercept = (Q[davgii] - Q[tavgii]*slope)/Q[sii] if (Q[tsqii] - Q[tavgii]**2/Q[sii])>0: chisq = 0.5*(Q[dsqii] - Q[davgii]**2/Q[sii] - (Q[dtavgii] - Q[davgii]*Q[tavgii]/Q[sii])**2/(Q[tsqii] - Q[tavgii]**2/Q[sii])) else: chisq = 0.5*(Q[dsqii] - Q[davgii]**2/Q[sii]) if only_intercept: return {'slope':slope, 'intercept':intercept, 'chisq': chisq} estimator_hessian = np.array([[Q[tsqii], Q[tavgii]], [Q[tavgii], Q[sii]]]) return {'slope':slope, 'intercept':intercept, 'chisq':chisq, 'hessian':estimator_hessian, 'cov':np.linalg.inv(estimator_hessian)} class TreeRegression(object): """TreeRegression This class implements an efficient regression method for quantity associated with tips and one that changes in an additive manner along the branches of the tree, e.g. the distance to the root. This implemented algorithm take into account the correlation structure of the data under the assumptions that variance increase linearly along branches as well. """ def __init__(self, tree_in, tip_value = None, branch_value = None, branch_variance = None): """ Parameters ---------- T : (Bio.Phylo.tree) Tree for which the covariances and regression are to be calculated. tip_value : (callable) function that for each tip returns the value to be used in the regression. branch_value : (callable) function that for each node of the tree returns the contribution of this branch to the value of the subtending tips. variance_function : (callable) function that for each node of the tree returns the accumulated variance """ super(TreeRegression, self).__init__() self.tree = tree_in # prep tree for li, l in enumerate(self.tree.get_terminals()): l._ii = np.array([li]) total_bl = 0 for n in self.tree.get_nonterminals(order='postorder'): n._ii = np.concatenate([c._ii for c in n]) n._ii.sort() for c in n: c.up=n total_bl+=c.branch_length self.tree.root.up=None self.N = self.tree.root._ii.shape[0] if tip_value is None: self.tip_value = lambda x:np.mean(x.numdate) if x.is_terminal() else None else: self.tip_value = tip_value if branch_value is None: self.branch_value = lambda x:x.branch_length else: self.branch_value = branch_value if branch_variance is None: # provide a default equal to the branch_length (Poisson) and add # a tenth of the average branch length to avoid numerical instabilities and division by 0. self.branch_variance = lambda x:x.branch_length + 0.05*total_bl/self.N else: self.branch_variance = branch_variance def Cov(self): """ calculate the covariance matrix of the tips assuming variance has accumulated along branches of the tree according to the the provided Returns ------- M : (np.array) covariance matrix with tips arranged standard transersal order. """ # accumulate the covariance matrix by adding 'squares' M = np.zeros((self.N, self.N)) for n in self.tree.find_clades(): if n == self.tree.root: continue M[np.meshgrid(n._ii, n._ii)] += self.branch_variance(n) return M def CovInv(self): """ Inverse of the covariance matrix Returns ------- H : (np.array) inverse of the covariance matrix. """ self.recurse(full_matrix=True) return self.tree.root.cinv def recurse(self, full_matrix=False): """ recursion to calculate inverse covariance matrix Parameters ---------- full_matrix : bool, optional if True, the entire inverse matrix is calculated. otherwise, only the weighing vector. """ for n in self.tree.get_nonterminals(order='postorder'): n_leaves = len(n._ii) if full_matrix: M = np.zeros((n_leaves, n_leaves), dtype=float) r = np.zeros(n_leaves, dtype=float) c_count = 0 for c in n: ssq = self.branch_variance(c) nc = len(c._ii) if c.is_terminal(): if full_matrix: M[c_count, c_count] = 1.0/ssq r[c_count] = 1.0/ssq else: if full_matrix: M[c_count:c_count+nc, c_count:c_count+nc] = c.cinv - ssq*np.outer(c.r,c.r)/(1+ssq*c.s) r[c_count:c_count+nc] = c.r/(1+ssq*c.s) c_count += nc if full_matrix: n.cinv = M n.r = r #M.sum(axis=1) n.s = n.r.sum() def _calculate_averages(self): """ calculate the weighted sums of the tip and branch values and their second moments. """ for n in self.tree.get_nonterminals(order='postorder'): Q = np.zeros(6, dtype=float) for c in n: tv = self.tip_value(c) bv = self.branch_value(c) var = self.branch_variance(c) Q += self.propagate_averages(c, tv, bv, var) n.Q=Q for n in self.tree.find_clades(order='preorder'): O = np.zeros(6, dtype=float) if n==self.tree.root: n.Qtot = n.Q continue for c in n.up: if c==n: continue tv = self.tip_value(c) bv = self.branch_value(c) var = self.branch_variance(c) O += self.propagate_averages(c, tv, bv, var) if n.up!=self.tree.root: c = n.up tv = self.tip_value(c) bv = self.branch_value(c) var = self.branch_variance(c) O += self.propagate_averages(c, tv, bv, var, outgroup=True) n.O = O if not n.is_terminal(): tv = self.tip_value(n) bv = self.branch_value(n) var = self.branch_variance(n) n.Qtot = n.Q + self.propagate_averages(n, tv, bv, var, outgroup=True) def propagate_averages(self, n, tv, bv, var, outgroup=False): """ This function implements the propagation of the means, variance, and covariances along a branch. It operates both towards the root and tips. Parameters ---------- n : (node) the branch connecting this node to its parent is used for propagation tv : (float) tip value. Only required if not is terminal bl : (float) branch value. The increment of the tree associated quantity' var : (float) the variance increment along the branch Returns ------- Q : (np.array) a vector of length 6 containing the updated quantities """ if n.is_terminal() and outgroup==False: if tv is None or np.isinf(tv) or np.isnan(tv): res = np.array([0, 0, 0, 0, 0, 0]) elif var==0: res = np.array([np.inf, np.inf, np.inf, np.inf, np.inf, np.inf]) else: res = np.array([ tv/var, bv/var, tv**2/var, bv*tv/var, bv**2/var, 1.0/var], dtype=float) else: tmpQ = n.O if outgroup else n.Q denom = 1.0/(1+var*tmpQ[sii]) res = np.array([ tmpQ[tavgii]*denom, (tmpQ[davgii] + bv*tmpQ[sii])*denom, tmpQ[tsqii] - var*tmpQ[tavgii]**2*denom, tmpQ[dtavgii] + tmpQ[tavgii]*bv - var*tmpQ[tavgii]*(tmpQ[davgii] + bv*tmpQ[sii])*denom, tmpQ[dsqii] + 2*bv*tmpQ[davgii] + bv**2*tmpQ[sii] - var*(tmpQ[davgii]**2 + 2*bv*tmpQ[davgii]*tmpQ[sii] + bv**2*tmpQ[sii]**2)*denom, tmpQ[sii]*denom] ) return res def explained_variance(self): """calculate standard explained variance Returns ------- float r-value of the root-to-tip distance and time. independent of regression model, but dependent on root choice """ self.tree.root._v=0 for n in self.tree.get_nonterminals(order='preorder'): for c in n: c._v = n._v + self.branch_value(c) raw = np.array([(self.tip_value(n), n._v) for n in self.tree.get_terminals() if self.tip_value(n) is not None]) return np.corrcoef(raw.T)[0,1] def regression(self, slope=None): """regress tip values against branch values Parameters ---------- slope : None, optional if given, the slope isn't optimized Returns ------- dict regression parameters """ self._calculate_averages() clock_model = base_regression(self.tree.root.Q, slope=slope) clock_model['r_val'] = self.explained_variance() return clock_model def find_best_root(self, force_positive=True, slope=None): """ determine the position on the tree that minimizes the bilinear product of the inverse covariance and the data vectors. Returns ------- best_root : (dict) dictionary with the node, the fraction `x` at which the branch is to be split, and the regression parameters """ self._calculate_averages() best_root = {"chisq": np.inf} for n in self.tree.find_clades(): if n==self.tree.root: continue tv = self.tip_value(n) bv = self.branch_value(n) var = self.branch_variance(n) x, chisq = self._optimal_root_along_branch(n, tv, bv, var, slope=slope) if chisq=0 or (force_positive==False): best_root = {"node":n, "split":x} best_root.update(reg) if 'node' not in best_root: print(f"TreeRegression.find_best_root: No valid root found! force_positive={force_positive}") return None if 'hessian' in best_root: # calculate differentials with respect to x deriv = [] n = best_root["node"] tv = self.tip_value(n) bv = self.branch_value(n) var = self.branch_variance(n) for dx in [-0.001, 0.001]: # y needs to be bounded away from 0 and 1 to avoid division by 0 y = min(0.9999, max(0.0001, best_root["split"]+dx)) tmpQ = self.propagate_averages(n, tv, bv*y, var*y) \ + self.propagate_averages(n, tv, bv*(1-y), var*(1-y), outgroup=True) reg = base_regression(tmpQ, slope=slope) deriv.append([y,reg['chisq'], tmpQ[tavgii], tmpQ[davgii]]) estimator_hessian = np.zeros((3,3)) estimator_hessian[:2,:2] = best_root['hessian'] estimator_hessian[2,2] = (deriv[0][1] + deriv[1][1] - 2.0*best_root['chisq'])/(deriv[0][0] - deriv[1][0])**2 # estimator_hessian[2,0] = (deriv[0][2] - deriv[1][2])/(deriv[0][0] - deriv[1][0]) # estimator_hessian[2,1] = (deriv[0][3] - deriv[1][3])/(deriv[0][0] - deriv[1][0]) estimator_hessian[0,2] = estimator_hessian[2,0] estimator_hessian[1,2] = estimator_hessian[2,1] best_root['hessian'] = estimator_hessian best_root['cov'] = np.linalg.inv(estimator_hessian) return best_root def _optimal_root_along_branch(self, n, tv, bv, var, slope=None): from scipy.optimize import minimize_scalar def chisq(x): tmpQ = self.propagate_averages(n, tv, bv*x, var*x) \ + self.propagate_averages(n, tv, bv*(1-x), var*(1-x), outgroup=True) return base_regression(tmpQ, slope=slope)['chisq'] if n.bad_branch or (n!=self.tree.root and n.up.bad_branch): return np.nan, np.inf chisq_prox = np.inf if n.is_terminal() else base_regression(n.Qtot, slope=slope)['chisq'] chisq_dist = np.inf if n==self.tree.root else base_regression(n.up.Qtot, slope=slope)['chisq'] grid = np.linspace(0.001,0.999,6) chisq_grid = np.array([chisq(x) for x in grid]) min_chisq = chisq_grid.min() if chisq_prox<=min_chisq: return 0.0, chisq_prox elif chisq_dist<=min_chisq: return 1.0, chisq_dist else: ii = np.argmin(chisq_grid) bounds = (0 if ii==0 else grid[ii-1], 1.0 if ii==len(grid)-1 else grid[ii+1]) sol = minimize_scalar(chisq, bounds=bounds, method="bounded", options={'xatol':1e-6}) if sol["success"]: return sol['x'], sol['fun'] else: return np.nan, np.inf def optimal_reroot(self, force_positive=True, slope=None, keep_node_order=False): """ determine the best root and reroot the tree to this value. Note that this can change the parent child relations of the tree and values associated with branches rather than nodes (e.g. confidence) might need to be re-evaluated afterwards Parameters ---------- force_positive : bool, optional if True, the search for a root will only consider positive rate estimates slope : float, optional if given, it will find the optimal root given a fixed rate. If slope==0, this corresponds to minimal root-to-tip variance rooting (min_dev) Returns ------- dict regression parameters """ best_root = self.find_best_root(force_positive=force_positive, slope=slope) if best_root is None: raise ValueError("Rerooting failed!") best_node = best_root["node"] x = best_root["split"] if x<1e-5: new_node = best_node elif x>1.0-1e-5: new_node = best_node.up else: # create new node in the branch and root the tree to it new_node = Phylo.BaseTree.Clade() # insert the new node in the middle of the branch # by simple re-wiring the links on the both sides of the branch # and fix the branch lengths new_node.branch_length = best_node.branch_length*(1-x) new_node.up = best_node.up new_node.clades = [best_node] new_node.up.clades = [k if k!=best_node else new_node for k in best_node.up.clades] best_node.branch_length *= x best_node.up = new_node new_node.rtt_regression = best_root self.tree.root_with_outgroup(new_node) if not keep_node_order: self.tree.ladderize() for n in self.tree.get_nonterminals(order='postorder'): for c in n: c.up=n return best_root def clock_plot(self, add_internal=False, ax=None, regression=None, confidence=True, n_sigma = 2, fs=14): """Plot root-to-tip distance vs time as a basic time-tree diagnostic Parameters ---------- add_internal : bool, optional add internal nodes. this will only work if the tree has been dated already ax : None, optional an matplotlib axis to plot into. if non provided, a new figure is opened regression : None, optional a dict containing parameters of a root-to-tip vs time regression as returned by the function base_regression confidence : bool, optional add confidence area to the regression line n_sigma : int, optional number of standard deviations for the confidence area. fs : int, optional fontsize """ import matplotlib.pyplot as plt if ax is None: plt.figure() ax=plt.subplot(111) self.tree.root._v=0 for n in self.tree.get_nonterminals(order='preorder'): for c in n: c._v = n._v + self.branch_value(c) tips = self.tree.get_terminals() internal = self.tree.get_nonterminals() # get values of terminals xi = np.array([self.tip_value(n) for n in tips]) yi = np.array([n._v for n in tips]) ind = np.array([n.bad_branch if hasattr(n, 'bad_branch') else False for n in tips]) if add_internal: xi_int = np.array([n.numdate for n in internal]) yi_int = np.array([n._v for n in internal]) ind_int = np.array([n.bad_branch if hasattr(n, 'bad_branch') else False for n in internal]) if regression: # plot regression line t_mrca = -regression['intercept']/regression['slope'] if add_internal: time_span = np.max(xi_int[~ind_int]) - np.min(xi_int[~ind_int]) x_vals = np.array([max(np.min(xi_int[~ind_int]), t_mrca) - 0.1*time_span, np.max(xi[~ind])+0.05*time_span]) else: time_span = np.max(xi[~ind]) - np.min(xi[~ind]) x_vals = np.array([max(np.min(xi[~ind]), t_mrca) - 0.1*time_span, np.max(xi[~ind]+0.05*time_span)]) # plot confidence interval if confidence and 'cov' in regression: x_vals = np.linspace(x_vals[0], x_vals[1], 100) y_vals = regression['slope']*x_vals + regression['intercept'] dev = n_sigma*np.array([np.sqrt(regression['cov'][:2,:2].dot(np.array([x, 1])).dot(np.array([x,1]))) for x in x_vals]) dev_slope = n_sigma*np.sqrt(regression['cov'][0,0]) ax.fill_between(x_vals, y_vals-dev, y_vals+dev, alpha=0.2) dp = np.array([regression['intercept']/regression['slope']**2,-1./regression['slope']]) dev_rtt = n_sigma*np.sqrt(regression['cov'][:2,:2].dot(dp).dot(dp)) else: dev_rtt = None dev_slope = None ax.plot(x_vals, regression['slope']*x_vals + regression['intercept'], label = r"$y=\alpha + \beta t$"+"\n"+ r"$\beta=$%1.2e"%(regression["slope"]) + ("+/- %1.e"%dev_slope if dev_slope else "") + "\nroot date: %1.1f"%(-regression['intercept']/regression['slope']) + ("+/- %1.2f"%dev_rtt if dev_rtt else "")) ax.scatter(xi[~ind], yi[~ind], label=("tips" if add_internal else None)) if ind.sum(): try: # note: this is treetime specific tmp_x = np.array([np.mean(n.raw_date_constraint) if n.raw_date_constraint else None for n in self.tree.get_terminals()]) ax.scatter(tmp_x[ind], yi[ind], label="ignored tips", c='r') except: pass if add_internal: ax.scatter(xi_int[~ind_int], yi_int[~ind_int], label="internal nodes") ax.set_ylabel('root-to-tip distance', fontsize=fs) ax.set_xlabel('date', fontsize=fs) ax.ticklabel_format(useOffset=False) ax.tick_params(labelsize=fs*0.8) ax.set_ylim([0, 1.1*np.max(yi)]) plt.tight_layout() plt.legend(fontsize=fs*0.8) if __name__ == '__main__': import matplotlib.pyplot as plt import time plt.ion() # tree_file = '../data/H3N2_NA_allyears_NA.20.nwk' # date_file = '../data/H3N2_NA_allyears_NA.20.metadata.csv' tree_file = '../data/ebola.nwk' date_file = '../data/ebola.metadata.csv' T = Phylo.read(tree_file, 'newick') #T.root_with_outgroup('A/Canterbury/58/2000|CY009150|09/05/2000|New_Zealand||H3N2/8-1416') dates = {} with open(date_file, 'r', encoding='utf-8') as ifile: ifile.readline() for line in ifile: if line[0]!='#': fields = line.strip().split(',') dates[fields[0]] = float(fields[1]) for l in T.get_terminals(): l.numdate = dates[l.name] branch_variance = lambda x:(x.branch_length+(0.0005 if x.is_terminal() else 0.0))/19000.0 #branch_variance = lambda x:(x.branch_length+(0.005 if x.is_terminal() else 0.0))/1700.0 #branch_variance = lambda x:1.0 if x.is_terminal() else 0.0 tstart = time.time() mtc = TreeRegression(T, branch_variance = branch_variance) print(time.time()-tstart) reg = mtc.optimal_reroot() print(time.time()-tstart) print(reg) plt.figure() ti = [] rtt = [] T.root.rtt=0 for n in T.get_nonterminals(order='preorder'): for c in n: c.rtt = n.rtt + c.branch_length for l in T.get_terminals(): ti.append(l.numdate) rtt.append(l.rtt) ti = np.array(ti) rtt = np.array(rtt) plt.plot(ti, rtt) plt.plot(ti, reg["slope"]*ti + reg["intercept"]) Phylo.draw(T) treetime-0.11.1/treetime/treetime.py000066400000000000000000001534721447636507100174470ustar00rootroot00000000000000import numpy as np from scipy import optimize as sciopt from Bio import Phylo from . import config as ttconf from . import MissingDataError,UnknownMethodError,NotReadyError,TreeTimeError, TreeTimeUnknownError from .utils import tree_layout from .clock_tree import ClockTree rerooting_mechanisms = ["min_dev", "best", "least-squares"] deprecated_rerooting_mechanisms = {"residual":"least-squares", "res":"least-squares", "min_dev_ML": "min_dev", "ML":"least-squares"} def reduce_time_marginal_argument(input_time_marginal): ''' This function maps deprecated arguments/terms for the timetree inference mode to recommended terms. ''' if input_time_marginal in [False, 'false', 'never']: return 'never' elif input_time_marginal in [True, 'always', 'true']: return 'always' elif input_time_marginal in ['only-final', 'assign']: return 'only-final' elif input_time_marginal == 'confidence-only': return input_time_marginal else: raise UnknownMethodError(f"'{input_time_marginal}' is not a known time marginal argument") class TreeTime(ClockTree): """ TreeTime is a wrapper class to ClockTree that adds additional functionality such as reroot, detection and exclusion of outliers, resolution of polytomies using temporal information, and relaxed molecular clock models """ def __init__(self, *args,**kwargs): """ TreeTime constructor Parameters ----------- *args Arguments to construct ClockTree **kwargs Keyword arguments to construct the GTR model """ super(TreeTime, self).__init__(*args, **kwargs) def run(self, raise_uncaught_exceptions=False, **kwargs): import sys try: return self._run(**kwargs) except TreeTimeError as err: if raise_uncaught_exceptions: raise err else: print(f"ERROR: {err} \n", file=sys.stderr) sys.exit(2) except BaseException as err: import traceback print(traceback.format_exc(), file=sys.stderr) print(f"ERROR: {err} \n ", file=sys.stderr) print("ERROR in TreeTime.run: An error occurred which was not properly handled in TreeTime. If this error persists, please let us know " "by filing a new issue including the original command and the error above at: https://github.com/neherlab/treetime/issues \n", file=sys.stderr) if raise_uncaught_exceptions: raise TreeTimeUnknownError() from err else: sys.exit(2) def _run(self, root=None, infer_gtr=True, relaxed_clock=None, clock_filter_method='residuals', n_iqd = None, resolve_polytomies=True, max_iter=0, Tc=None, fixed_clock_rate=None, time_marginal='never', sequence_marginal=False, branch_length_mode='auto', vary_rate=False, use_covariation=False, tracelog_file=None, method_anc = 'probabilistic', assign_gamma=None, stochastic_resolve=False, **kwargs): """ Run TreeTime reconstruction. Based on the input parameters, it divides the analysis into semi-independent jobs and conquers them one-by-one, gradually optimizing the tree given the temporal constraints and leaf node sequences. Parameters ---------- root : str Try to find better root position on a given tree. If string is passed, the root will be searched according to the specified method. If none, use tree as-is. See :py:meth:`treetime.TreeTime.reroot` for available rooting methods. infer_gtr : bool If True, infer GTR model relaxed_clock : dict If not None, use autocorrelated molecular clock model. Specify the clock parameters as :code:`{slack:, coupling:}` dictionary. n_iqd : float If not None, filter tree nodes which do not obey the molecular clock for the particular tree. The nodes, which deviate more than :code:`n_iqd` interquantile intervals from the molecular clock regression will be marked as 'BAD' and not used in the TreeTime analysis resolve_polytomies : bool If True, attempt to resolve multiple mergers stochastic_resolve : bool (default False) Resolve multiple mergers via a random coalescent tree (True) or via greedy optimization max_iter : int Maximum number of iterations to optimize the tree Tc : float, str If not None, use coalescent model to correct the branch lengths by introducing merger costs. If Tc is float, it is interpreted as the coalescence time scale If Tc is str, it should be one of (:code:`opt`, :code:`const`, :code:`skyline`) fixed_clock_rate : float Fixed clock rate to be used. If None, infer clock rate from the molecular clock. time_marginal : bool, str If False perform joint reconstruction of the divergence times, if True use marginal reconstruction of the divergence times, if 'only_final' (or 'assign') apply the marginal reconstruction only to the last optimization round, if "confidence-only" perform additional round using marginal reconstruction for calculation of confidence intervals but do not update times. sequence_marginal : bool, optional use marginal reconstruction for ancestral sequences branch_length_mode : str Should be one of: :code:`joint`, :code:`marginal`, :code:`input`. If 'input', rely on the branch lengths in the input tree and skip directly to the maximum-likelihood ancestral sequence reconstruction. Otherwise, perform preliminary sequence reconstruction using parsimony algorithm and do branch length optimization vary_rate : bool or float, optional redo the time tree estimation for rates +/- one standard deviation. if a float is passed, it is interpreted as standard deviation, otherwise this standard deviation is estimated from the root-to-tip regression use_covariation : bool, optional default False, if False, rate estimates will be performed using simple regression ignoring phylogenetic covariation between nodes. If vary_rate is True, use_covariation is true by default method_anc: str, optional Which method should be used to reconstruct ancestral sequences. Supported values are "parsimony", "fitch", "probabilistic" and "ml". Default is "probabilistic" assign_gamma: callable, optional function to specify gamma (branch length scaling, local clock rate modifier) for each branch in tree, not compatible with a relaxed clock model **kwargs Keyword arguments needed by the downstream functions Returns ------- TreeTime error/success code : str return value depending on success or error """ # register the specified covaration mode self.use_covariation = use_covariation or (vary_rate and (not type(vary_rate)==float)) if (self.tree is None) or (self.aln is None and self.data.full_length is None): raise MissingDataError("TreeTime.run: ERROR, alignment or tree are missing") if self.aln is None: branch_length_mode='input' self._set_branch_length_mode(branch_length_mode) # determine how to reconstruct and sample sequences seq_kwargs = {"marginal_sequences":sequence_marginal or (self.branch_length_mode=='marginal'), "branch_length_mode": self.branch_length_mode, "sample_from_profile": "root", "prune_short":kwargs.get("prune_short", True), "reconstruct_tip_states":kwargs.get("reconstruct_tip_states", False)} time_marginal_method = reduce_time_marginal_argument(time_marginal) ## for backward compatibility tt_kwargs = {'clock_rate':fixed_clock_rate, 'time_marginal':False if time_marginal_method in ['never', 'only-final', 'confidence-only'] else True} tt_kwargs.update(kwargs) seq_LH = 0 if "fixed_pi" in kwargs: seq_kwargs["fixed_pi"] = kwargs["fixed_pi"] if "do_marginal" in kwargs: time_marginal=kwargs["do_marginal"] if assign_gamma and relaxed_clock: raise UnknownMethodError("assign_gamma and relaxed clock are incompatible arguments") # initially, infer ancestral sequences and infer gtr model if desired if self.branch_length_mode=='input': if self.aln: self.infer_ancestral_sequences(infer_gtr=infer_gtr, marginal=seq_kwargs["marginal_sequences"], **seq_kwargs) if seq_kwargs["prune_short"]: self.prune_short_branches() else: self.optimize_tree(infer_gtr=infer_gtr, max_iter=1, method_anc = method_anc, **seq_kwargs) # optionally reroot the tree either by oldest, best regression or with a specific leaf if n_iqd or root=='clock_filter': if "plot_rtt" in kwargs and kwargs["plot_rtt"]: plot_rtt=True else: plot_rtt=False reroot_mechanism = 'least-squares' if root=='clock_filter' else root self.clock_filter(reroot=reroot_mechanism, method=clock_filter_method, n_iqd=n_iqd, plot=plot_rtt, fixed_clock_rate=fixed_clock_rate) elif root is not None: self.reroot(root=root, clock_rate=fixed_clock_rate) if self.branch_length_mode=='input': if self.aln: self.infer_ancestral_sequences(**seq_kwargs) else: self.optimize_tree(max_iter=1, method_anc = method_anc, **seq_kwargs) # infer time tree and optionally resolve polytomies self.logger("###TreeTime.run: INITIAL ROUND",0) self.make_time_tree(**tt_kwargs) if self.aln: seq_LH = self.tree.sequence_marginal_LH if seq_kwargs['marginal_sequences'] else self.tree.sequence_joint_LH self.LH =[[seq_LH, self.tree.positional_LH, 0]] # if we reroot, repeat rerooting after initial clock-filter/time tree # re-optimize branch length, and update time tree if root is not None and max_iter: self.reroot(root='least-squares' if root=='clock_filter' else root, clock_rate=fixed_clock_rate) self.logger("###TreeTime.run: rerunning timetree after rerooting",0) if self.branch_length_mode!='input': self.optimize_tree(max_iter=0, method_anc = method_anc,**seq_kwargs) self.make_time_tree(**tt_kwargs) # iteratively reconstruct ancestral sequences and re-infer # time tree to ensure convergence. niter = 0 ndiff = 0 # Initialize the tracelog dict attribute self.trace_run = [] self.trace_run.append(self.tracelog_run(niter=0, ndiff=0, n_resolved=0, time_marginal = tt_kwargs['time_marginal'], sequence_marginal = seq_kwargs['marginal_sequences'], Tc=None, tracelog=tracelog_file)) need_new_time_tree=False while niter < max_iter: self.logger("###TreeTime.run: ITERATION %d out of %d iterations"%(niter+1,max_iter),0) # add coalescent prior tmpTc=None if Tc: if Tc=='skyline' and niter0.1: bl_mode = 'input' else: bl_mode = 'joint' self.logger("TreeTime._set_branch_length_mode: maximum branch length is %1.3e, using branch length mode %s"%(max_bl, bl_mode),1) self.branch_length_mode = bl_mode else: self.branch_length_mode = 'input' def clock_filter(self, reroot='least-squares', method='residual', n_iqd=None, plot=False, fixed_clock_rate=None): r''' Labels outlier branches that don't seem to follow a molecular clock and excludes them from subsequent molecular clock estimation and the timetree propagation. Parameters ---------- reroot : str Method to find the best root in the tree (see :py:meth:`treetime.TreeTime.reroot` for options) n_iqd : float Number of iqd intervals. The outlier nodes are those which do not fall into :math:`IQD\cdot n_iqd` interval (:math:`IQD` is the interval between 75\ :sup:`th` and 25\ :sup:`th` percentiles) If None, the default (3) assumed plot : bool If True, plot the results ''' from .clock_filter_methods import residual_filter, local_filter if n_iqd is None: n_iqd = ttconf.NIQD if type(reroot) is list and len(reroot)==1: reroot=str(reroot[0]) if reroot: self.reroot(root='least-squares' if reroot=='best' else reroot, covariation=False, clock_rate=fixed_clock_rate) else: self.get_clock_model(covariation=False, slope=fixed_clock_rate) if method=='residual': bad_branch_count = residual_filter(self, n_iqd) elif method=='local': bad_branch_count = local_filter(self, n_iqd) if bad_branch_count>0.34*self.tree.count_terminals(): self.logger("TreeTime.clock_filter: More than a third of leaves have been excluded by the clock filter. Please check your input data.", 0, warn=True) # reassign bad_branch flags to internal nodes self.prepare_tree() # redo root estimation after outlier removal if reroot: self.reroot(root=reroot, clock_rate=fixed_clock_rate) if plot: self.plot_root_to_tip() return ttconf.SUCCESS def plot_root_to_tip(self, add_internal=False, label=True, ax=None): """ Plot root-to-tip regression Parameters ---------- add_internal : bool If true, plot inte`rnal node positions label : bool If true, label the plots ax : matplotlib axes If not None, use the provided matplotlib axes to plot the results """ Treg = self.setup_TreeRegression() if self.clock_model and 'cov' in self.clock_model: cf = self.clock_model['valid_confidence'] else: cf = False Treg.clock_plot(ax=ax, add_internal=add_internal, confidence=cf, n_sigma=1, regression=self.clock_model) def reroot(self, root='least-squares', force_positive=True, covariation=None, clock_rate=None): """ Find best root and re-root the tree to the new root Parameters ---------- root : str Which method should be used to find the best root. Available methods are: :code:`best`, `least-squares` - minimize squared residual or likelihood of root-to-tip regression :code:`min_dev` - minimize variation of root-to-tip distance :code:`oldest` - reroot on the oldest node :code:`` - reroot to the node with name :code:`` :code:`[, , ...]` - reroot to the MRCA of these nodes force_positive : bool only consider positive rates when searching for the optimal root covariation : bool account for covariation in root-to-tip regression """ if type(root) is list and len(root)==1: root=str(root[0]) if root=='best': root='least-squares' use_cov = self.use_covariation if covariation is None else covariation slope = 0.0 if type(root)==str and root.startswith('min_dev') else clock_rate old_root = self.tree.root self.logger("TreeTime.reroot: with method or node: %s"%root,0) for n in self.tree.find_clades(): n.branch_length=n.mutation_length if (type(root) is str) and \ (root in rerooting_mechanisms or root in deprecated_rerooting_mechanisms): if root in deprecated_rerooting_mechanisms: if "ML" in root: use_cov=True self.logger('TreeTime.reroot: rerooting mechanisms %s has been renamed to %s' %(root, deprecated_rerooting_mechanisms[root]), 1, warn=True) root = deprecated_rerooting_mechanisms[root] self.logger("TreeTime.reroot: rerooting will %s covariance and shared ancestry."%("account for" if use_cov else "ignore"),0) new_root = self._find_best_root(covariation=use_cov, slope = slope, force_positive=force_positive and (not root.startswith('min_dev'))) else: if isinstance(root,Phylo.BaseTree.Clade): new_root = root elif isinstance(root, list): new_root = self.tree.common_ancestor(root) elif root in self._leaves_lookup: new_root = self._leaves_lookup[root] elif root=='oldest': new_root = sorted([n for n in self.tree.get_terminals() if n.raw_date_constraint is not None], key=lambda x:np.mean(x.raw_date_constraint))[0] else: raise UnknownMethodError('TreeTime.reroot -- ERROR: unsupported rooting mechanisms or root not found') #this forces a bifurcating root, as we want. Branch lengths will be reoptimized anyway. #(Without outgroup_branch_length, gives a trifurcating root, but this will mean #mutations may have to occur multiple times.) self.tree.root_with_outgroup(new_root, outgroup_branch_length=new_root.branch_length/2) self.tree.root.clades.sort(key = lambda x:x.count_terminals()) self.get_clock_model(covariation=use_cov, slope = slope) self.logger("TreeTime.reroot: Tree was re-rooted to node " +('new_node' if new_root.name is None else new_root.name), 2) self.tree.root.branch_length = self.one_mutation self.tree.root.clock_length = self.one_mutation self.tree.root.raw_date_constraint = None if hasattr(new_root, 'time_before_present'): self.tree.root.time_before_present = new_root.time_before_present if hasattr(new_root, 'numdate'): self.tree.root.numdate = new_root.numdate # set root.gamma bc root doesn't have a branch_length_interpolator but gamma is needed if not hasattr(self.tree.root, 'gamma'): self.tree.root.gamma = 1.0 for n in self.tree.find_clades(): n.mutation_length = n.branch_length if not hasattr(n, 'clock_length'): n.clock_length = n.branch_length self.prepare_tree() self.get_clock_model(covariation=self.use_covariation, slope=slope) return new_root def resolve_polytomies(self, merge_compressed=False, resolution_threshold=0.05, stochastic_resolve=False): """ Resolve the polytomies on the tree. The function scans the tree, resolves polytomies if present, and re-optimizes the tree with new topology. Note that polytomies are only resolved if that would result in higher likelihood. Sometimes, stretching two or more branches that carry several mutations is less costly than an additional branch with zero mutations (long branches are not stiff, short branches are). Parameters ---------- merge_compressed : bool If True, keep compressed branches as polytomies. Applies to greedy resolve resolution_threshold : float minimal delta LH to consider for polytomy resolution. Otherwise, keep parent as polytomy stochastic_resolve : bool generate a stochastic binary coalescent tree with mutation from the children of a polytomy. Doesn't necessarily resolve the node fully. This step is stochastic and different runs will result in different outcomes. Returns -------- poly_found : int The number of polytomies found """ self.logger("TreeTime.resolve_polytomies: resolving multiple mergers...",1) poly_found=0 if stochastic_resolve is False: self.logger("DEPRECATION WARNING. TreeTime.resolve_polytomies: You are " "resolving polytomies using the old 'greedy' mode. This is not " "well suited for large polytomies. Stochastic resolution will " "become the default in future versions. To switch now, rerun " "with the flag `--stochastic-resolve`. To keep using the greedy method " "in the future, run with `--greedy-resolve` ", 0, warn=True, only_once=True) for n in self.tree.find_clades(): if len(n.clades) > 2: prior_n_clades = len(n.clades) if stochastic_resolve: self.generate_subtree(n) else: self._poly(n, merge_compressed, resolution_threshold=resolution_threshold) poly_found+=prior_n_clades - len(n.clades) obsolete_nodes = [n for n in self.tree.find_clades() if len(n.clades)==1 and n.up is not None] for node in obsolete_nodes: self.logger('TreeTime.resolve_polytomies: remove obsolete node '+node.name,4) if node.up is not None: self.tree.collapse(node) if poly_found: self.logger('TreeTime.resolve_polytomies: introduces %d new nodes'%poly_found,3) else: self.logger('TreeTime.resolve_polytomies: No more polytomies to resolve',3) return poly_found def _poly(self, clade, merge_compressed, resolution_threshold): """ Function to resolve polytomies for a given parent node. If the number of the direct descendants is less than three (not a polytomy), does nothing. Otherwise, for each pair of nodes, assess the possible LH increase which could be gained by merging the two nodes. The increase in the LH is basically the tradeoff between the gain of the LH due to the changing the branch lengths towards the optimal values and the decrease due to the introduction of the new branch with zero optimal length. """ from .branch_len_interpolator import BranchLenInterpolator zero_branch_slope = self.gtr.mu*self.data.full_length def _c_gain(t, n1, n2, parent): """ cost gain if nodes n1, n2 are joined and their parent is placed at time t cost gain = (LH loss now) - (LH loss when placed at time t) NOTE: this cost function ignores the coalescent likelihood. Given the greedy and approximate nature of this calculation, this seems justified. But this entire procedure is not well suited for large polytomies. """ # old - new contributions of child branches cg1 = n1.branch_length_interpolator._func(parent.time_before_present - n1.time_before_present) - n1.branch_length_interpolator._func(t - n1.time_before_present) cg2 = n2.branch_length_interpolator._func(parent.time_before_present - n2.time_before_present) - n2.branch_length_interpolator._func(t - n2.time_before_present) # old - new contribution of additional branch (no old contribution) cg_new = - zero_branch_slope * (parent.time_before_present - t) # loss in LH due to the new branch return -(cg2 + cg1 + cg_new) def cost_gain(n1, n2, parent): """ cost gained if the two nodes would have been connected. """ try: cg = sciopt.minimize_scalar(_c_gain, bounds=[max(n1.time_before_present,n2.time_before_present), parent.time_before_present], method='bounded',args=(n1,n2, parent), options={'xatol':1e-4*self.one_mutation}) return cg['x'], - cg['fun'] except: self.logger("TreeTime._poly.cost_gain: optimization of gain failed", 3, warn=True) return parent.time_before_present, 0.0 def merge_nodes(source_arr, isall=False): mergers = np.array([[cost_gain(n1,n2, clade) if i1 1 + int(isall): # max possible gains of the cost when connecting the nodes: # this is only a rough approximation because it assumes the new node positions # to be optimal new_positions = mergers[:,:,0] cost_gains = mergers[:,:,1] # set zero to large negative value and find optimal pair np.fill_diagonal(cost_gains, -1e11) idxs = np.unravel_index(cost_gains.argmax(),cost_gains.shape) if (idxs[0] == idxs[1]) or cost_gains.max()0])} have mutations." +f" The time window for coalescence is {tmax-t:1.4e}",3) # loop until time collides with the parent node or all but two branches have been dealt with # the remaining two would be the children of the parent while len(branches_alive)+len(branches_to_come)>2 and t advance to next branch if (total_mut_rate + total_coalescent_rate)==0 and len(branches_to_come): branches_alive.append(branches_to_come.pop(0)) t = branches_alive[-1].time_before_present continue # determine the next time step total_rate_inv = 1.0/(total_mut_rate + total_coalescent_rate) dt = exp_dis(total_rate_inv) t+=dt # if the time advanced past the next branch in the branches_to_come list # add this branch to branches alive and re-renter the loop if len(branches_to_come) and t>branches_to_come[0].time_before_present: while len(branches_to_come) and t>branches_to_come[0].time_before_present: branches_alive.append(branches_to_come.pop(0)) # else mutate or coalesce else: # determine whether to mutate or coalesce p = self.rng.random() mut_or_coal = p 2*coupling*(g-g_c) = 2*child.k2 g_c + child.k1 # hence g_c = (coupling*g - 0.5*child.k1)/(coupling+child.k2) # substituting yields for child in node.clades: denom = coupling+child._k2 node._k2 += coupling*(1.0-coupling/denom)**2 + child._k2*coupling**2/denom**2 node._k1 += (coupling*(1.0-coupling/denom)*child._k1/denom \ - coupling*child._k1*child._k2/denom**2 \ + coupling*child._k1/denom) for node in self.tree.find_clades(order='preorder'): if node.up is None: node.gamma = max(0.1, -0.5*node._k1/node._k2) else: if node.up.up is None: g_up = node.up.gamma else: g_up = node.up.branch_length_interpolator.gamma node.branch_length_interpolator.gamma = max(0.1,(coupling*g_up - 0.5*node._k1)/(coupling+node._k2)) def tracelog_run(self, niter=0, ndiff=0, n_resolved=0, time_marginal=False, sequence_marginal=False, Tc=None, tracelog=None): """ Create a dictionary of parameters for the current iteration of the run function. Parameters ---------- niter : int The current iteration. ndiff : int The number of sequence changes. n_resolved : int The number of polytomy changes time_marginal : bool True if marginal position estimation was requested, else False sequence_marginal : bool True if marginal sequence estimation was requested, else False Tc : float, str The coalescent model that was used for the current iteration. tracelog : str The output file to write the trace log to. Returns ------- trace_dict : str A dictionary of parameters for the current iteration. """ # Store the run parameters in a dictionary trace_dict = { 'Sample' : niter, 'ndiff' : ndiff, 'n_resolved' : n_resolved, 'seq_mode' : ('marginal' if sequence_marginal else 'joint') if self.aln else 'no sequences given', 'seq_LH' : (self.tree.sequence_marginal_LH if sequence_marginal else self.tree.sequence_joint_LH) if self.aln else 0, 'pos_mode' : 'marginal' if time_marginal else 'joint', 'pos_LH' : self.tree.positional_LH, 'coal_mode' : Tc, 'coal_LH' : self.tree.coalescent_joint_LH, } # Write the current iteration to a file if tracelog: # Only on the initial round, write the headers if niter == 0: with open(tracelog, "w") as outfile: header = "\t".join(trace_dict.keys()) outfile.write(header + "\n") # Write the parameters with open(tracelog, "a") as outfile: params_str = [str(p) for p in trace_dict.values()] params = "\t".join(params_str) outfile.write(params + "\n") return trace_dict ############################################################################### ### rerooting ############################################################################### def _find_best_root(self, covariation=True, force_positive=True, slope=None, **kwarks): ''' Determine the node that, when the tree is rooted on this node, results in the best regression of temporal constraints and root to tip distances. Parameters ---------- infer_gtr : bool If True, infer new GTR model after re-root covariation : bool account for covariation structure when rerooting the tree force_positive : bool only accept positive evolutionary rate estimates when rerooting the tree ''' for n in self.tree.find_clades(): n.branch_length=n.mutation_length self.logger("TreeTime._find_best_root: searching for the best root position...",2) Treg = self.setup_TreeRegression(covariation=covariation) return Treg.optimal_reroot(force_positive=force_positive, slope=slope, keep_node_order=self.keep_node_order)['node'] def plot_vs_years(tt, step = None, ax=None, confidence=None, ticks=True, selective_confidence=None, **kwargs): ''' Converts branch length to years and plots the time tree on a time axis. Parameters ---------- tt : TreeTime object A TreeTime instance after a time tree is inferred step : int Width of shaded boxes indicating blocks of years. Will be inferred if not specified. To switch off drawing of boxes, set to 0 ax : matplotlib axes Axes to be used to plot, will create new axis if None confidence : tuple, float Draw confidence intervals. This assumes that marginal time tree inference was run. Confidence intervals are either specified as an interval of the posterior distribution like (0.05, 0.95) or as the weight of the maximal posterior region , e.g. 0.9 **kwargs : dict Key word arguments that are passed down to Phylo.draw ''' import matplotlib.pyplot as plt tt.branch_length_to_years() nleafs = tt.tree.count_terminals() if ax is None: fig = plt.figure(figsize=(12,10)) ax = plt.subplot(111) else: fig = None # draw tree if "label_func" not in kwargs: kwargs["label_func"] = lambda x:x.name if (x.is_terminal() and nleafs<30) else "" Phylo.draw(tt.tree, axes=ax, do_show=False, **kwargs) offset = tt.tree.root.numdate - tt.tree.root.branch_length date_range = np.max([n.numdate for n in tt.tree.get_terminals()])-offset # estimate year intervals if not explicitly specified if step is None or (step>0 and date_range/step>100): step = 10**np.floor(np.log10(date_range)) if date_range/step<2: step/=5 elif date_range/step<5: step/=2 step = max(1.0/12,step) # set axis labels if step: dtick = step min_tick = step*(offset//step) extra = dtick if dtick=1: tick_labels = ["%d"%(int(x)) for x in tick_vals] else: tick_labels = ["%1.2f"%(x) for x in tick_vals] ax.set_xlim((0,date_range)) ax.set_xticklabels(tick_labels) ax.set_xlabel('year') ax.set_ylabel('') # put shaded boxes to delineate years if step: ylim = ax.get_ylim() xlim = ax.get_xlim() from matplotlib.patches import Rectangle for yi,year in enumerate(np.arange(np.floor(tick_vals[0]), tick_vals[-1]+.01, step)): pos = year - offset r = Rectangle((pos, ylim[1]-5), step, ylim[0]-ylim[1]+10, facecolor=[0.88+0.04*(1+yi%2)] * 3, edgecolor=[0.8,0.8,0.8]) ax.add_patch(r) if step>=1: if year in tick_vals and pos>=xlim[0] and pos<=xlim[1] and ticks: label_str = "%1.2f"%(step*(year//step)) if step<1 else str(int(year)) ax.text(pos,ylim[0]-0.04*(ylim[1]-ylim[0]), label_str, horizontalalignment='center') if step>=1: ax.set_axis_off() # add confidence intervals to the tree graph -- grey bars if confidence: tree_layout(tt.tree) if not hasattr(tt.tree.root, "marginal_inverse_cdf"): raise NotReadyError("marginal time tree reconstruction required for confidence intervals") elif type(confidence) is float: cfunc = tt.get_max_posterior_region elif len(confidence)==2: cfunc = tt.get_confidence_interval else: raise NotReadyError("confidence needs to be either a float (for max posterior region) or a two numbers specifying lower and upper bounds") for n in tt.tree.find_clades(): if not n.bad_branch and (selective_confidence is None or selective_confidence(n)): pos = cfunc(n, confidence) ax.plot(pos-offset, np.ones(len(pos))*n.ypos, lw=3, c=(0.5,0.5,0.5)) return fig, ax def treetime_to_newick(tt, outf): Phylo.write(tt.tree, outf, 'newick') if __name__=="__main__": pass treetime-0.11.1/treetime/utils.py000066400000000000000000000436311447636507100167640ustar00rootroot00000000000000import os,sys import datetime import pandas as pd import numpy as np from . import TreeTimeError, MissingDataError class DateConversion(object): """ Small container class to store parameters to convert between branch length as it is used in ML computations and the dates of the nodes. It is assumed that the conversion formula is 'length = k*date + b' """ def __init__(self): self.clock_rate = 0 self.intercept = 0 self.chisq = 0 self.r_val = 0 self.cov = None self.sigma = 0 self.valid_confidence = False def __str__(self): if self.cov is not None and self.valid_confidence: dslope = np.sqrt(self.cov[0,0]) outstr = ('Root-Tip-Regression:\n --rate:\t%1.3e +/- %1.2e (one std-dev)\n --chi^2:\t%1.2f\n --r^2: \t%1.2f\n' %(self.clock_rate, dslope, self.chisq**2, self.r_val**2)) else: outstr = ('Root-Tip-Regression:\n --rate:\t%1.3e\n --r^2: \t%1.2f\n' %(self.clock_rate, self.r_val**2)) return outstr @classmethod def from_regression(cls, clock_model): """ Create the conversion object automatically from the tree Parameters ---------- clock_model : dict dictionary as returned from TreeRegression with fields intercept and slope """ dc = cls() dc.clock_rate = clock_model['slope'] dc.intercept = clock_model['intercept'] dc.chisq = clock_model['chisq'] if 'chisq' in clock_model else None dc.valid_confidence = clock_model['valid_confidence'] if 'valid_confidence' in clock_model else False if 'cov' in clock_model and dc.valid_confidence: dc.cov = clock_model['cov'] dc.r_val = clock_model['r_val'] return dc def get_branch_len(self, date1, date2): """ Compute branch length given the dates of the two nodes. Parameters ----------- date1 : int date of the first node (days before present) date2 : int date of the second node (days before present) Returns: -------- branch length : double Branch length, assuming that the dependence between the node date and the node depth in the the tree is linear. """ return abs(date1 - date2) * self.clock_rate def get_time_before_present(self, numdate): """ Convert the numeric date to the branch-len scale """ return (numeric_date() - numdate) * abs(self.clock_rate) def to_years(self, abs_t): """ Convert the time before present measured in branch length units to years """ return abs_t / abs(self.clock_rate) def to_numdate(self, tbp): """ Convert time before present measured in clock rate units to numeric calendar dates """ return numeric_date() - self.to_years(tbp) def numdate_from_dist2root(self, d2r): """ estimate the numerical date based on the distance to root. -> crude dating of internal nodes """ return (d2r-self.intercept)/self.clock_rate def clock_deviation(self, numdate, d2r): """ calculate the deviatio of the """ return (self.numdate_from_dist2root(d2r) - numdate)*self.clock_rate def min_interp(interp_object): """ Find the global minimum of a function represented as an interpolation object. """ try: return interp_object.x[interp_object(interp_object.x).argmin()] except Exception as e: s = "Cannot find minimum of the interpolation object" + str(interp_object.x) + \ "Minimal x: " + str(interp_object.x.min()) + "Maximal x: " + str(interp_object.x.max()) raise e def median_interp(interp_object): """ Find the median of the function represented as an interpolation object. """ new_grid = np.sort(np.concatenate([interp_object.x[:-1] + 0.1*ii*np.diff(interp_object.x) for ii in range(10)]).flatten()) tmp_prop = np.exp(-(interp_object(new_grid)-interp_object.y.min())) tmp_cumsum = np.cumsum(0.5*(tmp_prop[1:]+tmp_prop[:-1])*np.diff(new_grid)) median_index = min(len(tmp_cumsum)-3, max(2,np.searchsorted(tmp_cumsum, tmp_cumsum[-1]*0.5)+1)) return new_grid[median_index] def numeric_date(dt=None): """ Convert datetime object to the numeric date. The numeric date format is YYYY.F, where F is the fraction of the year passed Parameters ---------- dt: datetime.datetime, None date of to be converted. if None, assume today """ from calendar import isleap if dt is None: dt = datetime.datetime.now() days_in_year = 366 if isleap(dt.year) else 365 try: res = dt.year + (dt.timetuple().tm_yday-0.5) / days_in_year except: res = None return res def datetime_from_numeric(numdate): """convert a numeric decimal date to a python datetime object Note that this only works for AD dates since the range of datetime objects is restricted to year>1. Parameters ---------- numdate : float numeric date as in 2018.23 Returns ------- datetime.datetime datetime object """ from calendar import isleap days_in_year = 366 if isleap(int(numdate)) else 365 # add a small number of the time elapsed in a year to avoid # unexpected behavior for values 1/365, 2/365, etc days_elapsed = int(((numdate%1)+1e-10)*days_in_year) date = datetime.datetime(int(numdate),1,1) + datetime.timedelta(days=days_elapsed) return date def datestring_from_numeric(numdate): """convert a numerical date to a formated date string YYYY-MM-DD Parameters ---------- numdate : float numeric date as in 2018.23 Returns ------- str date string YYYY-MM-DD """ try: return datetime.datetime.strftime(datetime_from_numeric(numdate), "%Y-%m-%d") except: year = int(np.floor(numdate)) dt = datetime_from_numeric(1900+(numdate%1)) return "%04d-%02d-%02d"%(year, dt.month, dt.day) def parse_dates(date_file, name_col=None, date_col=None): """ parse dates from the arguments and return a dictionary mapping taxon names to numerical dates. Parameters ---------- date_file : str name of csv/tsv file to parse meta data from name_col : str, optional name of column containing taxon names. If None, will use first column that contains 'name', 'strain', 'accession' date_col : str, optional name of column containing taxon names. If None, will use a column that contains the substring 'date' Returns ------- dict[str, float | list[float]] dictionary mapping taxon names to numeric dates (float year) It will first try to parse date column strings as float, then as min/max pair of floats (e.g. '[2018.2:2018.4]'), then as date strings using pandas.to_datetime and finally as ambiguous date such as 2018-05-XX Numeric date values are returned as float or a list of floats with 2 elements [min, max] if the date is ambiguous. """ print("\nAttempting to parse dates...") dates = {} if not os.path.isfile(date_file): print("\n\tERROR: file %s does not exist, exiting..."%date_file) return dates # separator for the csv/tsv file. If csv, we'll strip extra whitespace around ',' full_sep = '\t' if date_file.endswith('.tsv') else r'\s*,\s*' try: # read the metadata file into pandas dataframe. df = pd.read_csv(date_file, sep=full_sep, engine='python', dtype='str', index_col=False) # check the metadata has strain names in the first column # look for the column containing sampling dates # We assume that the dates might be given either in human-readable format # (e.g. ISO dates), or be already converted to the numeric format. potential_date_columns = [] potential_numdate_columns = [] potential_index_columns = [] # Scan the dataframe columns and find ones which likely to store the # dates for ci,col in enumerate(df.columns): d = df.iloc[0,ci] # strip quotation marks if type(d)==str and d[0] in ['"', "'"] and d[-1] in ['"', "'"]: for i,tmp_d in enumerate(df.iloc[:,ci]): df.iloc[i,ci] = tmp_d.strip(d[0]) if 'date' in col.lower(): potential_date_columns.append((ci, col)) if any([x==col.lower() for x in ['name', 'strain', 'accession']]): potential_index_columns.append((ci, col)) if date_col and date_col not in df.columns: raise MissingDataError("ERROR: specified column for dates does not exist. \n\tAvailable columns are: "\ +", ".join(df.columns)+"\n\tYou specified '%s'"%date_col) if name_col and name_col not in df.columns: raise MissingDataError("ERROR: specified column for the taxon name does not exist. \n\tAvailable columns are: "\ +", ".join(df.columns)+"\n\tYou specified '%s'"%name_col) dates = {} # if a potential numeric date column was found, use it # (use the first, if there are more than one) if not (len(potential_index_columns) or name_col): raise MissingDataError("ERROR: Cannot read metadata: need at least one column that contains the taxon labels." " Looking for the first column that contains 'name', 'strain', or 'accession' in the header.") else: # use the first column that is either 'name', 'strain', 'accession' if name_col is None: index_col = sorted(potential_index_columns)[0][1] else: index_col = name_col print("\tUsing column '%s' as name. This needs match the taxon names in the tree!!"%index_col) if len(potential_date_columns)>=1 or date_col: #try to parse the csv file with dates in the idx column: if date_col is None: date_col = potential_date_columns[0][1] print("\tUsing column '%s' as date."%date_col) for ri, row in df.iterrows(): date_str = row.loc[date_col] k = row.loc[index_col] # try parsing as a float first try: if date_str: dates[k] = float(date_str) else: dates[k] = None continue except ValueError: # try whether the date string can be parsed as [2002.2:2004.3] # to indicate general ambiguous ranges if date_str[0]=='[' and date_str[-1]==']' and len(date_str[1:-1].split(':'))==2: try: dates[k] = [float(x) for x in date_str[1:-1].split(':')] continue except ValueError: pass # try date format parsing 2017-08-12 try: tmp_date = pd.to_datetime(date_str) dates[k] = numeric_date(tmp_date) except ValueError: # try ambiguous date format parsing 2017-XX-XX lower, upper = ambiguous_date_to_date_range(date_str, '%Y-%m-%d') if lower is not None: dates[k] = [numeric_date(x) for x in [lower, upper]] else: raise MissingDataError("ERROR: Metadata file has no column which looks like a sampling date!") if all(v is None for v in dates.values()): raise MissingDataError("ERROR: Cannot parse dates correctly! Check date format.") return dates except TreeTimeError as err: raise err except: raise def ambiguous_date_to_date_range(mydate, fmt="%Y-%m-%d", min_max_year=None): """parse an abiguous date such as 2017-XX-XX to [2017,2017.999] Parameters ---------- mydate : str date string to be parsed fmt : str format descriptor. default is %Y-%m-%d min_max_year : None, optional if date is completely unknown, use this as bounds. Returns ------- tuple upper and lower bounds on the date. return (None, None) if errors """ sep = fmt.split('%')[1][-1] min_date, max_date = {}, {} today = datetime.date.today() for val, field in zip(mydate.split(sep), fmt.split(sep+'%')): f = 'year' if 'y' in field.lower() else ('day' if 'd' in field.lower() else 'month') if 'XX' in val: if f=='year': if min_max_year: min_date[f]=min_max_year[0] if len(min_max_year)>1: max_date[f]=min_max_year[1] elif len(min_max_year)==1: max_date[f]=4000 #will be replaced by 'today' below. else: return None, None elif f=='month': min_date[f]=1 max_date[f]=12 elif f=='day': min_date[f]=1 max_date[f]=31 else: try: min_date[f]=int(val) max_date[f]=int(val) except ValueError: print("Can't parse date string: "+mydate, file=sys.stderr) return None, None max_date['day'] = min(max_date['day'], 31 if max_date['month'] in [1,3,5,7,8,10,12] else 28 if max_date['month']==2 else 30) lower_bound = datetime.date(year=min_date['year'], month=min_date['month'], day=min_date['day']) upper_bound = datetime.date(year=max_date['year'], month=max_date['month'], day=max_date['day']) return (lower_bound, upper_bound if upper_bound","tmp.nwk", "2>", "fasttree_stderr"]) os.system(" ".join(tree_cmd)) return Phylo.read("tmp.nwk", 'newick') def build_newick_raxml(aln_fname, nthreads=2, raxml_bin="raxml", **kwargs): import shutil,os print("Building tree with raxml") from Bio import Phylo, AlignIO AlignIO.write(AlignIO.read(aln_fname, 'fasta'),"temp.phyx", "phylip-relaxed") cmd = raxml_bin + " -f d -T " + str(nthreads) + " -m GTRCAT -c 25 -p 235813 -n tre -s temp.phyx" os.system(cmd) return Phylo.read('RAxML_bestTree.tre', "newick") def build_newick_iqtree(aln_fname, nthreads=2, iqtree_bin="iqtree", iqmodel="HKY", **kwargs): import os from Bio import Phylo, AlignIO print("Building tree with iqtree") aln = None for fmt in ['fasta', 'phylip-relaxed']: try: aln = AlignIO.read(aln_fname, fmt) break except: continue if aln is None: raise ValueError("failed to read alignment for tree building") aln_file = "temp.fasta" seq_names = set() for s in aln: tmp = s.id for c, sub in zip('/|()', 'VWXY'): tmp = tmp.replace(c, '_%s_%s_'%(sub,sub)) if tmp in seq_names: print("A sequence with name {} already exists, skipping....".format(s.id)) continue s.id = tmp s.name = s.id s.description = '' seq_names.add(s.id) AlignIO.write(aln, aln_file, 'fasta') fast_opts = [ "-ninit", "2", "-n", "2", "-me", "0.05" ] call = ["iqtree"] + fast_opts +["-nt", str(nthreads), "-s", aln_file, "-m", iqmodel, ">", "iqtree.log"] os.system(" ".join(call)) T = Phylo.read(aln_file+".treefile", 'newick') for n in T.get_terminals(): tmp = n.name for c, sub in zip('/|()', 'VWXY'): tmp = tmp.replace('_%s_%s_'%(sub,sub), c) n.name = tmp return T def clip(a, min_val, max_val): return np.maximum(min_val, np.minimum(a, max_val)) if __name__ == '__main__': pass treetime-0.11.1/treetime/vcf_utils.py000066400000000000000000000600411447636507100176140ustar00rootroot00000000000000import gzip import numpy as np from collections import defaultdict from textwrap import fill ## Functions to read in and print out VCF files def read_vcf(vcf_file, ref_file=None): """ Reads in a vcf/vcf.gz file and associated reference sequence fasta (to which the VCF file is mapped). Parses mutations, insertions, and deletions and stores them in a nested dict, see 'returns' for the dict structure. Calls with heterozygous values 0/1, 0/2, etc and no-calls (./.) are replaced with Ns at the associated sites. Positions are stored to correspond the location in the reference sequence in Python (numbering is transformed to start at 0) Parameters ---------- vcf_file : string Path to the vcf or vcf.gz file to be read in ref_file : string, optional Path to the fasta reference file to be read in Returns -------- compress_seq : nested dict In the format: :: { 'reference':'AGCTCGA..A', 'sequences': { 'seq1':{4:'A', 7:'-'}, 'seq2':{100:'C'} }, 'insertions': { 'seq1':{4:'ATT'}, 'seq3':{1:'TT', 10:'CAG'} }, 'positions': [1,4,7,10,100...] } references : string String of the reference sequence read from the Fasta, to which the variable sites are mapped sequences : nested dict Dict containing sequence names as keys which map to dicts that have position as key and the single-base mutation (or deletion) as values insertions : nested dict Dict in the same format as the above, which stores insertions and their locations. The first base of the insertion is the same as whatever is currently in that position (Ref if no mutation, mutation in 'sequences' otherwise), so the current base can be directly replaced by the bases held here. positions : list Python list of all positions with a mutation, insertion, or deletion. """ #Programming Note: # Note on VCF Format # ------------------- # 'Insertion where there are also deletions' (special handling) # Ex: # REF ALT Seq1 Seq2 # GC GCC,G 1/1 2/2 # Insertions formatted differently - don't know how many bp match # the Ref (unlike simple insert below). Could be mutations, also. # 'Deletion' # Ex: # REF ALT # GC G # Alt does not have to be 1 bp - any length shorter than Ref. # 'Insertion' # Ex: # REF ALT # A ATT # First base always matches Ref. # 'No indel' # Ex: # REF ALT # A G #define here, so that all sub-functions can access them sequences = defaultdict(dict) insertions = defaultdict(dict) #Currently not used, but kept in case of future use. #TreeTime handles 2-3 base ambig codes, this will allow that. def getAmbigCode(bp1, bp2, bp3=""): bps = [bp1,bp2,bp3] bps.sort() key = "".join(bps) return { 'CT': 'Y', 'AG': 'R', 'AT': 'W', 'CG': 'S', 'GT': 'K', 'AC': 'M', 'AGT': 'D', 'ACG': 'V', 'ACT': 'H', 'CGT': 'B' }[key] #Parses a 'normal' (not hetero or no-call) call depending if insertion+deletion, insertion, #deletion, or single bp subsitution def parseCall(snps, ins, pos, ref, alt): #Insertion where there are also deletions (special handling) if len(ref) > 1 and len(alt)>len(ref): for i in range(len(ref)): #if the pos doesn't match, store in sequences if ref[i] != alt[i]: snps[pos+i] = (alt[i] if alt[i] != '.' else 'N') #'.' = no-call #if about to run out of ref, store rest: if (i+1) >= len(ref): ins[pos+i] = alt[i:] #Deletion elif len(ref) > 1: for i in range(len(ref)): #if ref is longer than alt, these are deletion positions if i+1 > len(alt): snps[pos+i] = '-' #if not, there may be mutations else: if ref[i] != alt[i]: snps[pos+i] = (alt[i] if alt[i] != '.' else 'N') #'.' = no-call #Insertion elif len(alt) > 1: ins[pos] = alt #No indel else: snps[pos] = alt #Parses a 'bad' (hetero or no-call) call depending on what it is def parseBadCall(gen, snps, ins, pos, ref, ALT): #Deletion # REF ALT Seq1 Seq2 Seq3 # GCC G 1/1 0/1 ./. # Seq1 (processed by parseCall, above) will become 'G--' # Seq2 will become 'GNN' # Seq3 will become 'GNN' if len(ref) > 1: #Deleted part becomes Ns if gen[0] == '0' or gen[0] == '.': if gen[0] == '0': #if het, get first bp alt = str(ALT[int(gen[2])-1]) else: #if no-call, there is no alt, so just put Ns after 1st ref base alt = ref[0] for i in range(len(ref)): #if ref is longer than alt, these are deletion positions if i+1 > len(alt): snps[pos+i] = 'N' #if not, there may be mutations else: if ref[i] != alt[i]: snps[pos+i] = (alt[i] if alt[i] != '.' else 'N') #'.' = no-call #If not deletion, need to know call type #if het, see if proposed alt is 1bp mutation elif gen[0] == '0': alt = str(ALT[int(gen[2])-1]) if len(alt)==1: #alt = getAmbigCode(ref,alt) #if want to allow ambig alt = 'N' #if you want to disregard ambig snps[pos] = alt #else a het-call insertion, so ignore. #else it's a no-call; see if all alts have a length of 1 #(meaning a simple 1bp mutation) elif len(ALT)==len("".join(ALT)): alt = 'N' snps[pos] = alt #else a no-call insertion, so ignore. #House code is *much* faster than pyvcf because we don't care about all info #about coverage, quality, counts, etc, which pyvcf goes to effort to parse #(and it's not easy as there's no standard ordering). Custom code can completely #ignore all of this. import gzip from Bio import SeqIO import numpy as np nsamp = 0 posLoc = 0 refLoc = 0 altLoc = 0 sampLoc = 9 #Use different openers depending on whether compressed opn = gzip.open if vcf_file.endswith(('.gz', '.GZ')) else open with opn(vcf_file, mode='rt') as f: for line in f: if line[0] != '#': #actual data - most common so first in 'if-list'! dat = line.strip().split('\t') POS = int(dat[posLoc]) REF = dat[refLoc] ALT = dat[altLoc].split(',') calls = np.array(dat[sampLoc:]) #get samples that differ from Ref at this site recCalls = {} for sname, sa in zip(samps, calls): if ':' in sa: #if proper VCF file (followed by quality/coverage info) gt = sa.split(':')[0] else: #if 'pseudo' VCF file (nextstrain output, or otherwise stripped) gt = sa # convert haploid calls to pseudo diploid if gt == '0': gt = '0/0' elif gt == '1': gt = '1/1' elif gt == '.': gt = './.' #ignore if ref call: '.' or '0/0', depending on VCF if ('/' in gt and gt != '0/0') or ('|' in gt and gt != '0|0'): recCalls[sname] = gt #store the position and the alt for seq, gen in recCalls.items(): ref = REF pos = POS-1 #VCF numbering starts from 1, but Reference seq numbering #will be from 0 because it's python! #Accepts only calls that are 1/1, 2/2 etc. Rejects hets and no-calls if gen[0] != '0' and gen[2] != '0' and gen[0] != '.' and gen[2] != '.': alt = str(ALT[int(gen[0])-1]) #get the index of the alternate if seq not in sequences.keys(): sequences[seq] = {} parseCall(sequences[seq],insertions[seq], pos, ref, alt) #If is heterozygote call (0/1) or no call (./.) else: #alt will differ here depending on het or no-call, must pass original parseBadCall(gen, sequences[seq],insertions[seq], pos, ref, ALT) elif line[0] == '#' and line[1] == 'C': #header line, get all the information header = line.strip().split('\t') posLoc = header.index("POS") refLoc = header.index('REF') altLoc = header.index('ALT') sampLoc = header.index('FORMAT')+1 samps = header[sampLoc:] samps = [ x.strip() for x in samps ] #ensure no leading/trailing spaces nsamp = len(samps) #else you are a comment line, ignore. #Gather all variable positions positions = set() for seq, muts in sequences.items(): positions.update(muts.keys()) #One or more seqs are same as ref! (No non-ref calls) So haven't been 'seen' yet if nsamp > len(sequences): missings = set(samps).difference(sequences.keys()) for s in missings: sequences[s] = {} if ref_file: refSeq = SeqIO.read(ref_file, format='fasta') refSeq = refSeq.upper() #convert to uppercase to avoid unknown chars later refSeqStr = str(refSeq.seq) else: refSeqStr = None compress_seq = {'reference':refSeqStr, 'sequences': sequences, 'insertions': insertions, 'positions': sorted(positions)} return compress_seq def write_vcf(tree_dict, file_name):#, compress=False): """ Writes out a VCF-style file (which seems to be minimally handleable by vcftools and pyvcf) of the alignment. This is created from a dict in a similar format to what's created by :py:meth:`treetime.vcf_utils.read_vcf` Positions of variable sites are transformed to start at 1 to match VCF convention. Parameters ---------- tree_dict: nested dict A nested dict with keys 'sequence' 'reference' and 'positions', as is created by :py:meth:`treetime.TreeAnc.get_tree_dict` file_name: str File to which the new VCF should be written out. File names ending with '.gz' will result in the VCF automatically being gzipped. """ # Programming Logic Note: # # For a sequence like: # Pos 1 2 3 4 5 6 # Ref A C T T A C # Seq1 A C - - - G # # In a dict it is stored: # Seq1:{3:'-', 4:'-', 5:'-', 6:'G'} (Numbering from 1 for simplicity) # # In a VCF it needs to be: # POS REF ALT Seq1 # 2 CTTA C 1/1 # 6 C G 1/1 # # If a position is deleted (pos 3), need to get invariable position preceeding it # # However, in alternative case, the base before a deletion is mutant, so need to check # that next position isn't a deletion (as otherwise won't be found until after the # current single bp mutation is written out) # # When deleted position found, need to gather up all adjacent mutant positions with deletions, # but not include adjacent mutant positions that aren't deletions (pos 6) # # Don't run off the 'end' of the position list if deletion is the last thing to be included # in the VCF file sequences = tree_dict['sequences'] ref = tree_dict['reference'] positions = tree_dict['positions'] def handleDeletions(i, pi, pos, ref, delete, pattern): refb = ref[pi] if delete: #Need to get the position before i-=1 #As we'll next go to this position again pi-=1 pos = pi+1 refb = ref[pi] #re-get pattern pattern = [] for k,v in sequences.items(): try: pattern.append(sequences[k][pi]) except KeyError: pattern.append(ref[pi]) pattern = np.array(pattern).astype('U') sites = [] sites.append(pattern) #Gather all positions affected by deletion - but don't run off end of position list while (i+1) < len(positions) and positions[i+1] == pi+1: i+=1 pi = positions[i] pattern = [] for k,v in sequences.items(): try: pattern.append(sequences[k][pi]) except KeyError: pattern.append(ref[pi]) pattern = np.array(pattern).astype('U') #Stops 'greedy' behaviour from adding mutations adjacent to deletions if any(pattern == '-'): #if part of deletion, append sites.append(pattern) refb = refb+ref[pi] else: #this is another mutation next to the deletion! i-=1 #don't append, break this loop #Rotate them into 'calls' align = np.asarray(sites).T #Get rid of '-', and put '.' for calls that match ref #Only removes trailing '-'. This breaks VCF convension, but the standard #VCF way of handling this* is really complicated, and the situation is rare. #(*deletions and mutations at the same locations) fullpat = [] for pt in align: gp = len(pt)-1 while pt[gp] == '-': pt[gp] = '' gp-=1 pat = "".join(pt) if pat == refb: fullpat.append('.') else: fullpat.append(pat) pattern = np.array(fullpat) return i, pi, pos, refb, pattern #prepare the header of the VCF & write out header=["#CHROM","POS","ID","REF","ALT","QUAL","FILTER","INFO","FORMAT"]+list(sequences.keys()) opn = gzip.open if file_name.endswith(('.gz', '.GZ')) else open out_file = opn(file_name, 'w') out_file.write( "##fileformat=VCFv4.2\n"+ "##source=NextStrain\n"+ "##FORMAT=\n") out_file.write("\t".join(header)+"\n") vcfWrite = [] errorPositions = [] explainedErrors = 0 #Why so basic? Because we sometimes have to back up a position! i=0 while i < len(positions): #Get the 'pattern' of all calls at this position. #Look out specifically for current (this pos) or upcoming (next pos) deletions #But also distinguish these two, as handled differently. pi = positions[i] pos = pi+1 #change numbering to match VCF, not python, for output refb = ref[pi] #reference base at this position delete = False #deletion at this position - need to grab previous base (invariable) deleteGroup = False #deletion at next position (mutation at this pos) - do not need to get prev base #try/except is much more efficient than 'if' statements for constructing patterns, #as on average a 'variable' location will not be variable for any given sequence pattern = [] #pattern2 gets the pattern at next position to check for upcoming deletions #it's more efficient to get both here rather than loop through sequences twice! pattern2 = [] for k,v in sequences.items(): try: pattern.append(sequences[k][pi]) except KeyError: pattern.append(ref[pi]) try: pattern2.append(sequences[k][pi+1]) except KeyError: try: pattern2.append(ref[pi+1]) except IndexError: pass pattern = np.array(pattern).astype('U') pattern2 = np.array(pattern2).astype('U') #If a deletion here, need to gather up all bases, and position before if any(pattern == '-'): if pos != 1: deleteGroup = True delete = True else: #If theres a deletion in 1st pos, VCF files do not handle this well. #Proceed keeping it as '-' for alt (violates VCF), but warn user to check output. #(This is rare) print(fill("WARNING: You have a deletion in the first position of your" " alignment. VCF format does not handle this well. Please check" " the output to ensure it is correct.")) else: #If a deletion in next pos, need to gather up all bases if any(pattern2 == '-'): deleteGroup = True #If deletion, treat affected bases as 1 'call': if delete or deleteGroup: i, pi, pos, refb, pattern = handleDeletions(i, pi, pos, ref, delete, pattern) #If no deletion, replace ref with '.', as in VCF format else: pattern[pattern==refb] = '.' #Get the list of ALTs - minus any '.'! uniques = np.unique(pattern) uniques = uniques[np.where(uniques!='.')] #Convert bases to the number that matches the ALT j=1 for u in uniques: pattern[np.where(pattern==u)[0]] = str(j) j+=1 #Now convert these calls to #/# (VCF format) calls = [ j+"/"+j if j!='.' else '.' for j in pattern ] #What if there's no variation at a variable site?? #This can happen when sites are modified by TreeTime - see below. printPos = True if len(uniques)==0: #If we expect it (it was made constant by TreeTime), it's fine. if 'inferred_const_sites' in tree_dict and pi in tree_dict['inferred_const_sites']: explainedErrors += 1 printPos = False #and don't output position to the VCF else: #If we don't expect, raise an error errorPositions.append(str(pi)) #Write it out - Increment positions by 1 so it's in VCF numbering #If no longer variable, and explained, don't write it out if printPos: output = ["MTB_anc", str(pos), ".", refb, ",".join(uniques), ".", "PASS", ".", "GT"] + calls vcfWrite.append("\t".join(output)) i+=1 #Note: The number of 'inferred_const_sites' passed back by TreeTime will often be longer #than the number of 'site that were made constant' that prints below. This is because given the site: # Ref Alt Seq # G A AANAA #This will be converted to 'AAAAA' and listed as an 'inferred_const_sites'. However, for VCF #purposes, because the site is 'variant' against the ref, it is variant, as expected, and so #won't be counted in the below list, which is only sites removed from the VCF. if 'inferred_const_sites' in tree_dict and explainedErrors != 0: print(fill("Sites that were constant except for ambiguous bases were made" + " constant by TreeTime. This happened {} times. These sites are".format(explainedErrors) + " now excluded from the VCF.")) if len(errorPositions) != 0: print ("\n***WARNING: vcf_utils.py") print(fill("\n{} sites were found that had no alternative bases.".format(str(len(errorPositions)))+ " If this data has been run through TreeTime and contains ambiguous bases," " try calling get_tree_dict with var_ambigs=True to see if this clears the error.")) print(fill("\nAlternative causes:" "\n- Not all sequences in your alignment are in the tree" " (if you are running TreeTime via commandline this is most likely)" "\n- In TreeTime, can be caused by overwriting variants in tips with small branch lengths (debug)" "\n\nThese are the positions affected (numbering starts at 0):")) print(fill(", ".join(errorPositions))) out_file.write("\n".join(vcfWrite)) out_file.close() def process_sparse_alignment(aln, ref, ambiguous_char): return process_alignment_dictionary(aln, ref, ambiguous_char) def process_alignment_dictionary(aln, ref, ambiguous_char): """ prepare the dictionary specifying differences from a reference sequence to construct the reduced alignment with variable sites only. NOTE: - sites can be constant but different from the reference - sites can be constant plus a ambiguous sites assigns ------- - self.nonref_positions: at least one sequence is different from ref Returns ------- reduced_alignment_const reduced alignment accounting for non-variable postitions alignment_patterns_const dict pattern -> (pos in reduced alignment, list of pos in full alignment) variable_positions list of variable positions needed to construct remaining """ # number of sequences in alignment nseq = len(aln) inv_map = defaultdict(list) for k,v in aln.items(): for pos, bs in v.items(): inv_map[pos].append(bs) nonref_positions = np.sort(list(inv_map.keys())) constant_up_to_ambiguous = [] nonref_const = [] nonref_alleles = [] ambiguous_const = [] variable_pos = [] for pos, bs in inv_map.items(): #loop over positions and patterns bases = list(np.unique(bs)) if len(bs) == nseq: #every sequence is different from reference if (len(bases)<=2 and ambiguous_char in bases) or len(bases)==1: # all sequences different from reference, but only one state # (other than ambiguous_char) in column nonref_const.append(pos) if len(bases)==1: nonref_alleles.append(bases[0]) else: nonref_alleles.append([x for x in bases if x!=ambiguous_char][0]) if ambiguous_char in bases: #keep track of sites 'made constant' constant_up_to_ambiguous.append(pos) else: # at least two non-reference alleles variable_pos.append(pos) else: # not every sequence different from reference if len(bases)==1 and bases[0]==ambiguous_char: ambiguous_const.append(pos) constant_up_to_ambiguous.append(pos) #keep track of sites 'made constant' else: # at least one non ambiguous non-reference allele not in # every sequence variable_pos.append(pos) refMod = np.copy(ref) # place constant non reference positions by their respective allele refMod[nonref_const] = nonref_alleles # mask variable positions states = np.unique(refMod) refMod[variable_pos] = '.' # for each base in the gtr, make constant alignment pattern and # assign it to all const positions in the modified reference sequence constant_columns = [] constant_patterns = {} for base in states: if base==ambiguous_char: continue p = np.repeat(base, nseq) pos = list(np.where(refMod==base)[0]) #if the alignment doesn't have a const site of this base, don't add! (ex: no '----' site!) if len(pos): constant_patterns["".join(p.astype('U'))] = [len(constant_columns), pos] constant_columns.append(p) return {"constant_columns": constant_columns, "constant_patterns": constant_patterns, "variable_positions": variable_pos, "nonref_positions": nonref_positions, "constant_up_to_ambiguous": constant_up_to_ambiguous} treetime-0.11.1/treetime/wrappers.py000066400000000000000000001171751447636507100174740ustar00rootroot00000000000000import os, shutil, sys import numpy as np import pandas as pd from textwrap import fill from Bio import Phylo from Bio import __version__ as bioversion from . import TreeAnc, GTR, TreeTime from . import utils from . import TreeTimeError, MissingDataError, UnknownMethodError from .treetime import reduce_time_marginal_argument from .CLI_io import * def assure_tree(params, tmp_dir='treetime_tmp'): """ Function that attempts to load a tree and build it from the alignment if no tree is provided. """ if params.tree is None: params.tree = os.path.basename(params.aln)+'.nwk' print("No tree given: inferring tree") utils.tree_inference(params.aln, params.tree, tmp_dir = tmp_dir) if os.path.isdir(tmp_dir): shutil.rmtree(tmp_dir) try: tt = TreeAnc(params.tree) except (ValueError, TreeTimeError, MissingDataError) as e: print(e) print("Tree loading/building failed.") return 1 return 0 def create_gtr(params): """ parse the arguments referring to the GTR model and return a GTR structure """ model = params.gtr gtr_params = params.gtr_params custom_gtr = params.custom_gtr if custom_gtr: if model not in ['custom', 'infer']: print(f'Warning: you specified a GTR model `{model}` and a custom gtr path `{custom_gtr}`. TreeTime will load the custom model and ignore the parameter `--gtr {model}`.') if os.path.isfile(custom_gtr): gtr = GTR.from_file(custom_gtr) params.gtr = 'custom' return gtr else: raise ValueError(f"File with custom GTR model `{custom_gtr}` does not exist!") if model == 'infer': gtr = GTR.standard('jc', alphabet='aa' if params.aa else 'nuc') else: try: kwargs = {} if gtr_params is not None: for param in gtr_params: keyval = param.split('=') if len(keyval)!=2: continue if keyval[0] in ['pis', 'pi', 'Pi', 'Pis']: keyval[0] = 'pi' keyval[1] = list(map(float, keyval[1].split(','))) elif keyval[0] not in ['alphabet']: keyval[1] = float(keyval[1]) kwargs[keyval[0]] = keyval[1] else: print ("GTR params are not specified. Creating GTR model with default parameters") gtr = GTR.standard(model, **kwargs) except KeyError as e: print("\nUNKNOWN SUBSTITUTION MODEL\n") raise e return gtr def scan_homoplasies(params): """ the function implementing treetime homoplasies """ if assure_tree(params, tmp_dir='homoplasy_tmp'): return 1 gtr = create_gtr(params) ########################################################################### ### READ IN VCF ########################################################################### #sets ref and fixed_pi to None if not VCF aln, ref, fixed_pi = read_if_vcf(params) is_vcf = True if ref is not None else False ########################################################################### ### ANCESTRAL RECONSTRUCTION ########################################################################### treeanc = TreeAnc(params.tree, aln=aln, ref=ref, gtr=gtr, verbose=1, fill_overhangs=True, rng_seed=params.rng_seed) if treeanc.aln is None: # if alignment didn't load, exit return 1 if is_vcf: L = len(ref) + params.const else: L = treeanc.data.full_length + params.const N_seq = len(treeanc.aln) N_tree = treeanc.tree.count_terminals() if params.rescale!=1.0: for n in treeanc.tree.find_clades(): n.branch_length *= params.rescale n.mutation_length = n.branch_length print("read alignment from file %s with %d sequences of length %d"%(params.aln,N_seq,L)) print("read tree from file %s with %d leaves"%(params.tree,N_tree)) print("\ninferring ancestral sequences...") ndiff = treeanc.infer_ancestral_sequences('ml', infer_gtr=params.gtr=='infer', marginal=False, fixed_pi=fixed_pi) print("...done.") if is_vcf: treeanc.recover_var_ambigs() ########################################################################### ### analysis of reconstruction ########################################################################### from collections import defaultdict from scipy.stats import poisson offset = 0 if params.zero_based else 1 if params.drms: DRM_info = read_in_DRMs(params.drms, offset) drms = DRM_info['DRMs'] # construct dictionaries gathering mutations and positions mutations = defaultdict(list) positions = defaultdict(list) terminal_mutations = defaultdict(list) for n in treeanc.tree.find_clades(): if n.up is None: continue if len(n.mutations): for (a,pos, d) in n.mutations: if '-' not in [a,d] and 'N' not in [a,d]: mutations[(a,pos+offset,d)].append(n) positions[pos+offset].append(n) if n.is_terminal(): for (a,pos, d) in n.mutations: if '-' not in [a,d] and 'N' not in [a,d]: terminal_mutations[(a,pos+offset,d)].append(n) # gather homoplasic mutations by strain mutation_by_strain = defaultdict(list) for n in treeanc.tree.get_terminals(): for a,pos,d in n.mutations: if pos+offset in positions and len(positions[pos+offset])>1: if '-' not in [a,d] and 'N' not in [a,d]: mutation_by_strain[n.name].append([(a,pos+offset,d), len(positions[pos])]) # total_branch_length is the expected number of substitutions # corrected_branch_length is the expected number of observable substitutions # (probability of an odd number of substitutions at a particular site) total_branch_length = treeanc.tree.total_branch_length() corrected_branch_length = np.sum([np.exp(-x.branch_length)*np.sinh(x.branch_length) for x in treeanc.tree.find_clades()]) corrected_terminal_branch_length = np.sum([np.exp(-x.branch_length)*np.sinh(x.branch_length) for x in treeanc.tree.get_terminals()]) # make histograms and sum mutations in different categories multiplicities = np.bincount([len(x) for x in mutations.values()]) total_mutations = np.sum([len(x) for x in mutations.values()]) multiplicities_terminal = np.bincount([len(x) for x in terminal_mutations.values()]) terminal_mutation_count = np.sum([len(x) for x in terminal_mutations.values()]) multiplicities_positions = np.bincount([len(x) for x in positions.values()]) multiplicities_positions[0] = L - np.sum(multiplicities_positions) ########################################################################### ### Output the distribution of times particular mutations are observed ########################################################################### print("\nThe TOTAL tree length is %1.3e and %d mutations were observed." %(total_branch_length,total_mutations)) print("Of these %d mutations,"%total_mutations +"".join(['\n\t - %d occur %d times'%(n,mi) for mi,n in enumerate(multiplicities) if n])) # additional optional output this for terminal mutations only if params.detailed: print("\nThe TERMINAL branch length is %1.3e and %d mutations were observed." %(corrected_terminal_branch_length,terminal_mutation_count)) print("Of these %d mutations,"%terminal_mutation_count +"".join(['\n\t - %d occur %d times'%(n,mi) for mi,n in enumerate(multiplicities_terminal) if n])) ########################################################################### ### Output the distribution of times mutations at particular positions are observed ########################################################################### print("\nOf the %d positions in the genome,"%L +"".join(['\n\t - %d were hit %d times (expected %1.2f)'%(n,mi,L*poisson.pmf(mi,1.0*total_mutations/L)) for mi,n in enumerate(multiplicities_positions) if n])) # compare that distribution to a Poisson distribution with the same mean p = poisson.pmf(np.arange(3*len(multiplicities_positions)),1.0*total_mutations/L) print("\nlog-likelihood difference to Poisson distribution with same mean: %1.3e"%( - L*np.sum(p*np.log(p+1e-100)) + np.sum(multiplicities_positions*np.log(p[:len(multiplicities_positions)]+1e-100)))) ########################################################################### ### Output the mutations that are observed most often ########################################################################### if params.drms: print("\n\nThe ten most homoplasic mutations are:\n\tmut\tmultiplicity\tDRM details (gene drug AAmut)") mutations_sorted = sorted(mutations.items(), key=lambda x:len(x[1])-0.1*x[0][1]/L, reverse=True) for mut, val in mutations_sorted[:params.n]: if len(val)>1: print("\t%s%d%s\t%d\t%s"%(mut[0], mut[1], mut[2], len(val), " ".join([drms[mut[1]]['gene'], drms[mut[1]]['drug'], drms[mut[1]]['alt_base'][mut[2]]]) if mut[1] in drms else "")) else: break else: print("\n\nThe ten most homoplasic mutations are:\n\tmut\tmultiplicity") mutations_sorted = sorted(mutations.items(), key=lambda x:len(x[1])-0.1*x[0][1]/L, reverse=True) for mut, val in mutations_sorted[:params.n]: if len(val)>1: print("\t%s%d%s\t%d"%(mut[0], mut[1], mut[2], len(val))) else: break # optional output specifically for mutations on terminal branches if params.detailed: if params.drms: print("\n\nThe ten most homoplasic mutation on terminal branches are:\n\tmut\tmultiplicity\tDRM details (gene drug AAmut)") terminal_mutations_sorted = sorted(terminal_mutations.items(), key=lambda x:len(x[1])-0.1*x[0][1]/L, reverse=True) for mut, val in terminal_mutations_sorted[:params.n]: if len(val)>1: print("\t%s%d%s\t%d\t%s"%(mut[0], mut[1], mut[2], len(val), " ".join([drms[mut[1]]['gene'], drms[mut[1]]['drug'], drms[mut[1]]['alt_base'][mut[2]]]) if mut[1] in drms else "")) else: break else: print("\n\nThe ten most homoplasic mutation on terminal branches are:\n\tmut\tmultiplicity") terminal_mutations_sorted = sorted(terminal_mutations.items(), key=lambda x:len(x[1])-0.1*x[0][1]/L, reverse=True) for mut, val in terminal_mutations_sorted[:params.n]: if len(val)>1: print("\t%s%d%s\t%d"%(mut[0], mut[1], mut[2], len(val))) else: break ########################################################################### ### Output strains that have many homoplasic mutations ########################################################################### # TODO: add statistical criterion if params.detailed: if params.drms: print("\n\nTaxons that carry positions that mutated elsewhere in the tree:\n\ttaxon name\t#of homoplasic mutations\t# DRM") mutation_by_strain_sorted = sorted(mutation_by_strain.items(), key=lambda x:len(x[1]), reverse=True) for name, val in mutation_by_strain_sorted[:params.n]: if len(val): print("\t%s\t%d\t%d"%(name, len(val), len([mut for mut,l in val if mut[1] in drms]))) else: print("\n\nTaxons that carry positions that mutated elsewhere in the tree:\n\ttaxon name\t#of homoplasic mutations") mutation_by_strain_sorted = sorted(mutation_by_strain.items(), key=lambda x:len(x[1]), reverse=True) for name, val in mutation_by_strain_sorted[:params.n]: if len(val): print("\t%s\t%d"%(name, len(val))) return 0 def arg_time_trees(params): """ This function takes command line arguments and runs treetime on each of the two trees provided. """ from .arg import parse_arg, setup_arg arg_params = parse_arg(params.trees[0], params.trees[1], params.alignments[0], params.alignments[1], params.mccs, fill_overhangs=not params.keep_overhangs) dates = utils.parse_dates(params.dates, date_col=params.date_column, name_col=params.name_column) root = None if params.keep_root else params.reroot for i,(tree,mask) in enumerate(zip(arg_params['trees'], arg_params['masks'])): outdir = get_outdir(params, f'_ARG-treetime') gtr = create_gtr(params) tt = setup_arg(tree, arg_params['alignment'], arg_params['combined_mask'], mask, dates, arg_params['MCCs'], gtr=gtr, verbose=params.verbose, fill_overhangs=not params.keep_overhangs, fixed_clock_rate = params.clock_rate, reroot=root) run_timetree(tt, params, outdir, tree_suffix=f"_{i+1}", prune_short=False, method_anc=params.method_anc) def timetree(params): """ this function implements the regular treetime time tree estimation """ dates = utils.parse_dates(params.dates, date_col=params.date_column, name_col=params.name_column) if len(dates)==0: print("No valid dates -- exiting.") return 1 if assure_tree(params, tmp_dir='timetree_tmp'): print("No tree -- exiting.") return 1 outdir = get_outdir(params, '_treetime') gtr = create_gtr(params) aln, ref, fixed_pi = read_if_vcf(params) ########################################################################### ### SET-UP and RUN ########################################################################### if params.aln is None and params.sequence_length is None: print("one of arguments '--aln' and '--sequence-length' is required.", file=sys.stderr) return 1 myTree = TreeTime(dates=dates, tree=params.tree, ref=ref, aln=aln, gtr=gtr, seq_len=params.sequence_length, verbose=params.verbose, fill_overhangs=not params.keep_overhangs, branch_length_mode = params.branch_length_mode, rng_seed=params.rng_seed) return run_timetree(myTree, params, outdir) def run_timetree(myTree, params, outdir, tree_suffix='', prune_short=True, method_anc='probabilistic'): ''' this function abstracts the time tree estimation that is used for regular treetime inference and for arg time tree inference. ''' ########################################################################### ### READ IN VCF ########################################################################### #sets ref and fixed_pi to None if not VCF aln, ref, fixed_pi = read_if_vcf(params) is_vcf = True if ref is not None else False branch_length_mode = params.branch_length_mode #variable-site-only trees can have big branch lengths, the auto setting won't work. if is_vcf or (params.aln and params.sequence_length): if branch_length_mode == 'auto': branch_length_mode = 'joint' infer_gtr = params.gtr=='infer' myTree.tip_slack=params.tip_slack if not myTree.one_mutation: print("TreeTime setup failed, exiting") return 1 # coalescent model options try: coalescent = float(params.coalescent) except: if params.coalescent in ['opt', 'const', 'skyline']: coalescent = params.coalescent else: raise TreeTimeError("unknown coalescent model specification, has to be either " "a float, 'opt', 'const' or 'skyline' -- exiting") # coalescent rates faster than the time to one mutation can lead to numerical issues if type(coalescent)==float and coalescent>0 and coalescent0.5*n_observed_states: print("More than half of discrete states missing from the weights file") print("Weights read from file are:", weights) raise MissingDataError("More than half of discrete states missing from the weights file") unique_states=sorted(unique_states) # make a map from states (excluding missing data) to characters in the alphabet # note that gap character '-' is chr(45) and will never be included here reverse_alphabet = {state:chr(65+i) for i,state in enumerate(unique_states) if state!=missing_data} alphabet = list(reverse_alphabet.values()) # construct a look up from alphabet character to states letter_to_state = {v:k for k,v in reverse_alphabet.items()} # construct the vector with weights to be used as equilibrium frequency if weight_dict is not None: mean_weight = np.mean(list(weight_dict.values())) weights = np.array([weight_dict[letter_to_state[c]] if letter_to_state[c] in weight_dict else mean_weight for c in alphabet], dtype=float) weights/=weights.sum() # consistency checks if len(alphabet)<2: print("mugration: only one or zero states found -- this doesn't make any sense", file=sys.stderr) return None, None, None n_states = len(alphabet) missing_char = chr(65+n_states) reverse_alphabet[missing_data]=missing_char letter_to_state[missing_char]=missing_data ########################################################################### ### construct gtr model ########################################################################### # set up dummy matrix W = np.ones((n_states,n_states), dtype=float) mugration_GTR = GTR.custom(pi = weights, W=W, alphabet = np.array(alphabet)) mugration_GTR.profile_map[missing_char] = np.ones(n_states) mugration_GTR.ambiguous=missing_char ########################################################################### ### set up treeanc ########################################################################### treeanc = TreeAnc(tree, gtr=mugration_GTR, verbose=verbose, ref='A', convert_upper=False, one_mutation=0.001, rng_seed=rng_seed) treeanc.use_mutation_length = False pseudo_seqs = {n.name: {0:reverse_alphabet[traits[n.name]] if n.name in traits else missing_char} for n in treeanc.tree.get_terminals()} valid_seq = np.array([s[0]!=missing_char for s in pseudo_seqs.values()]) print("Assigned discrete traits to %d out of %d taxa.\n"%(np.sum(valid_seq),len(valid_seq))) treeanc.aln = pseudo_seqs try: ndiff = treeanc.infer_ancestral_sequences(method='ml', infer_gtr=True, store_compressed=False, pc=pc, marginal=True, normalized_rate=False, fixed_pi=weights, reconstruct_tip_states=True) treeanc.optimize_gtr_rate() except TreeTimeError as e: print("\nAncestral reconstruction failed, please see above for error messages and/or rerun with --verbose 4\n") raise e for i in range(iterations): treeanc.infer_gtr(marginal=True, normalized_rate=False, pc=pc, fixed_pi=weights) treeanc.optimize_gtr_rate() if sampling_bias_correction: treeanc.gtr.mu *= sampling_bias_correction treeanc.infer_ancestral_sequences(infer_gtr=False, store_compressed=False, marginal=True, normalized_rate=False, reconstruct_tip_states=True) return treeanc, letter_to_state, reverse_alphabet def mugration(params): """ implementing treetime mugration """ ########################################################################### ### Parse states ########################################################################### if os.path.isfile(params.states): states = pd.read_csv(params.states, sep='\t' if params.states[-3:]=='tsv' else ',', skipinitialspace=True) else: print("file with states does not exist") return 1 outdir = get_outdir(params, '_mugration') if params.name_column: if params.name_column in states.columns: taxon_name = params.name_column else: print("Error: specified column '%s' for taxon name not found in meta data file with columns: "%params.name_column + " ".join(states.columns)) return 1 elif 'name' in states.columns: taxon_name = 'name' elif 'strain' in states.columns: taxon_name = 'strain' elif 'accession' in states.columns: taxon_name = 'accession' else: taxon_name = states.columns[0] print("Using column '%s' as taxon name. This needs to match the taxa in the tree!"%taxon_name) if params.attribute: if params.attribute in states.columns: attr = params.attribute else: print("The specified attribute was not found in the metadata file "+params.states, file=sys.stderr) print("Available columns are: "+", ".join(states.columns), file=sys.stderr) return 1 else: attr = states.columns[1] print("Attribute for mugration inference was not specified. Using "+attr, file=sys.stderr) leaf_to_attr = {x[taxon_name]:str(x[attr]) for xi, x in states.iterrows() if x[attr]!=params.missing_data and x[attr]} mug, letter_to_state, reverse_alphabet = reconstruct_discrete_traits(params.tree, leaf_to_attr, missing_data=params.missing_data, pc=params.pc, sampling_bias_correction=params.sampling_bias_correction, verbose=params.verbose, weights=params.weights, rng_seed=params.rng_seed) if mug is None: print("Mugration inference failed, check error messages above and your input data.") return 1 unique_states = sorted(letter_to_state.values()) ########################################################################### ### output ########################################################################### print("\nCompleted mugration model inference of attribute '%s' for"%attr,params.tree) basename = get_basename(params, outdir) gtr_name = basename + 'GTR.txt' with open(gtr_name, 'w', encoding='utf-8') as ofile: ofile.write('Character to attribute mapping:\n') for state in unique_states: ofile.write(' %s: %s\n'%(reverse_alphabet[state], state)) ofile.write('\n\n'+str(mug.gtr)+'\n') print("\nSaved inferred mugration model as:", gtr_name) terminal_count = 0 for n in mug.tree.find_clades(): n.confidence=None # due to a bug in older versions of biopython that truncated filenames in nexus export # we truncate them by hand and make them unique. if n.is_terminal() and len(n.name)>40 and bioversion<"1.69": n.name = n.name[:35]+'_%03d'%terminal_count terminal_count+=1 n.comment= '&%s="'%attr + letter_to_state[n.cseq[0]] +'"' if params.confidence: conf_name = basename+'confidence.csv' with open(conf_name, 'w', encoding='utf-8') as ofile: ofile.write('#name, '+', '.join(mug.gtr.alphabet)+'\n') for n in mug.tree.find_clades(): ofile.write(n.name + ', '+', '.join([str(x) for x in n.marginal_profile[0]])+'\n') print("Saved table with ancestral state confidences as:", conf_name) # write tree to file outtree_name = basename+'annotated_tree.nexus' Phylo.write(mug.tree, outtree_name, 'nexus') print("Saved annotated tree as:", outtree_name) print("---Done!\n") return 0 def estimate_clock_model(params): """ implementing treetime clock """ if assure_tree(params, tmp_dir='clock_model_tmp'): return 1 dates = utils.parse_dates(params.dates, date_col=params.date_column, name_col=params.name_column) if len(dates)==0: return 1 outdir = get_outdir(params, '_clock') ########################################################################### ### READ IN VCF ########################################################################### #sets ref and fixed_pi to None if not VCF aln, ref, fixed_pi = read_if_vcf(params) is_vcf = True if ref is not None else False ########################################################################### ### ESTIMATE ROOT (if requested) AND DETERMINE TEMPORAL SIGNAL ########################################################################### if params.aln is None and params.sequence_length is None: print("one of arguments '--aln' and '--sequence-length' is required.", file=sys.stderr) return 1 basename = get_basename(params, outdir) try: myTree = TreeTime(dates=dates, tree=params.tree, aln=aln, gtr='JC69', verbose=params.verbose, seq_len=params.sequence_length, ref=ref, rng_seed=params.rng_seed) except TreeTimeError as e: print("\nTreeTime setup failed. Please see above for error messages and/or rerun with --verbose 4\n") raise e myTree.tip_slack=params.tip_slack if params.clock_filter: n_bad = [n.name for n in myTree.tree.get_terminals() if n.bad_branch] myTree.clock_filter(n_iqd=params.clock_filter, reroot=params.reroot or 'least-squares', method=params.clock_filter_method) n_bad_after = [n.name for n in myTree.tree.get_terminals() if n.bad_branch] if len(n_bad_after)>len(n_bad): print("The following leaves don't follow a loose clock and " "will be ignored in rate estimation:\n\t" +"\n\t".join(set(n_bad_after).difference(n_bad))) if not params.keep_root: # reroot to optimal root, this assigns clock_model to myTree if params.covariation: # this requires branch length estimates myTree.run(root="least-squares", max_iter=0, use_covariation=params.covariation) try: res = myTree.reroot(params.reroot, force_positive=not params.allow_negative_rate) except UnknownMethodError as e: print("ERROR: unknown root or rooting mechanism!") raise e myTree.get_clock_model(covariation=params.covariation) else: myTree.get_clock_model(covariation=params.covariation) d2d = utils.DateConversion.from_regression(myTree.clock_model) print('\n',d2d) print(fill('The R^2 value indicates the fraction of variation in' 'root-to-tip distance explained by the sampling times.' 'Higher values corresponds more clock-like behavior (max 1.0).')+'\n') print(fill('The rate is the slope of the best fit of the date to' 'the root-to-tip distance and provides an estimate of' 'the substitution rate. The rate needs to be positive!' 'Negative rates suggest an inappropriate root.')+'\n') print('\nThe estimated rate and tree correspond to a root date:') if params.covariation: reg = myTree.clock_model dp = np.array([reg['intercept']/reg['slope']**2,-1./reg['slope']]) droot = np.sqrt(reg['cov'][:2,:2].dot(dp).dot(dp)) print('\n--- root-date:\t %3.2f +/- %1.2f (one std-dev)\n\n'%(-d2d.intercept/d2d.clock_rate, droot)) else: print('\n--- root-date:\t %3.2f\n\n'%(-d2d.intercept/d2d.clock_rate)) if not params.keep_root: # write rerooted tree to file outtree_name = basename+'rerooted.newick' Phylo.write(myTree.tree, outtree_name, 'newick') print("--- re-rooted tree written to \n\t%s\n"%outtree_name) table_fname = basename+'rtt.csv' with open(table_fname, 'w', encoding='utf-8') as ofile: ofile.write("#Dates of nodes that didn't have a specified date are inferred from the root-to-tip regression.\n") ofile.write("name, date, root-to-tip distance, clock-deviation\n") for n in myTree.tree.get_terminals(): if hasattr(n, "raw_date_constraint") and (n.raw_date_constraint is not None): clock_deviation = d2d.clock_deviation(np.mean(n.raw_date_constraint), n.dist2root) if np.isscalar(n.raw_date_constraint): tmp_str = str(n.raw_date_constraint) elif len(n.raw_date_constraint): tmp_str = str(n.raw_date_constraint[0])+'-'+str(n.raw_date_constraint[1]) else: tmp_str = '' ofile.write("%s, %s, %f, %f\n"%(n.name, tmp_str, n.dist2root, clock_deviation)) else: ofile.write("%s, %f, %f, 0.0\n"%(n.name, d2d.numdate_from_dist2root(n.dist2root), n.dist2root)) for n in myTree.tree.get_nonterminals(order='preorder'): ofile.write("%s, %f, %f, 0.0\n"%(n.name, d2d.numdate_from_dist2root(n.dist2root), n.dist2root)) print("--- wrote dates and root-to-tip distances to \n\t%s\n"%table_fname) ########################################################################### ### PLOT AND SAVE RESULT ########################################################################### plot_rtt(myTree, outdir+params.plot_rtt) return 0