package beast.evolution.speciation; import java.util.ArrayList; import java.util.List; import beast.core.CalculationNode; import beast.core.Description; import beast.core.Input; import beast.evolution.tree.Tree; @Description("Finds height of highest tree among a set of trees") public class TreeTopFinder extends CalculationNode { final public Input<List<Tree>> treeInputs = new Input<>("tree", "set of trees to search among", new ArrayList<>()); List<Tree> trees; double oldHeight; double height; @Override public void initAndValidate() { oldHeight = Double.NaN; trees = treeInputs.get(); height = calcHighestTreeHeight(); } public double getHighestTreeHeight() { return calcHighestTreeHeight(); } private double calcHighestTreeHeight() { double top = 0; for (Tree tree : trees) { top = Math.max(tree.getRoot().getHeight(), top); } return top; } @Override protected boolean requiresRecalculation() { double top = calcHighestTreeHeight(); if (top != height) { height = top; return true; } return false; } @Override protected void store() { oldHeight = height; super.store(); } @Override protected void restore() { height = oldHeight; super.restore(); } }