/* Copyright (C) 2009 Diego Darriba This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program 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 General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ package es.uvigo.darwin.prottest.selection.printer; import static es.uvigo.darwin.prottest.global.ProtTestConstants.IMPORTANCE_PRECISSION; import java.util.Collections; import es.uvigo.darwin.prottest.model.Model; import es.uvigo.darwin.prottest.selection.AIC; import es.uvigo.darwin.prottest.selection.AICc; import es.uvigo.darwin.prottest.selection.BIC; import es.uvigo.darwin.prottest.selection.DT; import es.uvigo.darwin.prottest.selection.InformationCriterion; import es.uvigo.darwin.prottest.util.StatFramework; import es.uvigo.darwin.prottest.util.collection.ModelCollection; import es.uvigo.darwin.prottest.util.comparator.LKComparator; import es.uvigo.darwin.prottest.util.logging.ProtTestLogger; import es.uvigo.darwin.prottest.util.printer.ProtTestFormattedOutput; /** * Utility to print application data into loggers. */ public abstract class PrintFramework { /** * Prints the models sorted by a concrete information criterion. */ public final void printModelsSorted( InformationCriterion informationCriterion) { int fieldLength = 15; int numberOfFields = 5; int lineLength = fieldLength * numberOfFields; Model bestModel = informationCriterion.getBestModel(); ModelCollection models = informationCriterion.getModelCollection(); String columns[] = new String[5]; columns[0] = "Model"; columns[1] = "delta" + informationCriterion.getCriterionName(); columns[2] = informationCriterion.getCriterionName(); columns[3] = informationCriterion.getCriterionName() + "w"; columns[4] = "-lnL"; println(""); println(ProtTestFormattedOutput.space(lineLength, '*')); println("Best model according to " + informationCriterion.getCriterionName() + ": " + bestModel.getModelName()); double confPercent = informationCriterion.getConfidenceInterval() * 100; println("Confidence Interval: " + confPercent); println(ProtTestFormattedOutput.space(lineLength, '*')); for (int i = 0; i < numberOfFields; i++) { print(columns[i]); print(ProtTestFormattedOutput.space( fieldLength - columns[i].length(), ' ')); } println(""); println(ProtTestFormattedOutput.space(lineLength, '-')); for (Model model : models) { print(model.getModelName()); print(ProtTestFormattedOutput.space(fieldLength - model.getModelName().length(), ' ')); String decimal; decimal = ProtTestFormattedOutput.getDecimalString( informationCriterion.get(model).getDeltaValue(), 2); print(decimal); print(ProtTestFormattedOutput.space(fieldLength - decimal.length(), ' ')); decimal = ProtTestFormattedOutput.getDecimalString( informationCriterion.get(model).getValue(), 2); print(decimal); print(ProtTestFormattedOutput.space(fieldLength - decimal.length(), ' ')); decimal = ProtTestFormattedOutput.getDecimalString( informationCriterion.get(model).getWeightValue(), 2); print(decimal); print(ProtTestFormattedOutput.space(fieldLength - decimal.length(), ' ')); decimal = ProtTestFormattedOutput.getDecimalString( -1 * model.getLk(), 2); print(decimal); print(ProtTestFormattedOutput.space(fieldLength - decimal.length(), ' ')); println(""); } println(ProtTestFormattedOutput.space(lineLength, '-')); println(ProtTestFormattedOutput.space(lineLength, '-')); printRelativeImportance(informationCriterion); printModelAveragedEstimation(informationCriterion); } protected static void print(String text) { ProtTestLogger.getDefaultLogger().info(text); } protected static void println(String text) { ProtTestLogger.getDefaultLogger().infoln(text); } /** * Prints the comparison over the 7 frameworks. */ public static void printFrameworksComparison(ModelCollection models) { boolean includeI, includeG, includeIG, includeF; includeI = includeG = includeIG = includeF = false; double[] aic = new double[models.size()]; double[] aicc = new double[models.size()]; double[] bic = new double[models.size()]; double[] dt = new double[models.size()]; String[] modelNames = new String[models.size()]; InformationCriterion aicS = new AIC(models, 1.0, 0); InformationCriterion aiccS = new AICc(models, 1.0, models.getAlignment().getSiteCount()); InformationCriterion bicS = new BIC(models, 1.0, models.getAlignment().getSiteCount()); InformationCriterion dtS = new DT(models, 1.0, models.getAlignment().getSiteCount()); Collections.sort(models, new LKComparator()); for (int i = 0; i < models.size(); i++) { Model model = models.get(i); includeI |= model.isInv(); includeG |= model.isGamma(); includeIG |= model.isInv() && model.isGamma(); includeF |= model.isPlusF(); modelNames[i] = model.getModelName(); aicc[i] = aiccS.get(model).getValue(); dt[i] = dtS.get(model).getValue(); bic[i] = bicS.get(model).getValue(); aic[i] = aicS.get(model).getValue(); } StatFramework aicF, aiccF, bicF, dtF; aicF = new StatFramework(aicS, "AIC", "AIC"); aiccF = new StatFramework(aiccS, "AICc", "second-order AIC"); bicF = new StatFramework(bicS, "BIC", "BIC"); dtF = new StatFramework(dtS, "DT", "DT"); // Hala, ahora a imprimir: println(ProtTestFormattedOutput.space(100, '-')); println("Table: Weights(Ranking) of the candidate models under the different frameworks"); println(ProtTestFormattedOutput.space(100, '-')); println("model AIC AICc BIC DT"); String model__, tmp; for (int i = 0; i < models.size(); i++) { model__ = aicF.getModelName(i); print(model__ + ProtTestFormattedOutput.space(15 - model__.length(), ' ')); tmp = ProtTestFormattedOutput.getDecimalString( aicF.getWeight(model__), 2) + "(" + aicF.getRanking(model__) + ")"; print(ProtTestFormattedOutput.space(0 - tmp.length(), ' ') + tmp + ProtTestFormattedOutput.space(12 - tmp.length(), ' ')); tmp = ProtTestFormattedOutput.getDecimalString( aiccF.getWeight(model__), 2) + "(" + aiccF.getRanking(model__) + ")"; print(ProtTestFormattedOutput.space(0 - tmp.length(), ' ') + tmp + ProtTestFormattedOutput.space(12 - tmp.length(), ' ')); tmp = ProtTestFormattedOutput.getDecimalString( bicF.getWeight(model__), 2) + "(" + bicF.getRanking(model__) + ")"; print(ProtTestFormattedOutput.space(0 - tmp.length(), ' ') + tmp + ProtTestFormattedOutput.space(12 - tmp.length(), ' ')); tmp = ProtTestFormattedOutput.getDecimalString( dtF.getWeight(model__), 2) + "(" + dtF.getRanking(model__) + ")"; print(ProtTestFormattedOutput.space(0 - tmp.length(), ' ') + tmp + ProtTestFormattedOutput.space(12 - tmp.length(), ' ')); println(""); } if (includeG | includeI | includeIG | includeF) { println(ProtTestFormattedOutput.space(100, '-')); println("Relative importance of"); println("parameters AIC AICc BICc DT"); if (includeG) { print("+G" + ProtTestFormattedOutput.space(13, ' ')); tmp = ProtTestFormattedOutput.getDecimalString( aicF.getAlphaImp(), 2); print(tmp + ProtTestFormattedOutput.space(12 - tmp.length(), ' ')); tmp = ProtTestFormattedOutput.getDecimalString( aiccF.getAlphaImp(), 2); print(tmp + ProtTestFormattedOutput.space(12 - tmp.length(), ' ')); tmp = ProtTestFormattedOutput.getDecimalString( bicF.getAlphaImp(), 2); print(tmp + ProtTestFormattedOutput.space(12 - tmp.length(), ' ')); tmp = ProtTestFormattedOutput.getDecimalString( dtF.getAlphaImp(), 2); print(tmp + ProtTestFormattedOutput.space(12 - tmp.length(), ' ')); println(""); } if (includeI) { print("+I" + ProtTestFormattedOutput.space(13, ' ')); tmp = ProtTestFormattedOutput.getDecimalString( aicF.getInvImp(), 2); print(tmp + ProtTestFormattedOutput.space(12 - tmp.length(), ' ')); tmp = ProtTestFormattedOutput.getDecimalString( aiccF.getInvImp(), 2); print(tmp + ProtTestFormattedOutput.space(12 - tmp.length(), ' ')); tmp = ProtTestFormattedOutput.getDecimalString( bicF.getInvImp(), 2); print(tmp + ProtTestFormattedOutput.space(12 - tmp.length(), ' ')); tmp = ProtTestFormattedOutput.getDecimalString( dtF.getInvImp(), 2); print(tmp + ProtTestFormattedOutput.space(12 - tmp.length(), ' ')); println(""); } if (includeIG) { print("+I+G" + ProtTestFormattedOutput.space(11, ' ')); tmp = ProtTestFormattedOutput.getDecimalString(aicF.getGIImp(), 2); print(tmp + ProtTestFormattedOutput.space(12 - tmp.length(), ' ')); tmp = ProtTestFormattedOutput.getDecimalString( aiccF.getGIImp(), 2); print(tmp + ProtTestFormattedOutput.space(12 - tmp.length(), ' ')); tmp = ProtTestFormattedOutput.getDecimalString( bicF.getGIImp(), 2); print(tmp + ProtTestFormattedOutput.space(12 - tmp.length(), ' ')); tmp = ProtTestFormattedOutput.getDecimalString( dtF.getGIImp(), 2); print(tmp + ProtTestFormattedOutput.space(12 - tmp.length(), ' ')); println(""); } if (includeF) { print("+F" + ProtTestFormattedOutput.space(13, ' ')); tmp = ProtTestFormattedOutput.getDecimalString(aicF.getFImp(), 2); print(tmp + ProtTestFormattedOutput.space(12 - tmp.length(), ' ')); tmp = ProtTestFormattedOutput.getDecimalString( aiccF.getFImp(), 2); print(tmp + ProtTestFormattedOutput.space(12 - tmp.length(), ' ')); tmp = ProtTestFormattedOutput.getDecimalString( bicF.getFImp(), 2); print(tmp + ProtTestFormattedOutput.space(12 - tmp.length(), ' ')); tmp = ProtTestFormattedOutput.getDecimalString( dtF.getFImp(), 2); print(tmp + ProtTestFormattedOutput.space(12 - tmp.length(), ' ')); println(""); } } if (includeG | includeI | includeIG) { println(ProtTestFormattedOutput.space(100, '-')); println("Model-averaged estimate of"); println("parameters AIC AICc BIC DT"); if (includeG) { print("alpha (+G)" + ProtTestFormattedOutput.space(5, ' ')); tmp = ProtTestFormattedOutput.getDecimalString( aicF.getOverallAlpha(), 2); print(tmp + ProtTestFormattedOutput.space(12 - tmp.length(), ' ')); tmp = ProtTestFormattedOutput.getDecimalString( aiccF.getOverallAlpha(), 2); print(tmp + ProtTestFormattedOutput.space(12 - tmp.length(), ' ')); tmp = ProtTestFormattedOutput.getDecimalString( bicF.getOverallAlpha(), 2); print(tmp + ProtTestFormattedOutput.space(12 - tmp.length(), ' ')); tmp = ProtTestFormattedOutput.getDecimalString( dtF.getOverallAlpha(), 2); print(tmp + ProtTestFormattedOutput.space(12 - tmp.length(), ' ')); println(""); } if (includeI) { print("p-inv (+I)" + ProtTestFormattedOutput.space(5, ' ')); tmp = ProtTestFormattedOutput.getDecimalString( aicF.getOverallInv(), 2); print(tmp + ProtTestFormattedOutput.space(12 - tmp.length(), ' ')); tmp = ProtTestFormattedOutput.getDecimalString( aiccF.getOverallInv(), 2); print(tmp + ProtTestFormattedOutput.space(12 - tmp.length(), ' ')); tmp = ProtTestFormattedOutput.getDecimalString( bicF.getOverallInv(), 2); print(tmp + ProtTestFormattedOutput.space(12 - tmp.length(), ' ')); tmp = ProtTestFormattedOutput.getDecimalString( dtF.getOverallInv(), 2); print(tmp + ProtTestFormattedOutput.space(12 - tmp.length(), ' ')); println(""); } if (includeIG) { print("alpha (+I+G)" + ProtTestFormattedOutput.space(3, ' ')); tmp = ProtTestFormattedOutput.getDecimalString( aicF.getOverallAlphaGI(), 2); print(tmp + ProtTestFormattedOutput.space(12 - tmp.length(), ' ')); tmp = ProtTestFormattedOutput.getDecimalString( aiccF.getOverallAlphaGI(), 2); print(tmp + ProtTestFormattedOutput.space(12 - tmp.length(), ' ')); tmp = ProtTestFormattedOutput.getDecimalString( bicF.getOverallAlphaGI(), 2); print(tmp + ProtTestFormattedOutput.space(12 - tmp.length(), ' ')); tmp = ProtTestFormattedOutput.getDecimalString( dtF.getOverallAlphaGI(), 2); print(tmp + ProtTestFormattedOutput.space(12 - tmp.length(), ' ')); println(""); print("p-inv (+I+G)" + ProtTestFormattedOutput.space(3, ' ')); tmp = ProtTestFormattedOutput.getDecimalString( aicF.getOverallInvGI(), 2); print(tmp + ProtTestFormattedOutput.space(12 - tmp.length(), ' ')); tmp = ProtTestFormattedOutput.getDecimalString( aiccF.getOverallInvGI(), 2); print(tmp + ProtTestFormattedOutput.space(12 - tmp.length(), ' ')); tmp = ProtTestFormattedOutput.getDecimalString( bicF.getOverallInvGI(), 2); print(tmp + ProtTestFormattedOutput.space(12 - tmp.length(), ' ')); tmp = ProtTestFormattedOutput.getDecimalString( dtF.getOverallInvGI(), 2); print(tmp + ProtTestFormattedOutput.space(12 - tmp.length(), ' ')); println(""); } } println(ProtTestFormattedOutput.space(100, '-')); println("AIC : Akaike Information Criterion framework."); println("AICc : Second-Order Akaike framework."); println("BIC : Bayesian Information Criterion framework."); println("DT : Decision Theory Criterion framework."); println(ProtTestFormattedOutput.space(100, '-')); println(""); } public static String getDisplayValue(double value, String parameter, boolean existModels) { String toDisplay; if (existModels) { toDisplay = ProtTestFormattedOutput.getDecimalString(value, IMPORTANCE_PRECISSION); } else { toDisplay = "No " + parameter + " models"; } return toDisplay; } /** * Prints the relative importance. * * @param ic * the information criterion */ abstract void printRelativeImportance(InformationCriterion ic); /** * Prints the model averaged estimation. * * @param ic * the information criterion */ abstract void printModelAveragedEstimation(InformationCriterion ic); }