Java tutorial
/* Copyright (C) 2011 Diego Darriba, David Posada 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 3 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.jmodeltest.io; import java.awt.GraphicsEnvironment; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.FileWriter; import java.io.IOException; import java.io.OutputStreamWriter; import java.io.PrintStream; import java.io.UnsupportedEncodingException; import java.nio.channels.FileChannel; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.Map; import org.jfree.chart.ChartUtilities; import pal.tree.Tree; import es.uvigo.darwin.jmodeltest.ApplicationOptions; import es.uvigo.darwin.jmodeltest.ModelTest; import es.uvigo.darwin.jmodeltest.ModelTestConfiguration; import es.uvigo.darwin.jmodeltest.exe.RunPhyml; import es.uvigo.darwin.jmodeltest.model.Model; import es.uvigo.darwin.jmodeltest.selection.InformationCriterion; import es.uvigo.darwin.jmodeltest.tree.TreeSummary; import es.uvigo.darwin.jmodeltest.tree.TreeUtilities; import es.uvigo.darwin.jmodeltest.utilities.Utilities; import freemarker.template.Configuration; import freemarker.template.Template; public abstract class HtmlReporter { private static String[] TEMPLATE_DIRS = { "resources" }; private static String[] TEMPLATE_FILES = { "resources" + File.separator + "style.css", "resources" + File.separator + "homeIcon.gif", "resources" + File.separator + "topIcon.gif", "resources" + File.separator + "logo0.png" }; private static Map<String, Object> datamodel; private static File LOG_DIR; private static File IMAGES_DIR; private static String RESOURCES_DIR; static { String strLogDir = ModelTestConfiguration.getLogDir(); if (!strLogDir.startsWith(File.separator)) { strLogDir = ModelTestConfiguration.PATH + strLogDir; } LOG_DIR = new File(strLogDir); IMAGES_DIR = new File(strLogDir + File.separator + "images"); RESOURCES_DIR = ModelTestConfiguration.PATH + "resources" + File.separator + "template"; } public static void buildReport(ApplicationOptions options, Model models[], File mOutputFile) { buildReport(options, models, mOutputFile, null); } public static void buildReport(ApplicationOptions options, Model models[], File mOutputFile, TreeSummary summary) { File outputFile; if (mOutputFile != null) { if (!(mOutputFile.getName().endsWith(".htm") || mOutputFile.getName().endsWith(".html"))) { outputFile = new File(mOutputFile.getAbsolutePath() + ".html"); } else { outputFile = mOutputFile; } } else { outputFile = new File(LOG_DIR.getPath() + File.separator + options.getInputFile().getName() + ".jmodeltest." + options.getExecutionName() + ".html"); } // Add the values in the datamodel datamodel = new HashMap<String, Object>(); java.util.Date current_time = new java.util.Date(); datamodel.put("date", current_time.toString()); datamodel.put("system", System.getProperty("os.name") + " " + System.getProperty("os.version") + ", arch: " + System.getProperty("os.arch") + ", bits: " + System.getProperty("sun.arch.data.model") + ", numcores: " + Runtime.getRuntime().availableProcessors()); fillInWithOptions(options); fillInWithSortedModels(models); datamodel.put("isTopologiesSummary", summary != null ? new Integer(1) : new Integer(0)); if (summary != null) { fillInWithTopologies(summary, options); } if (options.doAIC) { Collection<Map<String, String>> aicModels = new ArrayList<Map<String, String>>(); Map<String, String> bestAicModel = new HashMap<String, String>(); fillInWIthInformationCriterion(ModelTest.getMyAIC(), aicModels, bestAicModel); datamodel.put("aicModels", aicModels); datamodel.put("bestAicModel", bestAicModel); datamodel.put("aicConfidenceCount", ModelTest.getMyAIC().getConfidenceModels().size()); StringBuffer aicConfModels = new StringBuffer(); for (Model model : ModelTest.getMyAIC().getConfidenceModels()) aicConfModels.append(model.getName() + " "); datamodel.put("aicConfidenceList", aicConfModels.toString()); if (options.writePAUPblock) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); PrintStream ps = new PrintStream(baos); TextOutputStream strOutput = new TextOutputStream(ps); ModelTest.WritePaupBlock(strOutput, "AIC", ModelTest.getMyAIC().getMinModel()); try { String pblock = baos.toString("UTF8"); pblock = pblock.replaceAll("\n", "<br/>"); datamodel.put("aicPaup", pblock); } catch (UnsupportedEncodingException e) { } } buildChart(outputFile, ModelTest.getMyAIC()); datamodel.put("aicEuImagePath", IMAGES_DIR.getName() + File.separator + outputFile.getName() + "_eu_AIC.png"); datamodel.put("aicRfImagePath", IMAGES_DIR.getName() + File.separator + outputFile.getName() + "_rf_AIC.png"); } if (options.doAICc) { Collection<Map<String, String>> aiccModels = new ArrayList<Map<String, String>>(); Map<String, String> bestAiccModel = new HashMap<String, String>(); fillInWIthInformationCriterion(ModelTest.getMyAICc(), aiccModels, bestAiccModel); datamodel.put("aiccModels", aiccModels); datamodel.put("bestAiccModel", bestAiccModel); datamodel.put("aiccConfidenceCount", ModelTest.getMyAICc().getConfidenceModels().size()); StringBuffer aiccConfModels = new StringBuffer(); for (Model model : ModelTest.getMyAICc().getConfidenceModels()) aiccConfModels.append(model.getName() + " "); datamodel.put("aiccConfidenceList", aiccConfModels.toString()); if (options.writePAUPblock) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); PrintStream ps = new PrintStream(baos); TextOutputStream strOutput = new TextOutputStream(ps); ModelTest.WritePaupBlock(strOutput, "AICc", ModelTest.getMyAICc().getMinModel()); try { String pblock = baos.toString("UTF8"); pblock = pblock.replaceAll("\n", "<br/>"); datamodel.put("aiccPaup", pblock); } catch (UnsupportedEncodingException e) { } } buildChart(outputFile, ModelTest.getMyAICc()); datamodel.put("aiccEuImagePath", IMAGES_DIR.getName() + File.separator + outputFile.getName() + "_eu_AICc.png"); datamodel.put("aiccRfImagePath", IMAGES_DIR.getName() + File.separator + outputFile.getName() + "_rf_AICc.png"); } if (options.doBIC) { Collection<Map<String, String>> bicModels = new ArrayList<Map<String, String>>(); Map<String, String> bestBicModel = new HashMap<String, String>(); fillInWIthInformationCriterion(ModelTest.getMyBIC(), bicModels, bestBicModel); datamodel.put("bicModels", bicModels); datamodel.put("bestBicModel", bestBicModel); datamodel.put("bicConfidenceCount", ModelTest.getMyBIC().getConfidenceModels().size()); StringBuffer bicConfModels = new StringBuffer(); for (Model model : ModelTest.getMyBIC().getConfidenceModels()) bicConfModels.append(model.getName() + " "); datamodel.put("bicConfidenceList", bicConfModels.toString()); if (options.writePAUPblock) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); PrintStream ps = new PrintStream(baos); TextOutputStream strOutput = new TextOutputStream(ps); ModelTest.WritePaupBlock(strOutput, "BIC", ModelTest.getMyBIC().getMinModel()); try { String pblock = baos.toString("UTF8"); pblock = pblock.replaceAll("\n", "<br/>"); datamodel.put("bicPaup", pblock); } catch (UnsupportedEncodingException e) { } } buildChart(outputFile, ModelTest.getMyBIC()); datamodel.put("bicEuImagePath", IMAGES_DIR.getName() + File.separator + outputFile.getName() + "_eu_BIC.png"); datamodel.put("bicRfImagePath", IMAGES_DIR.getName() + File.separator + outputFile.getName() + "_rf_BIC.png"); } if (options.doDT) { Collection<Map<String, String>> dtModels = new ArrayList<Map<String, String>>(); Map<String, String> bestDtModel = new HashMap<String, String>(); fillInWIthInformationCriterion(ModelTest.getMyDT(), dtModels, bestDtModel); datamodel.put("dtModels", dtModels); datamodel.put("bestDtModel", bestDtModel); datamodel.put("dtConfidenceCount", ModelTest.getMyDT().getConfidenceModels().size()); StringBuffer dtConfModels = new StringBuffer(); for (Model model : ModelTest.getMyDT().getConfidenceModels()) dtConfModels.append(model.getName() + " "); datamodel.put("dtConfidenceList", dtConfModels.toString()); if (options.writePAUPblock) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); PrintStream ps = new PrintStream(baos); TextOutputStream strOutput = new TextOutputStream(ps); ModelTest.WritePaupBlock(strOutput, "DT", ModelTest.getMyDT().getMinModel()); try { String pblock = baos.toString("UTF8"); pblock = pblock.replaceAll("\n", "<br/>"); datamodel.put("dtPaup", pblock); } catch (UnsupportedEncodingException e) { } } buildChart(outputFile, ModelTest.getMyDT()); datamodel.put("dtEuImagePath", IMAGES_DIR.getName() + File.separator + outputFile.getName() + "_eu_DT.png"); datamodel.put("dtRfImagePath", IMAGES_DIR.getName() + File.separator + outputFile.getName() + "_rf_DT.png"); } datamodel.put("doAICAveragedPhylogeny", ModelTest.getConsensusAIC() != null ? new Integer(1) : new Integer(0)); if (ModelTest.getConsensusAIC() != null) { datamodel.put("aicConsensusTree", TreeUtilities.toNewick(ModelTest.getConsensusAIC().getConsensus(), true, true, true)); datamodel.put("consensusType", ModelTest.getConsensusAIC().getConsensusType()); } datamodel.put("doAICcAveragedPhylogeny", ModelTest.getConsensusAICc() != null ? new Integer(1) : new Integer(0)); if (ModelTest.getConsensusAICc() != null) { datamodel.put("aiccConsensusTree", TreeUtilities.toNewick(ModelTest.getConsensusAICc().getConsensus(), true, true, true)); datamodel.put("consensusType", ModelTest.getConsensusAICc().getConsensusType()); } datamodel.put("doBICAveragedPhylogeny", ModelTest.getConsensusBIC() != null ? new Integer(1) : new Integer(0)); if (ModelTest.getConsensusBIC() != null) { datamodel.put("bicConsensusTree", TreeUtilities.toNewick(ModelTest.getConsensusBIC().getConsensus(), true, true, true)); datamodel.put("consensusType", ModelTest.getConsensusBIC().getConsensusType()); } datamodel.put("doDTAveragedPhylogeny", ModelTest.getConsensusDT() != null ? new Integer(1) : new Integer(0)); if (ModelTest.getConsensusDT() != null) { datamodel.put("dtConsensusTree", TreeUtilities.toNewick(ModelTest.getConsensusDT().getConsensus(), true, true, true)); datamodel.put("consensusType", ModelTest.getConsensusDT().getConsensusType()); } // Process the template using FreeMarker try { freemarkerDo(datamodel, "index.html", outputFile); } catch (Exception e) { System.out.println("There was a problem building the html log files: " + e.getLocalizedMessage()); } } // Process a template using FreeMarker and print the results static void freemarkerDo(Map<String, Object> datamodel, String template, File outputFile) throws Exception { if (!LOG_DIR.exists() || !LOG_DIR.isDirectory()) { LOG_DIR.delete(); LOG_DIR.mkdir(); } if (!IMAGES_DIR.exists() || !IMAGES_DIR.isDirectory()) { IMAGES_DIR.delete(); IMAGES_DIR.mkdir(); } // Check auxiliary files for (String file : TEMPLATE_DIRS) { File auxDir = new File(LOG_DIR.getPath() + File.separator + file); if (!auxDir.exists()) { auxDir.mkdirs(); } } for (String file : TEMPLATE_FILES) { File auxFile = new File(LOG_DIR.getPath() + File.separator + file); if (!auxFile.exists()) { File inFile = new File(RESOURCES_DIR + File.separator + file); if (inFile.exists()) { copyFile(inFile, auxFile); } } } Configuration cfg = new Configuration(); cfg.setDirectoryForTemplateLoading(new File(RESOURCES_DIR)); Template tpl = cfg.getTemplate(template); OutputStreamWriter output = new FileWriter(outputFile); tpl.process(datamodel, output); } private static void fillInWithOptions(ApplicationOptions options) { StringBuffer arguments = new StringBuffer(); for (String argument : ModelTest.arguments) arguments.append(argument + " "); datamodel.put("arguments", arguments); datamodel.put("alignName", options.getInputFile()); datamodel.put("numTaxa", options.getNumTaxa()); datamodel.put("seqLength", options.getNumSites()); datamodel.put("phymlVersion", RunPhyml.PHYML_VERSION); datamodel.put("phymlBinary", Utilities.getBinaryVersion()); datamodel.put("candidateModels", ModelTest.getCandidateModels().length); if (options.getSubstTypeCode() == 0) datamodel.put("substSchemes", "3"); else if (options.getSubstTypeCode() == 1) datamodel.put("substSchemes", "5"); else if (options.getSubstTypeCode() == 2) datamodel.put("substSchemes", "7"); else datamodel.put("substSchemes", "11"); datamodel.put("includeF", options.doF ? new Integer(1) : new Integer(0)); datamodel.put("includeG", options.doG ? new Integer(1) : new Integer(0)); datamodel.put("includeI", options.doI ? new Integer(1) : new Integer(0)); datamodel.put("isAIC", options.doAIC ? new Integer(1) : new Integer(0)); datamodel.put("isAICc", options.doAICc ? new Integer(1) : new Integer(0)); datamodel.put("isBIC", options.doBIC ? new Integer(1) : new Integer(0)); datamodel.put("isDT", options.doDT ? new Integer(1) : new Integer(0)); datamodel.put("numCat", options.numGammaCat); datamodel.put("isPAUP", options.writePAUPblock ? new Integer(1) : new Integer(0)); StringBuffer optimizedParameters = new StringBuffer("Substitution parameters "); if (options.countBLasParameters) optimizedParameters.append("+ " + options.getNumBranches() + " branch lengths "); if (options.optimizeMLTopology) optimizedParameters.append("+ topology"); datamodel.put("freeParameters", optimizedParameters.toString()); datamodel.put("userTreeDef", options.userTopologyExists ? new Integer(1) : new Integer(0)); if (options.fixedTopology) datamodel.put("baseTree", "Fixed BioNJ"); else if (options.optimizeMLTopology) datamodel.put("baseTree", "Maximum Likelihood"); else if (options.userTopologyExists) { datamodel.put("baseTree", "Fixed user tree topology"); datamodel.put("userTreeFilename", options.getInputTreeFile().getName()); datamodel.put("userTree", options.getUserTree()); } else datamodel.put("baseTree", "BioNJ"); switch (options.treeSearchOperations) { case NNI: datamodel.put("searchAlgorithm", "NNI"); break; case SPR: datamodel.put("searchAlgorithm", "SPR"); break; case BEST: datamodel.put("searchAlgorithm", "Best of {NNI, SPR}"); break; } datamodel.put("confidenceInterval", String.format(Locale.ENGLISH, "%5.2f", options.confidenceInterval * 100)); } private static void fillInWithSortedModels(Model[] models) { Collection<Map<String, String>> sortedModels = new ArrayList<Map<String, String>>(); int index = 1; for (Model model : models) { Map<String, String> modelMap = new HashMap<String, String>(); modelMap.put("index", String.valueOf(index++)); modelMap.put("name", model.getName()); modelMap.put("partition", model.getPartition()); modelMap.put("lnl", String.format(Locale.ENGLISH, "%5.4f", model.getLnL())); modelMap.put("k", String.valueOf(model.getK())); modelMap.put("fA", model.ispF() ? String.format(Locale.ENGLISH, "%5.4f", model.getfA()) : "-"); modelMap.put("fC", model.ispF() ? String.format(Locale.ENGLISH, "%5.4f", model.getfC()) : "-"); modelMap.put("fG", model.ispF() ? String.format(Locale.ENGLISH, "%5.4f", model.getfG()) : "-"); modelMap.put("fT", model.ispF() ? String.format(Locale.ENGLISH, "%5.4f", model.getfT()) : "-"); modelMap.put("titv", model.ispT() ? String.format(Locale.ENGLISH, "%5.4f", model.getTitv()) : "-"); modelMap.put("rA", model.ispR() ? String.format(Locale.ENGLISH, "%5.4f", model.getRa()) : "-"); modelMap.put("rB", model.ispR() ? String.format(Locale.ENGLISH, "%5.4f", model.getRb()) : "-"); modelMap.put("rC", model.ispR() ? String.format(Locale.ENGLISH, "%5.4f", model.getRc()) : "-"); modelMap.put("rD", model.ispR() ? String.format(Locale.ENGLISH, "%5.4f", model.getRd()) : "-"); modelMap.put("rE", model.ispR() ? String.format(Locale.ENGLISH, "%5.4f", model.getRe()) : "-"); modelMap.put("rF", model.ispR() ? String.format(Locale.ENGLISH, "%5.4f", model.getRf()) : "-"); modelMap.put("pInv", model.ispI() ? String.format(Locale.ENGLISH, "%5.4f", model.getPinv()) : "-"); modelMap.put("shape", model.ispG() ? String.format(Locale.ENGLISH, "%6.4f", model.getShape()) : "-"); modelMap.put("tree", model.getTreeString()); sortedModels.add(modelMap); } datamodel.put("sortedModels", sortedModels); } private static void fillInWithTopologies(TreeSummary summary, ApplicationOptions options) { datamodel.put("numberOfTopologies", summary.getNumberOfTopologies()); Collection<Map<String, String>> sortedTopologies = new ArrayList<Map<String, String>>(); for (int index = 0; index < summary.getNumberOfTopologies(); index++) { Map<String, String> topologyMap = new HashMap<String, String>(); topologyMap.put("index", String.valueOf(index)); Tree topology = summary.getTopology(index); topologyMap.put("tree", TreeUtilities.toNewick(topology, false, false, false)); List<Model> models = summary.getModelsByTopology(index); StringBuilder sb = new StringBuilder(); for (Model model : models) { sb.append(model.getName() + " "); } topologyMap.put("models", sb.toString()); topologyMap.put("models", sb.toString()); if (options.doAIC) { topologyMap.put("aicRank", String.valueOf(summary.aicIndexOf(topology))); topologyMap.put("aicRF", String.valueOf(summary.aicRfOf(topology))); topologyMap.put("aicAvgDistance", Utilities.format(summary.aicAvgDistance(topology), 6, 4, true)); topologyMap.put("aicVarDistance", Utilities.format(summary.aicVarDistance(topology), 6, 4, true)); topologyMap.put("aicWeight", Utilities.format(summary.aicWeight(topology), 6, 4, false)); } if (options.doAICc) { topologyMap.put("aiccRank", String.valueOf(summary.aiccIndexOf(topology))); topologyMap.put("aiccRF", String.valueOf(summary.aiccRfOf(topology))); topologyMap.put("aiccAvgDistance", Utilities.format(summary.aiccAvgDistance(topology), 6, 4, true)); topologyMap.put("aiccVarDistance", Utilities.format(summary.aiccVarDistance(topology), 6, 4, true)); topologyMap.put("aiccWeight", Utilities.format(summary.aiccWeight(topology), 6, 4, false)); } if (options.doBIC) { topologyMap.put("bicRank", String.valueOf(summary.bicIndexOf(topology))); topologyMap.put("bicRF", String.valueOf(summary.bicRfOf(topology))); topologyMap.put("bicAvgDistance", Utilities.format(summary.bicAvgDistance(topology), 6, 4, true)); topologyMap.put("bicVarDistance", Utilities.format(summary.bicVarDistance(topology), 6, 4, true)); topologyMap.put("bicWeight", Utilities.format(summary.bicWeight(topology), 6, 4, false)); } if (options.doDT) { topologyMap.put("dtRank", String.valueOf(summary.dtIndexOf(topology))); topologyMap.put("dtRF", String.valueOf(summary.dtRfOf(topology))); topologyMap.put("dtAvgDistance", Utilities.format(summary.dtAvgDistance(topology), 6, 4, true)); topologyMap.put("dtVarDistance", Utilities.format(summary.dtVarDistance(topology), 6, 4, true)); topologyMap.put("dtWeight", Utilities.format(summary.dtWeight(topology), 6, 4, false)); } sortedTopologies.add(topologyMap); } datamodel.put("sortedTopologies", sortedTopologies); } private static void fillInWIthInformationCriterion(InformationCriterion ic, Collection<Map<String, String>> sortedModels, Map<String, String> bestModel) { Model model = ic.getModel(0); bestModel.put("index", String.valueOf(1)); bestModel.put("name", model.getName()); bestModel.put("partition", model.getPartition()); bestModel.put("lnl", String.format(Locale.ENGLISH, "%5.4f", model.getLnL())); bestModel.put("k", String.valueOf(model.getK())); bestModel.put("fA", model.ispF() ? String.format(Locale.ENGLISH, "%5.4f", model.getfA()) : "-"); bestModel.put("fC", model.ispF() ? String.format(Locale.ENGLISH, "%5.4f", model.getfC()) : "-"); bestModel.put("fG", model.ispF() ? String.format(Locale.ENGLISH, "%5.4f", model.getfG()) : "-"); bestModel.put("fT", model.ispF() ? String.format(Locale.ENGLISH, "%5.4f", model.getfT()) : "-"); bestModel.put("titv", model.ispT() ? String.format(Locale.ENGLISH, "%5.4f", model.getTitv()) : "-"); bestModel.put("rA", model.ispR() ? String.format(Locale.ENGLISH, "%5.4f", model.getRa()) : "-"); bestModel.put("rB", model.ispR() ? String.format(Locale.ENGLISH, "%5.4f", model.getRb()) : "-"); bestModel.put("rC", model.ispR() ? String.format(Locale.ENGLISH, "%5.4f", model.getRc()) : "-"); bestModel.put("rD", model.ispR() ? String.format(Locale.ENGLISH, "%5.4f", model.getRd()) : "-"); bestModel.put("rE", model.ispR() ? String.format(Locale.ENGLISH, "%5.4f", model.getRe()) : "-"); bestModel.put("rF", model.ispR() ? String.format(Locale.ENGLISH, "%5.4f", model.getRf()) : "-"); bestModel.put("pInv", model.ispI() ? String.format(Locale.ENGLISH, "%5.4f", model.getPinv()) : "-"); bestModel.put("shape", model.ispG() ? String.format(Locale.ENGLISH, "%6.4f", model.getShape()) : "-"); bestModel.put("value", String.format(Locale.ENGLISH, "%5.4f", ic.getValue(model))); bestModel.put("delta", String.format(Locale.ENGLISH, "%5.4f", ic.getDelta(model))); bestModel.put("weight", String.format(Locale.ENGLISH, "%5.4f", ic.getWeight(model))); bestModel.put("tree", model.getTreeString()); bestModel.put("cumWeight", String.format(Locale.ENGLISH, "%5.4f", ic.getCumWeight(model))); sortedModels.add(bestModel); for (int i = 1; i < ic.getNumModels(); i++) { model = ic.getModel(i); Map<String, String> modelMap = new HashMap<String, String>(); modelMap.put("index", String.valueOf(i + 1)); modelMap.put("name", model.getName()); modelMap.put("partition", model.getPartition()); modelMap.put("lnl", String.format(Locale.ENGLISH, "%5.4f", model.getLnL())); modelMap.put("k", String.valueOf(model.getK())); modelMap.put("value", String.format(Locale.ENGLISH, "%5.4f", ic.getValue(model))); modelMap.put("delta", String.format(Locale.ENGLISH, "%5.4f", ic.getDelta(model))); modelMap.put("weight", String.format(Locale.ENGLISH, "%5.4f", ic.getWeight(model))); modelMap.put("cumWeight", String.format(Locale.ENGLISH, "%5.4f", ic.getCumWeight(model))); modelMap.put("tree", model.getTreeString()); sortedModels.add(modelMap); } } @SuppressWarnings("resource") public static void copyFile(File in, File out) throws IOException { FileChannel inChannel = new FileInputStream(in).getChannel(); FileChannel outChannel = new FileOutputStream(out).getChannel(); try { inChannel.transferTo(0, inChannel.size(), outChannel); } catch (IOException e) { throw e; } finally { if (inChannel != null) inChannel.close(); if (outChannel != null) outChannel.close(); } } private static void buildChart(File mOutputFile, InformationCriterion ic) { /* This line prevents Swing exceptions on headless environments */ if (GraphicsEnvironment.isHeadless()) { return; } int width = 500; int height = 300; try { if (!IMAGES_DIR.exists()) { IMAGES_DIR.mkdir(); } ChartUtilities.saveChartAsPNG( new File(IMAGES_DIR.getPath() + File.separator + mOutputFile.getName() + "_rf_" + ic + ".png"), RFHistogram.buildRFHistogram(ic), width, height); ChartUtilities.saveChartAsPNG( new File(IMAGES_DIR.getPath() + File.separator + mOutputFile.getName() + "_eu_" + ic + ".png"), RFHistogram.buildEuclideanHistogram(ic), width, height); } catch (IOException e) { // e.printStackTrace(); } } }