/*
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.facade;
import static es.uvigo.darwin.prottest.global.ApplicationGlobals.*;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Properties;
import pal.alignment.Alignment;
import pal.tree.Tree;
import es.uvigo.darwin.prottest.exe.RunEstimator;
import es.uvigo.darwin.prottest.exe.util.TemporaryFileManager;
import es.uvigo.darwin.prottest.facade.util.ProtTestParameterVO;
import es.uvigo.darwin.prottest.facade.util.SelectionChunk;
import es.uvigo.darwin.prottest.global.options.ApplicationOptions;
import es.uvigo.darwin.prottest.model.Model;
import es.uvigo.darwin.prottest.observer.ObservableModelUpdater;
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.selection.LNL;
import es.uvigo.darwin.prottest.selection.printer.AminoAcidPrintFramework;
import es.uvigo.darwin.prottest.selection.printer.PrintFramework;
import es.uvigo.darwin.prottest.util.ProtTestAlignment;
import es.uvigo.darwin.prottest.util.collection.ModelCollection;
import es.uvigo.darwin.prottest.util.collection.SingleModelCollection;
import es.uvigo.darwin.prottest.util.exception.AlignmentParseException;
import es.uvigo.darwin.prottest.util.exception.ProtTestInternalException;
import es.uvigo.darwin.prottest.util.exception.TreeFormatException;
import es.uvigo.darwin.prottest.util.factory.ProtTestFactory;
import es.uvigo.darwin.prottest.util.fileio.AlignmentReader;
import es.uvigo.darwin.prottest.util.logging.ProtTestLogger;
import java.io.StringWriter;
import static es.uvigo.darwin.prottest.util.logging.ProtTestLogger.*;
/**
* An abstract implementation of the ProtTest facade.
*/
public abstract class ProtTestFacadeImpl
extends ObservableModelUpdater
implements ProtTestFacade {
// /** The options. */
// protected ApplicationOptions options;
/** The Constant AIC. */
public static final int AIC = SelectionChunk.AIC;
/** The Constant BIC. */
public static final int BIC = SelectionChunk.BIC;
/** The Constant AICC. */
public static final int AICC = SelectionChunk.AICC;
/** The Constant DT. */
public static final int DT = SelectionChunk.DT;
/** The Constant LK. */
public static final int LNL = SelectionChunk.LNL;
/**
* Instantiates a new prot test facade implementation.
*/
public ProtTestFacadeImpl() {
}
/* (non-Javadoc)
* @see es.uvigo.darwin.prottest.facade.ProtTestFacade#printModelsSorted(es.uvigo.darwin.prottest.selection.InformationCriterion, java.io.PrintWriter)
*/
public void printModelsSorted(InformationCriterion informationCriterion) {
PrintFramework printFramework = new AminoAcidPrintFramework();
printFramework.printModelsSorted(informationCriterion);
}
/* (non-Javadoc)
* @see es.uvigo.darwin.prottest.facade.ProtTestFacade#readAlignment(java.io.PrintWriter, java.lang.String, boolean)
*/
public Alignment readAlignment(String filename, boolean debug)
throws AlignmentParseException, FileNotFoundException, IOException {
StringWriter sw = new StringWriter();
Alignment alignment = AlignmentReader.readAlignment(new PrintWriter(sw), filename, debug);
sw.flush();
ProtTestLogger.getDefaultLogger().infoln(sw.toString());
return alignment;
}
/* (non-Javadoc)
* @see es.uvigo.darwin.prottest.facade.ProtTestFacade#readTree(java.io.PrintWriter, java.lang.String, boolean)
*/
public Tree readTree(PrintWriter out, String filename, boolean debug)
throws TreeFormatException, FileNotFoundException, IOException {
return AlignmentReader.readTree(out, filename, debug);
}
/* (non-Javadoc)
* @see es.uvigo.darwin.prottest.facade.ProtTestFacade#update(es.uvigo.darwin.prottest.observer.Observable, java.lang.Object)
*/
public void update(ObservableModelUpdater o, Model model, ApplicationOptions options) {
notifyObservers(model, options);
}
/* (non-Javadoc)
* @see es.uvigo.darwin.prottest.facade.ProtTestFacade#computeInformationCriterion(pal.alignment.Alignment, es.uvigo.darwin.prottest.model.Model[], int, int, double)
*/
public SelectionChunk computeInformationCriterion(Alignment alignment, Model[] models,
int criterion,
double confidenceInterval) {
ModelCollection modelCollection = new SingleModelCollection(models, alignment);
InformationCriterion informationCriterion;
double calculatedSampleSize = ProtTestAlignment.calculateSampleSize(alignment);
switch (criterion) {
case AIC:
informationCriterion = new AIC(modelCollection, confidenceInterval, calculatedSampleSize);
break;
case BIC:
informationCriterion = new BIC(modelCollection, confidenceInterval, calculatedSampleSize);
break;
case AICC:
informationCriterion = new AICc(modelCollection, confidenceInterval, calculatedSampleSize);
break;
case DT:
informationCriterion = new DT(modelCollection, confidenceInterval, calculatedSampleSize);
break;
case LNL:
informationCriterion = new LNL(modelCollection, confidenceInterval, calculatedSampleSize);
break;
default:
throw new ProtTestInternalException("Unexistent information criterion");
}
return new SelectionChunk(informationCriterion);
}
/* (non-Javadoc)
* @see es.uvigo.darwin.prottest.facade.ProtTestFacade#getNumberOfThreads()
*/
public int getNumberOfThreads() {
// single thread (default)
return 1;
}
/* (non-Javadoc)
* @see es.uvigo.darwin.prottest.facade.ProtTestFacade#setNumberOfThreads(int)
*/
public void setNumberOfThreads(int numThreads) {
throw new ProtTestInternalException("No threading support");
}
protected Tree calculateBionjJTT(ApplicationOptions options) {
Model jttModel = ProtTestFactory.getInstance().createModel("JTT", options.getDistribution("Uniform"), new Properties(),
options.getAlignment(), null, 0);
TemporaryFileManager.synchronize(
options.getAlignment(), null, 1);
RunEstimator treeEstimator = ProtTestFactory.getInstance().createRunEstimator(options, jttModel);
treeEstimator.run();
return jttModel.getTree();
}
/* (non-Javadoc)
* @see es.uvigo.darwin.prottest.facade.ProtTestFacade#startAnalysis(es.uvigo.darwin.prottest.util.printer.ProtTestPrinter)
*/
public Model[] startAnalysis(ApplicationOptions options) {
if (options.getTreeFile() == null) {
// this way, the starting topology is the same for every model
if (options.strategyMode == OPTIMIZE_FIXED_BIONJ) {
// use JTT BIONJ Tree
Tree jttTree = calculateBionjJTT(options);
options.setTree(jttTree);
}
}
TemporaryFileManager.synchronize(options.getAlignment(), options.getTree(),
getNumberOfThreads());
Model[] models = analyze(options);
return models;
}
/**
* Analyze.
*
* @param options the execution options
*
* @return the set of optimized models
*/
public abstract Model[] analyze(ApplicationOptions options);
/* (non-Javadoc)
* @see es.uvigo.darwin.prottest.facade.ProtTestFacade#configure(es.uvigo.darwin.prottest.facade.util.ProtTestParameterVO)
*/
public ApplicationOptions configure(ProtTestParameterVO parameters)
throws IOException, AlignmentParseException, ProtTestInternalException {
ApplicationOptions options = new ApplicationOptions();
if (parameters.getAlignment() != null) {
options.setAlignment(parameters.getAlignment());
options.setAlignmentFilename(parameters.getAlignmentFilePath());
} else {
options.setAlignment(parameters.getAlignmentFilePath());
}
options.setNumberOfCategories(parameters.ncat);
for (String matrix : parameters.getMatrices()) {
options.addMatrix(matrix);
}
for (String distribution : parameters.getDistributions()) {
options.addDistribution(distribution);
}
options.setPlusF(parameters.isPlusF());
options.setTreeFile(parameters.getTreeFilePath());
options.setStrategyMode(parameters.getStrategyMode());
return options;
}
protected void print(String message) {
info(message, ProtTestFacade.class);
}
protected void println(String message) {
infoln(message, ProtTestFacade.class);
}
protected void error(String message) {
severe(message, ProtTestFacade.class);
}
protected void errorln(String message) {
severeln(message, ProtTestFacade.class);
}
protected void warnln(String message) {
warningln(message, ProtTestFacade.class);
}
protected void verbose(String message) {
fine(message, ProtTestFacade.class);
}
protected void verboseln(String message) {
fineln(message, ProtTestFacade.class);
}
protected void flush() {
ProtTestLogger.flush(ProtTestFacade.class);
}
}