phylotree
Version:
A JavaScript library for developing applications and interactive visualizations involving [phylogenetic trees](https://en.wikipedia.org/wiki/Phylogenetic_tree), written as an extension of the [D3](http://d3js.org) [hierarchy layout](https://github.com/d3/
70 lines (60 loc) • 2.33 kB
JavaScript
import * as d3 from "d3";
import { isLeafNode } from "./nodes";
const default_date_converter = d3.timeParse("%Y%m%d");
const default_regexp = /([0-9]{4}).?([0-9]{2}).?([0-9]{2})$/g;
const default_date_getter = function(node) {
if (isLeafNode(node)) {
if ("name" in node) {
let location = default_regexp.exec(node.name);
if (location) {
return location[1] + location[2] + location[3];
}
}
}
return null;
};
/*
* Extracts dates from nodes using a provided callback (defaults supplied),
* and also converts them to decimal dates; missing dates are allowed; if desired, missing dates
* can throw exceptions
*
* @param tree : the tree object
*
* @param date_getter : a function that extracts date strings from nodes (e.g. by parsing the name),
* default is to extract from the end of the node name, using [YYYY] optional sep [MM] optional sep [DD] format;
* default is implemented in phylotree_extensions.extract_dates.date_getter ()
*
* @param date_converter : if provided, will be used to parse the date string; default is %Y%m%d implemented in
* phylotree_extensions.extract_dates.date_converter
*
*
* @return tree with date-annotated nodes, i.e. each node will have
*
* n.date_value (date object, e.g. 2018-08-17); null for missing
* n.decimal_date_value (decimal object, e.g. 2018.72)
*
*/
const extract_dates = function(tree, date_getter, date_converter=default_date_converter) {
date_getter = date_getter || default_date_getter;
tree.traverse_and_compute(function(n) {
var d_string = date_getter(n);
if (d_string) {
try {
n.data.date_value = date_converter(d_string);
var full_year = n.data.date_value.getFullYear();
var year_start = new Date(full_year, 0, 1),
year_start_p1 = new Date(full_year + 1, 0, 1);
n.data.decimal_date_value =
full_year +
(n.data.date_value - year_start) / (year_start_p1 - year_start);
return;
} catch (e) {
// for conversion failures
}
}
n.data.date_value = null;
n.data.decimal_date_value = null;
});
return tree;
};
export default extract_dates;