/* * AscertainedSitePatternsParser.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.evoxml; import dr.evolution.alignment.Alignment; import dr.evolution.alignment.AscertainedSitePatterns; import dr.evolution.alignment.PatternList; import dr.evolution.util.TaxonList; import dr.xml.*; import dr.util.Citable; import java.util.logging.Logger; /** * Package: AscertainedSitePatternsParser * Description: * <p/> * <p/> * Created by * Alexander V. Alekseyenko (alexander.alekseyenko@gmail.com) * Date: Mar 10, 2008 * Time: 3:06:52 PM */ public class AscertainedSitePatternsParser extends AbstractXMLObjectParser { public static final String APATTERNS = "ascertainedPatterns"; public static final String FROM = "from"; public static final String TO = "to"; public static final String EVERY = "every"; public static final String TAXON_LIST = "taxonList"; public static final String INCLUDE = "includePatterns"; public static final String EXCLUDE = "excludePatterns"; public String getParserName() { return APATTERNS; } public Object parseXMLObject(XMLObject xo) throws XMLParseException { Alignment alignment = (Alignment) xo.getChild(Alignment.class); XMLObject xoc; TaxonList taxa = null; int from = -1; int to = -1; int every = xo.getAttribute(EVERY, 1); if (every <= 0) throw new XMLParseException("illegal 'every' attribute in patterns element"); int startInclude = -1; int stopInclude = -1; int startExclude = -1; int stopExclude = -1; if (xo.hasAttribute(FROM)) { from = xo.getIntegerAttribute(FROM) - 1; if (from < 0) throw new XMLParseException("illegal 'from' attribute in patterns element"); } if (xo.hasAttribute(TO)) { to = xo.getIntegerAttribute(TO) - 1; if (to < 0 || to < from) throw new XMLParseException("illegal 'to' attribute in patterns element"); } if (xo.hasChildNamed(TAXON_LIST)) { taxa = (TaxonList) xo.getElementFirstChild(TAXON_LIST); } if (from > alignment.getSiteCount()) throw new XMLParseException("illegal 'from' attribute in patterns element"); if (to > alignment.getSiteCount()) throw new XMLParseException("illegal 'to' attribute in patterns element"); if (from < 0) from = 0; if (to < 0) to = alignment.getSiteCount() - 1; // if (xo.hasAttribute(XMLParser.ID)) { Logger.getLogger("dr.evoxml").info("Creating ascertained site patterns '" + xo.getId() + "' from positions " + Integer.toString(from + 1) + "-" + Integer.toString(to + 1) + " of alignment '" + alignment.getId() + "'"); if (every > 1) { Logger.getLogger("dr.evoxml").info(" only using every " + every + " site"); } // } if (xo.hasChildNamed(INCLUDE)) { xoc = xo.getChild(INCLUDE); if (xoc.hasAttribute(FROM) && xoc.hasAttribute(TO)) { startInclude = xoc.getIntegerAttribute(FROM) - 1; stopInclude = xoc.getIntegerAttribute(TO); } else { throw new XMLParseException("both from and to attributes are required for includePatterns"); } if (startInclude < 0 || stopInclude < startInclude) { throw new XMLParseException("invalid 'from' and 'to' attributes in includePatterns"); } Logger.getLogger("dr.evoxml").info("\tAscertainment: Patterns in columns " + (startInclude + 1) + " to " + (stopInclude) + " are only possible. "); } if (xo.hasChildNamed(EXCLUDE)) { xoc = xo.getChild(EXCLUDE); if (xoc.hasAttribute(FROM) && xoc.hasAttribute(TO)) { startExclude = xoc.getIntegerAttribute(FROM) - 1; stopExclude = xoc.getIntegerAttribute(TO); } else { throw new XMLParseException("both from and to attributes are required for excludePatterns"); } if (startExclude < 0 || stopExclude < startExclude) { throw new XMLParseException("invalid 'from' and 'to' attributes in includePatterns"); } Logger.getLogger("dr.evoxml").info("\tAscertainment: Patterns in columns " + (startExclude + 1) + " to " + (stopExclude) + " are not possible. "); } AscertainedSitePatterns patterns = new AscertainedSitePatterns(alignment, taxa, from, to, every, startInclude, stopInclude, startExclude, stopExclude); Logger.getLogger("dr.evoxml").info("\tThere are " + patterns.getPatternCount() + " patterns in total."); Logger.getLogger("dr.evoxml").info("\tPlease cite:\n" + Citable.Utils.getCitationString(patterns)); return patterns; } public XMLSyntaxRule[] getSyntaxRules() { return rules; } private XMLSyntaxRule[] rules = new XMLSyntaxRule[]{ AttributeRule.newIntegerRule(FROM, true, "The site position to start at, default is 1 (the first position)"), AttributeRule.newIntegerRule(TO, true, "The site position to finish at, must be greater than <b>" + FROM + "</b>, default is length of given alignment"), AttributeRule.newIntegerRule(EVERY, true, "Determines how many sites are selected. A value of 3 will select every third site starting from <b>" + FROM + "</b>, default is 1 (every site)"), new ElementRule(TAXON_LIST, new XMLSyntaxRule[]{new ElementRule(TaxonList.class)}, true), new ElementRule(Alignment.class), new ContentRule("<includePatterns from=\"Z\" to=\"X\"/>"), new ContentRule("<excludePatterns from=\"Z\" to=\"X\"/>") }; public String getParserDescription() { return "A weighted list of the unique site patterns (unique columns) in an alignment."; } public Class getReturnType() { return PatternList.class; } }