/* * Taxon.java * * Copyright (c) 2002-2015 Alexei Drummond, Andrew Rambaut and Marc Suchard * * This file is part of BEAST. * See the NOTICE file distributed with this work for additional * information regarding copyright ownership and licensing. * * BEAST is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * BEAST is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with BEAST; if not, write to the * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, * Boston, MA 02110-1301 USA */ package dr.evolution.util; import dr.util.Attributable; import dr.util.Identifiable; import java.util.ArrayList; import java.util.Iterator; /** * Class for data about a taxon. * * @version $Id: Taxon.java,v 1.24 2006/09/05 13:29:34 rambaut Exp $ * * @author Andrew Rambaut * @author Alexei Drummond */ public class Taxon implements Attributable, Identifiable, Comparable<Taxon> { public Taxon(String id) { setId(id); } /** * Sets a date for this taxon. */ public void setDate(Date date) { setAttribute("date", date); addDateToTimeScale(date); } /** * @return a date for this taxon. */ public Date getDate() { Object date = getAttribute("date"); if (date != null && date instanceof Date) { return (Date)date; } return null; } /** * @return a height for this taxon. * This gets the height from the globally defined timescale of dates for all Taxa. */ public double getHeight() { Object date = getAttribute("date"); if (date != null && date instanceof Date) { return getHeightFromDate((Date)date); } return 0.0; } /** * Sets a location for this taxon. */ public void setLocation(Location location) { setAttribute("location", location); } /** * @return a location for this taxon. */ public Location getLocation() { Object location = getAttribute("location"); if (location != null && location instanceof Location) { return (Location)location; } return null; } // ************************************************************** // Attributable IMPLEMENTATION // ************************************************************** private Attributable.AttributeHelper attributes = null; /** * Sets an named attribute for this object. * @param name the name of the attribute. * @param value the new value of the attribute. */ public void setAttribute(String name, Object value) { if (attributes == null) attributes = new Attributable.AttributeHelper(); attributes.setAttribute(name, value); } /** * @return an object representing the named attributed for this object. * @param name the name of the attribute of interest. */ public Object getAttribute(String name) { if (attributes == null) return null; else return attributes.getAttribute(name); } /** * if attributes == null, return false * @param name attribute name * @return boolean whether contains attribute by given its name */ public boolean containsAttribute(String name) { return attributes != null && attributes.containsAttribute(name); } /** * @return an iterator of the attributes that this object has. */ public Iterator<String> getAttributeNames() { if (attributes == null) return new ArrayList<String>().iterator(); else return attributes.getAttributeNames(); } // ************************************************************** // Identifiable IMPLEMENTATION // ************************************************************** protected String id = null; /** * @return the id. */ public String getId() { return id; } /** * Sets the id. */ public void setId(String id) { this.id = id; } public String toString() { return getId(); } @Override public boolean equals(final Object o) { return getId().equals(((Taxon)o).getId()); } @Override public int hashCode() { return getId().hashCode(); } // ************************************************************** // Comparable IMPLEMENTATION // ************************************************************** public int compareTo(Taxon o) { return getId().compareTo(o.getId()); } private static void addDateToTimeScale(Date date) { if (date != null && (mostRecentDate == null || date.after(mostRecentDate))) { mostRecentDate = date; timeScale = null; } } public static double getHeightFromDate(Date date) { if (timeScale == null) { Date mostRecent = mostRecentDate; if (mostRecent == null) { mostRecent = dr.evolution.util.Date.createRelativeAge(0.0, date.getUnits()); } timeScale = new TimeScale(mostRecent.getUnits(), true, mostRecent.getAbsoluteTimeValue()); } return timeScale.convertTime(date.getTimeValue(), date); } public static Date getMostRecentDate() { return mostRecentDate; } private static dr.evolution.util.Date mostRecentDate = null; private static TimeScale timeScale = null; }